diff options
Diffstat (limited to 'bundles/org.eclipse.compare/plugins')
304 files changed, 0 insertions, 48465 deletions
diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/.classpath b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/.classpath deleted file mode 100644 index 2fbb7a23e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/.classpath +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/> - <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> - <classpathentry kind="src" path="src"/> - <classpathentry kind="output" path="bin"/> -</classpath> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/.project b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/.project deleted file mode 100644 index fa1288658..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/.project +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>org.eclipse.compare.core</name> - <comment></comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.pde.ManifestBuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.pde.SchemaBuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.pde.PluginNature</nature> - <nature>org.eclipse.jdt.core.javanature</nature> - <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature> - </natures> -</projectDescription> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 54f4753fa..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,20 +0,0 @@ -#Thu Feb 19 14:39:20 CET 2009 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 -org.eclipse.jdt.core.compiler.compliance=1.4 -org.eclipse.jdt.core.compiler.doc.comment.support=enabled -org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning -org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error -org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled -org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled -org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled -org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected -org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore -org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled -org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public -org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag -org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning -org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled -org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected -org.eclipse.jdt.core.compiler.source=1.3 diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/META-INF/MANIFEST.MF deleted file mode 100644 index 9a8a60651..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/META-INF/MANIFEST.MF +++ /dev/null @@ -1,17 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %pluginName -Bundle-SymbolicName: org.eclipse.compare.core -Bundle-Version: 3.5.200.qualifier -Bundle-Activator: org.eclipse.compare.internal.core.ComparePlugin -Bundle-Vendor: %providerName -Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)" -Bundle-RequiredExecutionEnvironment: J2SE-1.4 -Bundle-ActivationPolicy: lazy -Export-Package: org.eclipse.compare.internal.core;x-internal:=true, - org.eclipse.compare.internal.core.patch;x-internal:=true, - org.eclipse.compare.patch, - org.eclipse.compare.rangedifferencer -Import-Package: com.ibm.icu.text;version="3.6.1", - com.ibm.icu.util;version="3.6.1" -Bundle-Localization: plugin diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/about.html b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/about.html deleted file mode 100644 index 460233046..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/about.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> -<title>About</title> -</head> -<body lang="EN-US"> -<h2>About This Content</h2> - -<p>June 2, 2006</p> -<h3>License</h3> - -<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise -indicated below, the Content is provided to you under the terms and conditions of the -Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available -at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>. -For purposes of the EPL, "Program" will mean the Content.</p> - -<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is -being redistributed by another party ("Redistributor") and different terms and conditions may -apply to your use of any object code in the Content. Check the Redistributor's license that was -provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise -indicated below, the terms and conditions of the EPL still apply to any source code in the Content -and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p> - -</body> -</html>
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/build.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/build.properties deleted file mode 100644 index e70ba7acf..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/build.properties +++ /dev/null @@ -1,17 +0,0 @@ -############################################################################### -# Copyright (c) 2008 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 -############################################################################### -source.. = src/ -output.. = bin/ -bin.includes = META-INF/,\ - .,\ - plugin.properties,\ - about.html -src.includes = about.html diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/plugin.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/plugin.properties deleted file mode 100644 index 30426cc51..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/plugin.properties +++ /dev/null @@ -1,15 +0,0 @@ -############################################################################### -# Copyright (c) 2008, 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 -############################################################################### -# -# Resource strings for Compare Core Plug-in -# -pluginName = Core Compare Support -providerName = Eclipse.org
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/ComparePlugin.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/ComparePlugin.java deleted file mode 100644 index fb52f0184..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/ComparePlugin.java +++ /dev/null @@ -1,81 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 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.core; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Plugin; -import org.eclipse.core.runtime.Status; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - */ -public class ComparePlugin extends Plugin { - - // The plug-in ID - public static final String PLUGIN_ID = "org.eclipse.compare.core"; //$NON-NLS-1$ - - // The shared instance - private static ComparePlugin plugin; - - private boolean cappingDisabled; - - /** - * The constructor - */ - public ComparePlugin() { - // nothing to do - } - - /* - * (non-Javadoc) - * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) - */ - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - } - - /* - * (non-Javadoc) - * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) - */ - public void stop(BundleContext context) throws Exception { - plugin = null; - super.stop(context); - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static ComparePlugin getDefault() { - return plugin; - } - - public static void log(Throwable e) { - log(new Status(IStatus.ERROR, PLUGIN_ID, 0, Messages.Activator_1, e)); - } - - public static void log(IStatus status) { - getDefault().getLog().log(status); - } - - public void setCappingDisabled(boolean disable) { - this.cappingDisabled = disable; - } - - public boolean isCappingDisabled() { - return this.cappingDisabled; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/LCS.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/LCS.java deleted file mode 100644 index a56285ccb..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/LCS.java +++ /dev/null @@ -1,461 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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.core; - -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.SubMonitor; - - -/* Used to determine the change set responsible for each line */ -public abstract class LCS { - public static final double TOO_LONG = 10000000.0; // the value of N*M when - // to start binding the - // run time - - private static final double POW_LIMIT = 1.5; // limit the time to - // D^POW_LIMIT - - private int max_differences; // the maximum number of differences from - // each end to consider - - private int length; - - /** - * Myers' algorithm for longest common subsequence. O((M + N)D) worst case - * time, O(M + N + D^2) expected time, O(M + N) space - * (http://citeseer.ist.psu.edu/myers86ond.html) - * - * Note: Beyond implementing the algorithm as described in the paper I have - * added diagonal range compression which helps when finding the LCS of a - * very long and a very short sequence, also bound the running time to (N + - * M)^1.5 when both sequences are very long. - * - * After this method is called, the longest common subsequence is available - * by calling getResult() where result[0] is composed of - * entries from l1 and result[1] is composed of entries from l2 - * @param subMonitor - */ - public void longestCommonSubsequence(SubMonitor subMonitor) { - int length1 = getLength1(); - int length2 = getLength2(); - if (length1 == 0 || length2 == 0) { - this.length = 0; - return; - } - - this.max_differences = (length1 + length2 + 1) / 2; // ceil((N+M)/2) - if (!isCappingDisabled() && (double) length1 * (double) length2 > TOO_LONG) { - // limit complexity to D^POW_LIMIT for long sequences - this.max_differences = (int) Math.pow(this.max_differences, POW_LIMIT - 1.0); - } - - initializeLcs(length1); - - subMonitor.beginTask(null, length1); - - /* - * The common prefixes and suffixes are always part of some LCS, include - * them now to reduce our search space - */ - int forwardBound; - int max = Math.min(length1, length2); - for (forwardBound = 0; forwardBound < max - && isRangeEqual(forwardBound, forwardBound); forwardBound++) { - setLcs(forwardBound, forwardBound); - worked(subMonitor, 1); - } - - int backBoundL1 = length1 - 1; - int backBoundL2 = length2 - 1; - - while (backBoundL1 >= forwardBound && backBoundL2 >= forwardBound - && isRangeEqual(backBoundL1, backBoundL2)) { - setLcs(backBoundL1, backBoundL2); - backBoundL1--; - backBoundL2--; - worked(subMonitor, 1); - } - - this.length = forwardBound - + length1 - - backBoundL1 - - 1 - + lcs_rec(forwardBound, backBoundL1, forwardBound, - backBoundL2, new int[2][length1 + length2 + 1], - new int[3], subMonitor); - - } - - private boolean isCappingDisabled() { - return ComparePlugin.getDefault().isCappingDisabled(); - } - - /** - * The recursive helper function for Myers' LCS. Computes the LCS of - * l1[bottoml1 .. topl1] and l2[bottoml2 .. topl2] fills in the appropriate - * location in lcs and returns the length - * - * @param l1 The 1st sequence - * @param bottoml1 Index in the 1st sequence to start from (inclusive) - * @param topl1 Index in the 1st sequence to end on (inclusive) - * @param l2 The 2nd sequence - * @param bottoml2 Index in the 2nd sequence to start from (inclusive) - * @param topl2 Index in the 2nd sequence to end on (inclusive) - * @param V should be allocated as int[2][l1.length + l2.length + 1], used - * to store furthest reaching D-paths - * @param snake should be allocated as int[3], used to store the beginning - * x, y coordinates and the length of the latest snake traversed - * @param subMonitor - * @param lcs should be allocated as TextLine[2][l1.length], used to store - * the common points found to be part of the LCS where lcs[0] - * references lines of l1 and lcs[1] references lines of l2. - * - * @return the length of the LCS - */ - private int lcs_rec( - int bottoml1, int topl1, - int bottoml2, int topl2, - int[][] V, int[] snake, SubMonitor subMonitor) { - - // check that both sequences are non-empty - if (bottoml1 > topl1 || bottoml2 > topl2) { - return 0; - } - - int d = find_middle_snake(bottoml1, topl1, bottoml2, topl2, V, snake, subMonitor); - // System.out.println(snake[0] + " " + snake[1] + " " + snake[2]); - - // need to store these so we don't lose them when they're overwritten by - // the recursion - int len = snake[2]; - int startx = snake[0]; - int starty = snake[1]; - - // the middle snake is part of the LCS, store it - for (int i = 0; i < len; i++) { - setLcs(startx + i, starty + i); - worked(subMonitor, 1); - } - - if (d > 1) { - return len - + lcs_rec(bottoml1, startx - 1, bottoml2, starty - 1, V, snake, subMonitor) - + lcs_rec(startx + len, topl1, starty + len, topl2, V, snake, subMonitor); - } else if (d == 1) { - /* - * In this case the sequences differ by exactly 1 line. We have - * already saved all the lines after the difference in the for loop - * above, now we need to save all the lines before the difference. - */ - int max = Math.min(startx - bottoml1, starty - bottoml2); - for (int i = 0; i < max; i++) { - setLcs(bottoml1 + i, bottoml2 + i); - worked(subMonitor, 1); - } - return max + len; - } - - return len; - } - - private void worked(SubMonitor subMonitor, int work) { - if (subMonitor.isCanceled()) - throw new OperationCanceledException(); - subMonitor.worked(work); - } - - /** - * Helper function for Myers' LCS algorithm to find the middle snake for - * l1[bottoml1..topl1] and l2[bottoml2..topl2] The x, y coodrdinates of the - * start of the middle snake are saved in snake[0], snake[1] respectively - * and the length of the snake is saved in s[2]. - * - * @param l1 The 1st sequence - * @param bottoml1 Index in the 1st sequence to start from (inclusive) - * @param topl1 Index in the 1st sequence to end on (inclusive) - * @param l2 The 2nd sequence - * @param bottoml2 Index in the 2nd sequence to start from (inclusive) - * @param topl2 Index in the 2nd sequence to end on (inclusive) - * @param V should be allocated as int[2][l1.length + l2.length + 1], used - * to store furthest reaching D-paths - * @param snake should be allocated as int[3], used to store the beginning - * x, y coordinates and the length of the middle snake - * @subMonitor subMonitor - * - * @return The number of differences (SES) between l1[bottoml1..topl1] and - * l2[bottoml2..topl2] - */ - private int find_middle_snake( - int bottoml1, int topl1, - int bottoml2, int topl2, - int[][] V, int[] snake, - SubMonitor subMonitor) { - int N = topl1 - bottoml1 + 1; - int M = topl2 - bottoml2 + 1; - // System.out.println("N: " + N + " M: " + M + " bottom: " + bottoml1 + - // ", " + - // bottoml2 + " top: " + topl1 + ", " + topl2); - int delta = N - M; - boolean isEven; - if ((delta & 1) == 1) { - isEven = false; - } else { - isEven = true; - } - - int limit = Math.min(this.max_differences, (N + M + 1) / 2); // ceil((N+M)/2) - - int value_to_add_forward; // a 0 or 1 that we add to the start offset - // to make it odd/even - if ((M & 1) == 1) { - value_to_add_forward = 1; - } else { - value_to_add_forward = 0; - } - - int value_to_add_backward; - if ((N & 1) == 1) { - value_to_add_backward = 1; - } else { - value_to_add_backward = 0; - } - - int start_forward = -M; - int end_forward = N; - int start_backward = -N; - int end_backward = M; - - V[0][limit + 1] = 0; - V[1][limit - 1] = N; - for (int d = 0; d <= limit; d++) { - - int start_diag = Math.max(value_to_add_forward + start_forward, -d); - int end_diag = Math.min(end_forward, d); - value_to_add_forward = 1 - value_to_add_forward; - - // compute forward furthest reaching paths - for (int k = start_diag; k <= end_diag; k += 2) { - int x; - if (k == -d - || (k < d && V[0][limit + k - 1] < V[0][limit + k + 1])) { - x = V[0][limit + k + 1]; - } else { - x = V[0][limit + k - 1] + 1; - } - - int y = x - k; - - snake[0] = x + bottoml1; - snake[1] = y + bottoml2; - snake[2] = 0; - // System.out.println("1 x: " + x + " y: " + y + " k: " + k + " - // d: " + d ); - while (x < N && y < M - && isRangeEqual(x + bottoml1, y + bottoml2)) { - x++; - y++; - snake[2]++; - } - V[0][limit + k] = x; - // System.out.println(x + " " + V[1][limit+k -delta] + " " + k + - // " " + delta); - if (!isEven && k >= delta - d + 1 && k <= delta + d - 1 - && x >= V[1][limit + k - delta]) { - // System.out.println("Returning: " + (2*d-1)); - return 2 * d - 1; - } - - // check to see if we can cut down the diagonal range - if (x >= N && end_forward > k - 1) { - end_forward = k - 1; - } else if (y >= M) { - start_forward = k + 1; - value_to_add_forward = 0; - } - } - - start_diag = Math.max(value_to_add_backward + start_backward, -d); - end_diag = Math.min(end_backward, d); - value_to_add_backward = 1 - value_to_add_backward; - - // compute backward furthest reaching paths - for (int k = start_diag; k <= end_diag; k += 2) { - int x; - if (k == d - || (k != -d && V[1][limit + k - 1] < V[1][limit + k + 1])) { - x = V[1][limit + k - 1]; - } else { - x = V[1][limit + k + 1] - 1; - } - - int y = x - k - delta; - - snake[2] = 0; - // System.out.println("2 x: " + x + " y: " + y + " k: " + k + " - // d: " + d); - while (x > 0 && y > 0 - && isRangeEqual(x - 1 + bottoml1, y - 1 + bottoml2)) { - x--; - y--; - snake[2]++; - } - V[1][limit + k] = x; - - if (isEven && k >= -delta - d && k <= d - delta - && x <= V[0][limit + k + delta]) { - // System.out.println("Returning: " + 2*d); - snake[0] = bottoml1 + x; - snake[1] = bottoml2 + y; - - return 2 * d; - } - - // check to see if we can cut down our diagonal range - if (x <= 0) { - start_backward = k + 1; - value_to_add_backward = 0; - } else if (y <= 0 && end_backward > k - 1) { - end_backward = k - 1; - } - } - worked(subMonitor, 1); - } - - /* - * computing the true LCS is too expensive, instead find the diagonal - * with the most progress and pretend a midle snake of length 0 occurs - * there. - */ - - int[] most_progress = findMostProgress(M, N, limit, V); - - snake[0] = bottoml1 + most_progress[0]; - snake[1] = bottoml2 + most_progress[1]; - snake[2] = 0; - return 5; /* - * HACK: since we didn't really finish the LCS computation - * we don't really know the length of the SES. We don't do - * anything with the result anyway, unless it's <=1. We know - * for a fact SES > 1 so 5 is as good a number as any to - * return here - */ - } - - /** - * Takes the array with furthest reaching D-paths from an LCS computation - * and returns the x,y coordinates and progress made in the middle diagonal - * among those with maximum progress, both from the front and from the back. - * - * @param M the length of the 1st sequence for which LCS is being computed - * @param N the length of the 2nd sequence for which LCS is being computed - * @param limit the number of steps made in an attempt to find the LCS from - * the front and back - * @param V the array storing the furthest reaching D-paths for the LCS - * computation - * @return The result as an array of 3 integers where result[0] is the x - * coordinate of the current location in the diagonal with the most - * progress, result[1] is the y coordinate of the current location - * in the diagonal with the most progress and result[2] is the - * amount of progress made in that diagonal - */ - private static int[] findMostProgress(int M, int N, int limit, int[][] V) { - int delta = N - M; - - int forward_start_diag; - if ((M & 1) == (limit & 1)) { - forward_start_diag = Math.max(-M, -limit); - } else { - forward_start_diag = Math.max(1 - M, -limit); - } - - int forward_end_diag = Math.min(N, limit); - - int backward_start_diag; - if ((N & 1) == (limit & 1)) { - backward_start_diag = Math.max(-N, -limit); - } else { - backward_start_diag = Math.max(1 - N, -limit); - } - - int backward_end_diag = Math.min(M, limit); - - int[][] max_progress = new int[Math.max(forward_end_diag - - forward_start_diag, backward_end_diag - backward_start_diag) / 2 + 1][3]; - int num_progress = 0; // the 1st entry is current, it is initialized - // with 0s - - // first search the forward diagonals - for (int k = forward_start_diag; k <= forward_end_diag; k += 2) { - int x = V[0][limit + k]; - int y = x - k; - if (x > N || y > M) { - continue; - } - - int progress = x + y; - if (progress > max_progress[0][2]) { - num_progress = 0; - max_progress[0][0] = x; - max_progress[0][1] = y; - max_progress[0][2] = progress; - } else if (progress == max_progress[0][2]) { - num_progress++; - max_progress[num_progress][0] = x; - max_progress[num_progress][1] = y; - max_progress[num_progress][2] = progress; - } - } - - boolean max_progress_forward = true; // initially the maximum - // progress is in the forward - // direction - - // now search the backward diagonals - for (int k = backward_start_diag; k <= backward_end_diag; k += 2) { - int x = V[1][limit + k]; - int y = x - k - delta; - if (x < 0 || y < 0) { - continue; - } - - int progress = N - x + M - y; - if (progress > max_progress[0][2]) { - num_progress = 0; - max_progress_forward = false; - max_progress[0][0] = x; - max_progress[0][1] = y; - max_progress[0][2] = progress; - } else if (progress == max_progress[0][2] && !max_progress_forward) { - num_progress++; - max_progress[num_progress][0] = x; - max_progress[num_progress][1] = y; - max_progress[num_progress][2] = progress; - } - } - - // return the middle diagonal with maximal progress. - return max_progress[num_progress / 2]; - } - - protected abstract int getLength2(); - - protected abstract int getLength1(); - - protected abstract boolean isRangeEqual(int i1, int i2); - - protected abstract void setLcs(int sl1, int sl2); - - protected abstract void initializeLcs(int lcsLength); - - public int getLength() { - return this.length; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/Messages.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/Messages.java deleted file mode 100644 index ba5caeea6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/Messages.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 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.core; - -import org.eclipse.osgi.util.NLS; - -public class Messages extends NLS { - private static final String BUNDLE_NAME = "org.eclipse.compare.internal.core.messages"; //$NON-NLS-1$ - public static String Activator_1; - public static String FileDiffResult_0; - public static String FileDiffResult_1; - public static String FileDiffResult_2; - public static String FileDiffResult_3; - public static String Patcher_0; - public static String Patcher_1; - public static String Patcher_2; - public static String WorkspacePatcher_0; - public static String WorkspacePatcher_1; - public static String RangeComparatorLCS_0; - static { - // initialize resource bundle - NLS.initializeMessages(BUNDLE_NAME, Messages.class); - } - - /* - * (non Javadoc) Cannot be instantiated. - */ - private Messages() { - // nothing to do - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/TextLineLCS.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/TextLineLCS.java deleted file mode 100644 index c5178ca20..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/TextLineLCS.java +++ /dev/null @@ -1,207 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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.core; - -import java.util.ArrayList; -import java.util.List; - - -public class TextLineLCS extends LCS { - - private final TextLine[] lines1; - private final TextLine[] lines2; - private TextLine[][] lcs; - - public TextLineLCS(TextLine[] lines1, TextLine[] lines2) { - this.lines1 = lines1; - this.lines2 = lines2; - } - - public TextLine[][] getResult() { - int length = getLength(); - if (length == 0) - return new TextLine[2][0]; - TextLine[][] result = new TextLine[2][]; - - // compact and shift the result - result[0] = compactAndShiftLCS(this.lcs[0], length, this.lines1); - result[1] = compactAndShiftLCS(this.lcs[1], length, this.lines2); - - return result; - } - - protected int getLength2() { - return this.lines2.length; - } - - protected int getLength1() { - return this.lines1.length; - } - - protected boolean isRangeEqual(int i1, int i2) { - return this.lines1[i1].sameText(this.lines2[i2]); - } - - protected void setLcs(int sl1, int sl2) { - this.lcs[0][sl1] = this.lines1[sl1]; - this.lcs[1][sl1] = this.lines2[sl2]; - } - - protected void initializeLcs(int length) { - this.lcs = new TextLine[2][length]; - } - - /** - * This method takes an lcs result interspersed with nulls, compacts it and - * shifts the LCS chunks as far towards the front as possible. This tends to - * produce good results most of the time. - * - * TODO: investigate what to do about comments. shifting either up or down - * hurts them - * - * @param lcsSide A subsequence of original, presumably it is the LCS of it and - * some other collection of lines - * @param len The number of non-null entries in lcs - * @param original The original sequence of lines of which lcs is a - * subsequence - * - * @return The subsequence lcs compacted and chunks shifted towards the - * front - */ - private TextLine[] compactAndShiftLCS(TextLine[] lcsSide, int len, - TextLine[] original) { - TextLine[] result = new TextLine[len]; - - if (len == 0) { - return result; - } - - int j = 0; - - while (lcsSide[j] == null) { - j++; - } - - result[0] = lcsSide[j]; - j++; - - for (int i = 1; i < len; i++) { - while (lcsSide[j] == null) { - j++; - } - - if (original[result[i - 1].lineNumber() + 1].sameText(lcsSide[j])) { - result[i] = original[result[i - 1].lineNumber() + 1]; - } else { - result[i] = lcsSide[j]; - } - j++; - } - - return result; - } - - /** - * Breaks the given text up into lines and returns an array of TextLine - * objects each corresponding to a single line, ordered according to the - * line number. That is result[i].lineNumber() == i and is the i'th line in - * text (starting from 0) Note: there are 1 more lines than there are - * newline characters in text. Corollary 1: if the last character is - * newline, the last line is empty Corollary 2: the empty string is 1 line - * - * @param text The text to extract lines from - * @return the array of TextLine object each corresponding to a line of text - */ - public static TextLine[] getTextLines(String text) { - List lines = new ArrayList(); - int begin = 0; - int end = getEOL(text, 0); - int lineNum = 0; - while (end != -1) { - lines.add(new TextLine(lineNum++, text.substring(begin, end))); - begin = end + 1; - end = getEOL(text, begin); - if (end == begin && text.charAt(begin - 1) == '\r' - && text.charAt(begin) == '\n') { - // we have '\r' followed by '\n', skip it - begin = end + 1; - end = getEOL(text, begin); - } - } - - /* - * this is the last line, no more newline characters, so take the rest - * of the string - */ - lines.add(new TextLine(lineNum, text.substring(begin))); - TextLine[] aLines = new TextLine[lines.size()]; - lines.toArray(aLines); - return aLines; - } - - /** - * Returns the index of the next end of line marker ('\n' or '\r') after - * start - * - * @param text The string to examine - * @param start The location in the string to start looking - * @return the index such that text.charAt(index) == '\n' or '\r', -1 if not - * found - */ - private static int getEOL(String text, int start) { - int max = text.length(); - for (int i = start; i < max; i++) { - char c = text.charAt(i); - if (c == '\n' || c == '\r') { - return i; - } - } - return -1; - } - - /* used to store information about a single line of text */ - public static class TextLine { - private int number; // the line number - - private String text; // the actual text - - public TextLine(int number, String text) { - this.number = number; - this.text = text; - } - - /** - * Compares this TextLine to l and returns true if they have the same - * text - * - * @param l the TextLine to compare to - * @return true if this and l have the same text - */ - public boolean sameText(TextLine l) { - // compare the hashCode() first since that is much faster and most - // of the time the text lines won't match - return this.text.hashCode() == l.text.hashCode() && l.text.equals(this.text); - } - - /** - * Returns the line number of this line - * - * @return the line number - */ - public int lineNumber() { - return this.number; - } - - public String toString() { - return "" + this.number + " " + this.text + "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/messages.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/messages.properties deleted file mode 100644 index 8e478831d..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/messages.properties +++ /dev/null @@ -1,22 +0,0 @@ -############################################################################### -# Copyright (c) 2008 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 -############################################################################### - -Activator_1=Internal error -FileDiffResult_0=(file already exists) -FileDiffResult_1=(file does not exist) -FileDiffResult_2={0} {1} -FileDiffResult_3={0} (hunk \#{1}) -Patcher_0=Patching -Patcher_1=Rejected patch -Patcher_2=Guessing Fuzz Factor... -WorkspacePatcher_0=Patching -WorkspacePatcher_1=Rejected patch -RangeComparatorLCS_0=Finding differences diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/DiffProject.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/DiffProject.java deleted file mode 100644 index 630256dbe..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/DiffProject.java +++ /dev/null @@ -1,76 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 2010 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.core.patch; - -import java.util.HashSet; -import java.util.Set; - -/** - * A diff project represents a project that was read from a workspace patch. - * It contains the set of file diffs that were associated with the project - * in the patch file. - */ -public class DiffProject { - - private String project; - private Set fDiffs= new HashSet(); - - /** - * Create a diff project for the given workspace project. - * @param project a workspace project - */ - public DiffProject(String project) { - this.project= project; - } - - /** - * Add the file diff to this project. - * @param diff the file diff. - */ - public void add(FilePatch2 diff) { - this.fDiffs.add(diff); - if (diff.getProject() != this) - diff.setProject(this); - } - - /** - * Return the name of this project. - * @return the name of this project - */ - public String getName() { - return this.project; - } - - /** - * Remove the file diff from this project. - * @param diff the diff to be removed - */ - public void remove(FilePatch2 diff) { - this.fDiffs.remove(diff); - } - - /** - * Return whether this project contains the given diff. - * @param diff a file diff - * @return whether this project contains the given diff - */ - public boolean contains(FilePatch2 diff) { - return this.fDiffs.contains(diff); - } - - /** - * Return the file diffs associated with this project. - * @return the file diffs associated with this project - */ - public FilePatch2[] getFileDiffs() { - return (FilePatch2[]) this.fDiffs.toArray(new FilePatch2[this.fDiffs.size()]); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/FileDiffResult.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/FileDiffResult.java deleted file mode 100644 index 3410270ac..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/FileDiffResult.java +++ /dev/null @@ -1,338 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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.core.patch; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.eclipse.compare.internal.core.ComparePlugin; -import org.eclipse.compare.internal.core.Messages; -import org.eclipse.compare.patch.IFilePatchResult; -import org.eclipse.compare.patch.IHunk; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.compare.patch.ReaderCreator; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.osgi.util.NLS; - -public class FileDiffResult implements IFilePatchResult { - - private FilePatch2 fDiff; - private boolean fMatches= false; - private boolean fDiffProblem; - private String fErrorMessage; - private Map fHunkResults = new HashMap(); - private List fBeforeLines, fAfterLines; - private final PatchConfiguration configuration; - private String charset; - - public FileDiffResult(FilePatch2 diff, PatchConfiguration configuration) { - super(); - this.fDiff = diff; - this.configuration = configuration; - } - - public PatchConfiguration getConfiguration() { - return this.configuration; - } - - public boolean canApplyHunk(Hunk hunk) { - HunkResult result = getHunkResult(hunk); - return result.isOK() && !this.fDiffProblem; - } - - /** - * Refreshes the state of the diff to {no matches, no problems} and checks to see what hunks contained - * by this Diff can actually be applied. - * - * Checks to see: - * 1) if the target file specified in fNewPath exists and is patchable - * 2) which hunks contained by this diff can actually be applied to the file - * @param content the contents being patched or <code>null</code> for an addition - * @param monitor a progress monitor or <code>null</code> if no progress monitoring is desired - */ - public void refresh(ReaderCreator content, IProgressMonitor monitor) { - this.fMatches= false; - this.fDiffProblem= false; - boolean create= false; - this.charset = Utilities.getCharset(content); - //If this diff is an addition, make sure that it doesn't already exist - boolean exists = targetExists(content); - if (this.fDiff.getDiffType(getConfiguration().isReversed()) == FilePatch2.ADDITION) { - if ((!exists || isEmpty(content)) && canCreateTarget(content)) { - this.fMatches= true; - } else { - // file already exists - this.fDiffProblem= true; - this.fErrorMessage= Messages.FileDiffResult_0; - } - create= true; - } else { //This diff is not an addition, try to find a match for it - //Ensure that the file described by the path exists and is modifiable - if (exists) { - this.fMatches= true; - } else { - // file doesn't exist - this.fDiffProblem= true; - this.fErrorMessage= Messages.FileDiffResult_1; - } - } - - if (this.fDiffProblem) { - // We couldn't find the target file or the patch is trying to add a - // file that already exists but we need to initialize the hunk - // results for display - this.fBeforeLines = new ArrayList(getLines(content, false)); - this.fAfterLines = this.fMatches ? new ArrayList() : this.fBeforeLines; - IHunk[] hunks = this.fDiff.getHunks(); - for (int i = 0; i < hunks.length; i++) { - Hunk hunk = (Hunk) hunks[i]; - hunk.setCharset(getCharset()); - HunkResult result = getHunkResult(hunk); - result.setMatches(false); - } - } else { - // If this diff has no problems discovered so far, try applying the patch - patch(getLines(content, create), monitor); - } - - if (containsProblems()) { - if (this.fMatches) { - // Check to see if we have at least one hunk that matches - this.fMatches = false; - IHunk[] hunks = this.fDiff.getHunks(); - for (int i = 0; i < hunks.length; i++) { - Hunk hunk = (Hunk) hunks[i]; - HunkResult result = getHunkResult(hunk); - if (result.isOK()) { - this.fMatches = true; - break; - } - } - } - } - } - - protected boolean canCreateTarget(ReaderCreator content) { - return true; - } - - protected boolean targetExists(ReaderCreator content) { - return content != null && content.canCreateReader(); - } - - protected List getLines(ReaderCreator content, boolean create) { - List lines = LineReader.load(content, create); - return lines; - } - - protected boolean isEmpty(ReaderCreator content) { - if (content == null) - return true; - return LineReader.load(content, false).isEmpty(); - } - - /* - * Tries to patch the given lines with the specified Diff. - * Any hunk that couldn't be applied is returned in the list failedHunks. - */ - public void patch(List lines, IProgressMonitor monitor) { - this.fBeforeLines = new ArrayList(); - this.fBeforeLines.addAll(lines); - if (getConfiguration().getFuzz() != 0) { - calculateFuzz(this.fBeforeLines, monitor); - } - int shift= 0; - IHunk[] hunks = this.fDiff.getHunks(); - for (int i = 0; i < hunks.length; i++) { - Hunk hunk = (Hunk) hunks[i]; - hunk.setCharset(getCharset()); - HunkResult result = getHunkResult(hunk); - result.setShift(shift); - if (result.patch(lines)) { - shift = result.getShift(); - } - } - this.fAfterLines = lines; - } - - public boolean getDiffProblem() { - return this.fDiffProblem; - } - - /** - * Returns whether this Diff has any problems - * @return true if this Diff or any of its children Hunks have a problem, false if it doesn't - */ - public boolean containsProblems() { - if (this.fDiffProblem) - return true; - for (Iterator iterator = this.fHunkResults.values().iterator(); iterator.hasNext();) { - HunkResult result = (HunkResult) iterator.next(); - if (!result.isOK()) - return true; - } - return false; - } - - public String getLabel() { - String label= getTargetPath().toString(); - if (this.fDiffProblem) - return NLS.bind(Messages.FileDiffResult_2, new String[] {label, this.fErrorMessage}); - return label; - } - - public boolean hasMatches() { - return this.fMatches; - } - - /** - * Return the lines of the target file with all matched hunks applied. - * @return the lines of the target file with all matched hunks applied - */ - public List getLines() { - return this.fAfterLines; - } - - /** - * Calculate the fuzz factor that will allow the most hunks to be matched. - * @param lines the lines of the target file - * @param monitor a progress monitor - * @return the fuzz factor or <code>-1</code> if no hunks could be matched - */ - public int calculateFuzz(List lines, IProgressMonitor monitor) { - if (monitor == null) - monitor = new NullProgressMonitor(); - this.fBeforeLines = new ArrayList(lines); - // TODO: What about deletions? - if (this.fDiff.getDiffType(getConfiguration().isReversed()) == FilePatch2.ADDITION) { - // Additions don't need to adjust the fuzz factor - // TODO: What about the after lines? - return -1; - } - int shift= 0; - int highestFuzz = -1; // the maximum fuzz factor for all hunks - String name = getTargetPath() != null ? getTargetPath().lastSegment() : ""; //$NON-NLS-1$ - IHunk[] hunks = this.fDiff.getHunks(); - for (int j = 0; j < hunks.length; j++) { - Hunk h = (Hunk) hunks[j]; - monitor.subTask(NLS.bind(Messages.FileDiffResult_3, new String[] {name, Integer.toString(j + 1)})); - HunkResult result = getHunkResult(h); - result.setShift(shift); - int fuzz = result.calculateFuzz(lines, monitor); - shift = result.getShift(); - if (fuzz > highestFuzz) - highestFuzz = fuzz; - monitor.worked(1); - } - this.fAfterLines = lines; - return highestFuzz; - } - - public IPath getTargetPath() { - return this.fDiff.getStrippedPath(getConfiguration().getPrefixSegmentStripCount(), getConfiguration().isReversed()); - } - - private HunkResult getHunkResult(Hunk hunk) { - HunkResult result = (HunkResult)this.fHunkResults.get(hunk); - if (result == null) { - result = new HunkResult(this, hunk); - this.fHunkResults .put(hunk, result); - } - return result; - } - - public List getFailedHunks() { - List failedHunks = new ArrayList(); - IHunk[] hunks = this.fDiff.getHunks(); - for (int i = 0; i < hunks.length; i++) { - HunkResult result = (HunkResult) this.fHunkResults.get(hunks[i]); - if (result != null && !result.isOK()) - failedHunks.add(result.getHunk()); - } - return failedHunks; - } - - public FilePatch2 getDiff() { - return this.fDiff; - } - - public List getBeforeLines() { - return this.fBeforeLines; - } - - public List getAfterLines() { - return this.fAfterLines; - } - - public HunkResult[] getHunkResults() { - // return hunk results in the same order as hunks are placed in file diff - List results = new ArrayList(); - IHunk[] hunks = this.fDiff.getHunks(); - for (int i = 0; i < hunks.length; i++) { - HunkResult result = (HunkResult) this.fHunkResults.get(hunks[i]); - if (result != null) { - results.add(result); - } - } - return (HunkResult[]) results.toArray(new HunkResult[results.size()]); - } - - public InputStream getOriginalContents() { - String contents = LineReader.createString(isPreserveLineDelimeters(), getBeforeLines()); - return asInputStream(contents, getCharset()); - } - - public InputStream getPatchedContents() { - String contents = LineReader.createString(isPreserveLineDelimeters(), getLines()); - return asInputStream(contents, getCharset()); - } - - public String getCharset() { - return this.charset; - } - - public boolean isPreserveLineDelimeters() { - return false; - } - - public IHunk[] getRejects() { - List failedHunks = getFailedHunks(); - return (IHunk[]) failedHunks.toArray(new IHunk[failedHunks.size()]); - } - - public boolean hasRejects() { - return getFailedHunks().size() > 0; - } - - public static InputStream asInputStream(String contents, String charSet) { - byte[] bytes = null; - if (charSet != null) { - try { - bytes = contents.getBytes(charSet); - } catch (UnsupportedEncodingException e) { - ComparePlugin.log(e); - } - } - if (bytes == null) { - bytes = contents.getBytes(); - } - return new ByteArrayInputStream(bytes); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/FilePatch2.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/FilePatch2.java deleted file mode 100644 index c1b569df6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/FilePatch2.java +++ /dev/null @@ -1,266 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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.core.patch; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.compare.patch.IFilePatch2; -import org.eclipse.compare.patch.IFilePatchResult; -import org.eclipse.compare.patch.IHunk; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.compare.patch.ReaderCreator; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Path; - -/** - * A file diff represents a set of hunks that were associated with the - * same path in a patch file. - */ -public class FilePatch2 implements IFilePatch2 { - - /** - * Difference constant (value 1) indicating one side was added. - */ - public static final int ADDITION= 1; - /** - * Difference constant (value 2) indicating one side was removed. - */ - public static final int DELETION= 2; - /** - * Difference constant (value 3) indicating side changed. - */ - public static final int CHANGE= 3; - - private IPath fOldPath, fNewPath; - private long oldDate, newDate; - private List fHunks= new ArrayList(); - private DiffProject fProject; //the project that contains this diff - private String header; - private int addedLines, removedLines; - - /** - * Create a file diff for the given path and date information. - * @param oldPath the path of the before state of the file - * @param oldDate the timestamp of the before state - * @param newPath the path of the after state - * @param newDate the timestamp of the after state - */ - public FilePatch2(IPath oldPath, long oldDate, IPath newPath, long newDate) { - this.fOldPath= oldPath; - this.oldDate = oldDate; - this.fNewPath= newPath; - this.newDate = newDate; - } - - /** - * Return the parent project or <code>null</code> if there isn't one. - * @return the parent project or <code>null</code> - */ - public DiffProject getProject() { - return this.fProject; - } - - /** - * Set the project of this diff to the given project. - * This method should only be called from - * {@link DiffProject#add(FilePatch2)} - * @param diffProject the parent project - */ - void setProject(DiffProject diffProject) { - if (this.fProject == diffProject) - return; - if (this.fProject != null) - this.fProject.remove(this); - this.fProject= diffProject; - } - - /** - * Get the path of the file diff. - * @param reverse whether the path of the before state or after state - * should be used - * @return the path of the file diff - */ - public IPath getPath(boolean reverse) { - if (getDiffType(reverse) == ADDITION) { - if (reverse) - return this.fOldPath; - return this.fNewPath; - } - if (reverse && this.fNewPath != null) - return this.fNewPath; - if (this.fOldPath != null) - return this.fOldPath; - return this.fNewPath; - } - - /** - * Add the hunk to this file diff. - * @param hunk the hunk - */ - public void add(Hunk hunk) { - this.fHunks.add(hunk); - hunk.setParent(this); - } - - /** - * Remove the hunk from this file diff - * @param hunk the hunk - */ - protected void remove(Hunk hunk) { - this.fHunks.remove(hunk); - } - - /** - * Return the hunks associated with this file diff. - * @return the hunks associated with this file diff - */ - public IHunk[] getHunks() { - return (IHunk[]) this.fHunks.toArray(new IHunk[this.fHunks.size()]); - } - - /** - * Return the number of hunks associated with this file diff. - * @return the number of hunks associated with this file diff - */ - public int getHunkCount() { - return this.fHunks.size(); - } - - /** - * Return the difference type of this file diff. - * @param reverse whether the patch is being reversed - * @return the type of this file diff - */ - public int getDiffType(boolean reverse) { - if (this.fHunks.size() == 1) { - boolean add = false; - boolean delete = false; - Iterator iter = this.fHunks.iterator(); - while (iter.hasNext()){ - Hunk hunk = (Hunk) iter.next(); - int type =hunk.getHunkType(reverse); - if (type == ADDITION){ - add = true; - } else if (type == DELETION ){ - delete = true; - } - } - if (add && !delete){ - return ADDITION; - } else if (!add && delete){ - return DELETION; - } - } - return CHANGE; - } - - /** - * Return the path of this file diff with the specified number - * of leading segments striped. - * @param strip the number of leading segments to strip from the path - * @param reverse whether the patch is being reversed - * @return the path of this file diff with the specified number - * of leading segments striped - */ - public IPath getStrippedPath(int strip, boolean reverse) { - IPath path= getPath(reverse); - if (strip > 0 && strip < path.segmentCount()) - path= path.removeFirstSegments(strip); - return path; - } - - /** - * Return the segment count of the path of this file diff. - * @return the segment count of the path of this file diff - */ - public int segmentCount() { - //Update prefix count - go through all of the diffs and find the smallest - //path segment contained in all diffs. - int length= 99; - if (this.fOldPath != null) - length= Math.min(length, this.fOldPath.segmentCount()); - if (this.fNewPath != null) - length= Math.min(length, this.fNewPath.segmentCount()); - return length; - } - - public IFilePatchResult apply(ReaderCreator content, - PatchConfiguration configuration, IProgressMonitor monitor) { - FileDiffResult result = new FileDiffResult(this, configuration); - result.refresh(content, monitor); - return result; - } - - public IPath getTargetPath(PatchConfiguration configuration) { - return getStrippedPath(configuration.getPrefixSegmentStripCount(), configuration.isReversed()); - } - - public FilePatch2 asRelativeDiff() { - if (this.fProject == null) - return this; - IPath adjustedOldPath = null; - if (this.fOldPath != null) { - adjustedOldPath = new Path(null, this.fProject.getName()).append(this.fOldPath); - } - IPath adjustedNewPath = null; - if (this.fNewPath != null) { - adjustedNewPath = new Path(null, this.fProject.getName()).append(this.fNewPath); - } - FilePatch2 diff = create(adjustedOldPath, 0, adjustedNewPath, 0); - for (Iterator iterator = this.fHunks.iterator(); iterator.hasNext();) { - Hunk hunk = (Hunk) iterator.next(); - // Creating the hunk adds it to the parent diff - new Hunk(diff, hunk); - } - return diff; - } - - protected FilePatch2 create(IPath oldPath, long oldDate, IPath newPath, - long newDate) { - return new FilePatch2(oldPath, oldDate, newPath, newDate); - } - - public void setHeader(String header) { - this.header = header; - } - - public String getHeader() { - return this.header; - } - - public long getBeforeDate() { - return this.oldDate; - } - - public long getAfterDate() { - return this.newDate; - } - - public void setAddedLines(int addedLines) { - this.addedLines = addedLines; - } - - public void setRemovedLines(int removedLines) { - this.removedLines = removedLines; - } - - public int getAddedLines() { - return this.addedLines; - } - - public int getRemovedLines() { - return this.removedLines; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/Hunk.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/Hunk.java deleted file mode 100644 index 27ec848c6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/Hunk.java +++ /dev/null @@ -1,518 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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.core.patch; - -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.runtime.Assert; - -import org.eclipse.compare.patch.IFilePatchResult; -import org.eclipse.compare.patch.IHunk; -import org.eclipse.compare.patch.PatchConfiguration; - -/** - * A Hunk describes a range of changed lines and some context lines. - */ -public class Hunk implements IHunk { - - private FilePatch2 fParent; - private int fOldStart, fOldLength; - private int fNewStart, fNewLength; - private String[] fLines; - private int hunkType; - private String charset = null; - - public static Hunk createHunk(FilePatch2 parent, int[] oldRange, int[] newRange, List lines, boolean hasLineAdditions, boolean hasLineDeletions, boolean hasContextLines) { - int oldStart = 0; - int oldLength = 0; - int newStart = 0; - int newLength = 0; - if (oldRange[0] > 0) - oldStart= oldRange[0]-1; // line number start at 0! - else - oldStart= 0; - oldLength= oldRange[1]; - if (newRange[0] > 0) - newStart= newRange[0]-1; // line number start at 0! - else - newStart= 0; - newLength= newRange[1]; - int hunkType = FilePatch2.CHANGE; - if (!hasContextLines) { - if (hasLineAdditions && !hasLineDeletions) { - hunkType = FilePatch2.ADDITION; - } else if (!hasLineAdditions && hasLineDeletions) { - hunkType = FilePatch2.DELETION; - } - } - return new Hunk(parent, hunkType, oldStart, oldLength, newStart, newLength, (String[]) lines.toArray(new String[lines.size()])); - } - - public Hunk(FilePatch2 parent, int hunkType, int oldStart, int oldLength, - int newStart, int newLength, String[] lines) { - this.fParent = parent; - if (this.fParent != null) { - this.fParent.add(this); - } - this.hunkType = hunkType; - this.fOldLength = oldLength; - this.fOldStart = oldStart; - this.fNewLength = newLength; - this.fNewStart = newStart; - this.fLines = lines; - } - - public Hunk(FilePatch2 parent, Hunk toCopy) { - this(parent, toCopy.hunkType, toCopy.fOldStart, toCopy.fOldLength, toCopy.fNewStart, toCopy.fNewLength, toCopy.fLines); - } - - /* - * Returns the contents of this hunk. - * Each line starts with a control character. Their meaning is as follows: - * <ul> - * <li> - * '+': add the line - * <li> - * '-': delete the line - * <li> - * ' ': no change, context line - * </ul> - */ - public String getContent() { - StringBuffer sb= new StringBuffer(); - for (int i= 0; i < this.fLines.length; i++) { - String line= this.fLines[i]; - sb.append(line.substring(0, LineReader.length(line))); - sb.append('\n'); - } - return sb.toString(); - } - - /* - * Returns a descriptive String for this hunk. - * It is in the form old_start,old_length -> new_start,new_length. - */ - String getDescription() { - StringBuffer sb= new StringBuffer(); - sb.append(Integer.toString(this.fOldStart)); - sb.append(','); - sb.append(Integer.toString(this.fOldLength)); - sb.append(" -> "); //$NON-NLS-1$ - sb.append(Integer.toString(this.fNewStart)); - sb.append(','); - sb.append(Integer.toString(this.fNewLength)); - return sb.toString(); - } - - public String getRejectedDescription() { - StringBuffer sb= new StringBuffer(); - sb.append("@@ -"); //$NON-NLS-1$ - sb.append(Integer.toString(this.fOldStart)); - sb.append(','); - sb.append(Integer.toString(this.fOldLength)); - sb.append(" +"); //$NON-NLS-1$ - sb.append(Integer.toString(this.fNewStart)); - sb.append(','); - sb.append(Integer.toString(this.fNewLength)); - sb.append(" @@"); //$NON-NLS-1$ - return sb.toString(); - } - - public int getHunkType(boolean reverse) { - if (reverse) { - if (this.hunkType == FilePatch2.ADDITION) - return FilePatch2.DELETION; - if (this.hunkType == FilePatch2.DELETION) - return FilePatch2.ADDITION; - } - return this.hunkType; - } - - void setHunkType(int hunkType) { - this.hunkType = hunkType; - } - - public String[] getLines() { - return this.fLines; - } - - public String[] getUnifiedLines() { - String[] ret = new String[this.fLines.length]; - System.arraycopy(this.fLines, 0, ret, 0, this.fLines.length); - return ret; - } - - /** - * Set the parent of this hunk. This method - * should only be invoked from {@link FilePatch2#add(Hunk)} - * @param diff the parent of this hunk - */ - void setParent(FilePatch2 diff) { - if (this.fParent == diff) - return; - if (this.fParent != null) - this.fParent.remove(this); - this.fParent = diff; - } - - public FilePatch2 getParent() { - return this.fParent; - } - - /* - * Tries to apply the given hunk on the specified lines. - * The parameter shift is added to the line numbers given - * in the hunk. - */ - public boolean tryPatch(PatchConfiguration configuration, List lines, int shift, int fuzz) { - boolean reverse = configuration.isReversed(); - int pos = getStart(reverse) + shift; - List contextLines = new ArrayList(); - boolean contextLinesMatched = true; - boolean precedingLinesChecked = false; - for (int i= 0; i < this.fLines.length; i++) { - String s = this.fLines[i]; - Assert.isTrue(s.length() > 0); - String line = s.substring(1); - char controlChar = s.charAt(0); - - if (controlChar == ' ') { // context lines - - if (pos < 0 || pos >= lines.size()) - return false; - contextLines.add(line); - if (linesMatch(configuration, line, (String) lines.get(pos))) { - pos++; - continue; - } else if (fuzz > 0) { - // doesn't match, use the fuzz factor - contextLinesMatched = false; - pos++; - continue; - } - return false; - } else if (isDeletedDelimeter(controlChar, reverse)) { - // deleted lines - - if (precedingLinesChecked && !contextLinesMatched && contextLines.size() > 0) - // context lines inside hunk don't match - return false; - - // check following context lines if exist - // use the fuzz factor if needed - if (!precedingLinesChecked - && !contextLinesMatched - && contextLines.size() >= fuzz - && !checkPrecedingContextLines(configuration, lines, - fuzz, pos, contextLines)) - return false; - // else if there is less or equal context line to the fuzz - // factor we ignore them all and treat as matching - - precedingLinesChecked = true; - contextLines.clear(); - contextLinesMatched = true; - - if (pos < 0 || pos >= lines.size()) // out of the file - return false; - if (linesMatch(configuration, line, (String) lines.get(pos))) { - pos++; - continue; // line matched, continue with the next one - } - - // We must remove all lines at once, return false if this - // fails. In other words, all lines considered for deletion - // must be found one by one. - return false; - } else if (isAddedDelimeter(controlChar, reverse)) { - - if (precedingLinesChecked && !contextLinesMatched && contextLines.size() > 0) - return false; - - if (!precedingLinesChecked - && !contextLinesMatched - && contextLines.size() >= fuzz - && !checkPrecedingContextLines(configuration, lines, - fuzz, pos, contextLines)) - return false; - - precedingLinesChecked = true; - contextLines.clear(); - contextLinesMatched = true; - - // we don't have to do anything more for a 'try' - } else - Assert.isTrue(false, "tryPatch: unknown control character: " + controlChar); //$NON-NLS-1$ - } - - // check following context lines if exist - if (!contextLinesMatched - && fuzz > 0 - && contextLines.size() > fuzz - && !checkFollowingContextLines(configuration, lines, fuzz, pos, - contextLines)) - return false; - - return true; - } - - private boolean checkPrecedingContextLines( - PatchConfiguration configuration, List lines, int fuzz, int pos, - List contextLines) { - - // ignore from the beginning - for (int j = fuzz; j < contextLines.size(); j++) { - if (!linesMatch(configuration, (String) contextLines.get(j), - (String) lines.get(pos - contextLines.size() + j))) - return false; - } - return true; - } - - private boolean checkFollowingContextLines( - PatchConfiguration configuration, List lines, int fuzz, int pos, - List contextLines) { - if (!contextLines.isEmpty()) { - // ignore from the end - for (int j = 0; j < contextLines.size() - fuzz; j++) { - if (!linesMatch(configuration, (String) contextLines.get(j), - (String) lines.get(pos - contextLines.size() + j))) - return false; - } - } - return true; - } - - public int getStart(boolean after) { - if (after) { - return this.fNewStart; - } - return this.fOldStart; - } - - public void setStart(int start, boolean after) { - if (after) { - this.fNewStart = start; - } else { - this.fOldStart = start; - } - } - - public int getLength(boolean after) { - if (after) { - return this.fNewLength; - } - return this.fOldLength; - } - - private int getShift(boolean reverse) { - if (reverse) { - return this.fOldLength - this.fNewLength; - } - return this.fNewLength - this.fOldLength; - } - - int doPatch(PatchConfiguration configuration, List lines, int shift, int fuzz) { - boolean reverse = configuration.isReversed(); - int pos = getStart(reverse) + shift; - List contextLines = new ArrayList(); - boolean contextLinesMatched = true; - boolean precedingLinesChecked = false; - String lineDelimiter = getLineDelimiter(lines); - - for (int i= 0; i < this.fLines.length; i++) { - String s= this.fLines[i]; - Assert.isTrue(s.length() > 0); - String line= s.substring(1); - char controlChar= s.charAt(0); - if (controlChar == ' ') { - // context lines - Assert.isTrue(pos < lines.size(), "doPatch: inconsistency in context"); //$NON-NLS-1$ - contextLines.add(line); - if (linesMatch(configuration, line, (String) lines.get(pos))) { - pos++; - continue; - } else if (fuzz > 0) { - // doesn't match, use the fuzz factor - contextLinesMatched = false; - pos++; - continue; - } - Assert.isTrue(false, "doPatch: context doesn't match"); //$NON-NLS-1$ -// pos++; - } else if (isDeletedDelimeter(controlChar, reverse)) { - // deleted lines - if (precedingLinesChecked && !contextLinesMatched && contextLines.size() > 0) - // context lines inside hunk don't match - Assert.isTrue(false, "doPatch: context lines inside hunk don't match"); //$NON-NLS-1$ - - // check following context lines if exist - // use the fuzz factor if needed - if (!precedingLinesChecked - && !contextLinesMatched - && contextLines.size() >= fuzz - && !checkPrecedingContextLines(configuration, lines, - fuzz, pos, contextLines)) - Assert.isTrue(false, "doPatch: preceding context lines don't match, even though fuzz factor has been used"); //$NON-NLS-1$; - // else if there is less or equal context line to the fuzz - // factor we ignore them all and treat as matching - - precedingLinesChecked = true; - contextLines.clear(); - contextLinesMatched = true; - - lines.remove(pos); - } else if (isAddedDelimeter(controlChar, reverse)) { - // added lines - if (precedingLinesChecked && !contextLinesMatched && contextLines.size() > 0) - Assert.isTrue(false, "doPatch: context lines inside hunk don't match"); //$NON-NLS-1$ - - if (!precedingLinesChecked - && !contextLinesMatched - && contextLines.size() >= fuzz - && !checkPrecedingContextLines(configuration, lines, - fuzz, pos, contextLines)) - Assert.isTrue(false, "doPatch: preceding context lines don't match, even though fuzz factor has been used"); //$NON-NLS-1$; - - precedingLinesChecked = true; - contextLines.clear(); - contextLinesMatched = true; - - // if the line contains a delimiter, use a proper one - if (line.length() > LineReader.length(line)) - line = line.substring(0, LineReader.length(line)) + lineDelimiter; - - if (getLength(reverse) == 0 && pos+1 < lines.size()) - lines.add(pos+1, line); - else - lines.add(pos, line); - pos++; - } else - Assert.isTrue(false, "doPatch: unknown control character: " + controlChar); //$NON-NLS-1$ - } - return getShift(reverse); - } - - private boolean isDeletedDelimeter(char controlChar, boolean reverse) { - return (!reverse && controlChar == '-') || (reverse && controlChar == '+'); - } - - private boolean isAddedDelimeter(char controlChar, boolean reverse) { - return (reverse && controlChar == '-') || (!reverse && controlChar == '+'); - } - - /* - * Compares two strings. - * If fIgnoreWhitespace is true whitespace is ignored. - */ - private boolean linesMatch(PatchConfiguration configuration, String line1, String line2) { - if (configuration.isIgnoreWhitespace()) - return stripWhiteSpace(line1).equals(stripWhiteSpace(line2)); - if (isIgnoreLineDelimiter()) { - int l1= LineReader.length(line1); - int l2= LineReader.length(line2); - if (l1 != l2) - return false; - return line1.regionMatches(0, line2, 0, l1); - } - return line1.equals(line2); - } - - private boolean isIgnoreLineDelimiter() { - return true; - } - - private String getLineDelimiter(List lines) { - if (lines.size() > 0) { - // get a line separator from the file being patched - String line0 = (String) lines.get(0); - return line0.substring(LineReader.length(line0)); - } else if (this.fLines.length > 0) { - // if the file doesn't exist use a line separator from the patch - return this.fLines[0].substring(LineReader.length(this.fLines[0])); - } - return System.getProperty("line.separator"); //$NON-NLS-1$ - } - - /* - * Returns the given string with all whitespace characters removed. - * Whitespace is defined by <code>Character.isWhitespace(...)</code>. - */ - private String stripWhiteSpace(String s) { - StringBuffer sb= new StringBuffer(); - int l= s.length(); - for (int i= 0; i < l; i++) { - char c= s.charAt(i); - if (!Character.isWhitespace(c)) - sb.append(c); - } - return sb.toString(); - } - - public String getContents(boolean isAfterState, boolean reverse) { - StringBuffer result= new StringBuffer(); - for (int i= 0; i<this.fLines.length; i++) { - String line= this.fLines[i]; - String rest= line.substring(1); - char c = line.charAt(0); - if (c == ' ') { - result.append(rest); - } else if (isDeletedDelimeter(c, reverse) && !isAfterState) { - result.append(rest); - } else if (isAddedDelimeter(c, reverse) && isAfterState) { - result.append(rest); - } - } - return result.toString(); - } - - public String getLabel() { - return getDescription(); - } - - public int getStartPosition() { - return getStart(false); - } - - public InputStream getOriginalContents() { - String contents = getContents(false, false); - return asInputStream(contents); - } - - public InputStream getPatchedContents() { - String contents = getContents(true, false); - return asInputStream(contents); - } - - private InputStream asInputStream(String contents) { - String charSet = getCharset(); - return FileDiffResult.asInputStream(contents, charSet); - } - - void setCharset(String charset) { - this.charset = charset; - } - - /** - * {@inheritDoc} - * @deprecated This method can be called before the first attempt to apply - * the hunk when it is impossible to determine the encoding and - * in this case it always returns null. Please see - * {@link IFilePatchResult#getCharset()} as a proper way to - * obtain charset. - */ - public String getCharset() { - return this.charset; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/HunkResult.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/HunkResult.java deleted file mode 100644 index 186a49b6c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/HunkResult.java +++ /dev/null @@ -1,273 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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.core.patch; - -import java.util.List; - -import org.eclipse.compare.patch.IHunkFilter; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; - -public class HunkResult { - - private static final boolean DEBUG= false; - - /** - * Default maximum fuzz factor equals 2. This is related to the default - * number of context lines, which is 3. - */ - private static final int MAXIMUM_FUZZ_FACTOR = 2; - - private Hunk fHunk; - private boolean fMatches; - private int fShift; - private int fFuzz = -1; // not set or couldn't be found - - private final FileDiffResult fDiffResult; - - /** - * Create a hunk result for the given hunk - * @param diffResult the parent diff result - * @param hunk the hunk - */ - public HunkResult(FileDiffResult diffResult, Hunk hunk) { - this.fDiffResult = diffResult; - this.fHunk = hunk; - } - - /** - * Try to apply the specified hunk to the given lines. - * If the hunk cannot be applied at the original position - * the method tries shift lines up and down. - * @param lines the lines to be patched - * @return whether the hunk could be applied - */ - public boolean patch(List lines) { - this.fMatches = false; - PatchConfiguration configuration = getConfiguration(); - // if the fuzz is not set for the current hunk use the one from fDiffResult - int fuzz = this.fFuzz != -1 ? this.fFuzz : configuration.getFuzz(); - if (isEnabled(configuration)) { - if (this.fHunk.tryPatch(configuration, lines, this.fShift, fuzz)) { - // it's a perfect match, no shifting is needed - this.fShift += this.fHunk.doPatch(configuration, lines, this.fShift, fuzz); - this.fMatches = true; - } else { - boolean found= false; - int oldShift= this.fShift; - - int hugeShift = lines.size(); - for (int i = 1; i <= hugeShift; i++) { - if (this.fHunk.tryPatch(configuration, lines, this.fShift - i, fuzz)) { - if (isAdjustShift()) - this.fShift -= i; - found = true; - break; - } - } - - if (!found) { - for (int i = 1; i <= hugeShift; i++) { - if (this.fHunk.tryPatch(configuration, lines, this.fShift + i, fuzz)) { - if (isAdjustShift()) - this.fShift += i; - found = true; - break; - } - } - } - - if (found) { - if (DEBUG) System.out.println("patched hunk at offset: " + (this.fShift-oldShift)); //$NON-NLS-1$ - this.fShift+= this.fHunk.doPatch(configuration, lines, this.fShift, fuzz); - this.fMatches = true; - } - } - } - return this.fMatches; - } - - private boolean isAdjustShift() { - return true; - } - - private PatchConfiguration getConfiguration() { - return getDiffResult().getConfiguration(); - } - - /** - * Calculate the fuzz that will allow the most hunks to be matched. Even - * though we're interested only in the value of the fuzz, the shifting is - * done anyway. - * - * @param lines - * the lines of the target file - * @param monitor - * a progress monitor - * @return the fuzz factor or -1 if the hunk could not be matched - */ - public int calculateFuzz(List lines, IProgressMonitor monitor) { - this.fMatches = false; - PatchConfiguration configuration = getConfiguration(); - int fuzz = 0; - int maxFuzz = configuration.getFuzz() == -1 ? MAXIMUM_FUZZ_FACTOR - : configuration.getFuzz(); - for (; fuzz <= maxFuzz; fuzz++) { - // try to apply using lines coordinates from the patch - if (this.fHunk.tryPatch(configuration, lines, this.fShift, fuzz)) { - // it's a perfect match, no adjustment is needed - this.fShift += this.fHunk.doPatch(configuration, lines, this.fShift, fuzz); - this.fMatches = true; - break; - } - - // TODO (tzarna): hugeShift=lines.size() is more than we need. - // Lines to the beg/end of a file would be enough but this can still - // in matching hunks out of order. Try to shift using only lines - // available "between" hunks. - int hugeShift = lines.size(); - - // shift up - for (int i = 1; i <= hugeShift; i++) { - if (monitor.isCanceled()) { - throw new OperationCanceledException(); - } - if (this.fHunk.tryPatch(configuration, lines, this.fShift - i, fuzz)) { - if (isAdjustShift()) - this.fShift -= i; - this.fMatches = true; - break; - } - } - - // shift down - if (!this.fMatches) { - for (int i = 1; i <= hugeShift; i++) { - if (monitor.isCanceled()) { - throw new OperationCanceledException(); - } - if (this.fHunk.tryPatch(configuration, lines, this.fShift + i, fuzz)) { - if (isAdjustShift()) - this.fShift += i; - this.fMatches = true; - break; - } - } - } - - if (this.fMatches) { - this.fShift += this.fHunk.doPatch(configuration, lines, this.fShift, fuzz); - break; - } - } - // set fuzz for the current hunk - this.fFuzz = this.fMatches ? fuzz : -1; - return this.fFuzz; - } - - /** - * Return the amount that this hunk should be shifted when a match with the file - * is attempted. The shift is needed to compensate for previous hunks that have - * been applied. - * @return the amount that this hunk should be shifted when applied - */ - public int getShift() { - return this.fShift; - } - - /** - * Set the amount that this hunk should be shifted when a match with the file - * is attempted. The shift is needed to compensate for previous hunks that have - * been applied. - * @param shift the amount to shift this hunk - */ - public void setShift(int shift) { - this.fShift = shift; - } - - /** - * Return the hunk to which this result applies. - * @return the hunk to which this result applies - */ - public Hunk getHunk() { - return this.fHunk; - } - - /** - * Return the parent diff result. - * @return the parent diff result - */ - public FileDiffResult getDiffResult() { - return this.fDiffResult; - } - - /** - * Return whether the hunk was matched with the target file. - * @return whether the hunk was matched with the target file - */ - public boolean isOK() { - return this.fMatches; - } - - /** - * Return the contents that should be displayed for the hunk result. - * @param afterState whether the after state or before state of the hunk is desired - * @param fullContext whether the hunk should be displayed with the entire file or - * only the lines in the hunk itself - * @return the contents to be display - */ - public String getContents(boolean afterState, boolean fullContext) { - if (fullContext) { - boolean problemFound = false; - List lines = getDiffResult().getBeforeLines(); - if (afterState) { - if (isOK()) { - int oldShift = this.fShift; - try { - this.fShift = 0; - problemFound = !patch(lines); - } finally { - this.fShift = oldShift; - } - } else { - problemFound = true; - } - } - // Only return the full context if we could apply the hunk - if (!problemFound) - return LineReader.createString(this.fDiffResult.isPreserveLineDelimeters(), lines); - } - return getHunk().getContents(afterState, getConfiguration().isReversed()); - } - - private boolean isEnabled(PatchConfiguration configuration) { - IHunkFilter[] filters = configuration.getHunkFilters(); - for (int i = 0; i < filters.length; i++) { - if (!filters[i].select(this.fHunk)) { - return false; - } - } - return true; - } - - public void setMatches(boolean matches) { - this.fMatches = matches; - } - - public String getCharset() { - return this.fDiffResult.getCharset(); - } - - public int getFuzz() { - return this.fFuzz; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/LineReader.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/LineReader.java deleted file mode 100644 index fc83e493e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/LineReader.java +++ /dev/null @@ -1,224 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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 - * Brock Janiczak <brockj@tpg.com.au> - Bug 181919 LineReader creating unneeded garbage - *******************************************************************************/ -package org.eclipse.compare.internal.core.patch; - -import java.io.BufferedReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.compare.internal.core.ComparePlugin; -import org.eclipse.compare.patch.ReaderCreator; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.Platform; - -public class LineReader { - - /* - * Reads the contents and returns them as a List of lines. - */ - public static List load(ReaderCreator content, boolean create) { - List lines = null; - BufferedReader bufferedReader = null; - if (!create && content != null && content.canCreateReader()) { - // read current contents - try { - bufferedReader = new BufferedReader(content.createReader()); - lines = readLines(bufferedReader); - } catch (CoreException ex) { - ComparePlugin.log(ex); - } finally { - if (bufferedReader != null) - try { - bufferedReader.close(); - } catch (IOException ex) { - // silently ignored - } - } - } - - if (lines == null) - lines = new ArrayList(); - return lines; - } - - public static List readLines(BufferedReader reader) { - List lines; - LineReader lr= new LineReader(reader); - if (!Platform.WS_CARBON.equals(Platform.getWS())) - lr.ignoreSingleCR(); // Don't treat single CRs as line feeds to be consistent with command line patch - lines= lr.readLines(); - return lines; - } - - /* - * Concatenates all strings found in the given List. - */ - public static String createString(boolean preserveLineDelimeters, List lines) { - StringBuffer sb= new StringBuffer(); - Iterator iter= lines.iterator(); - if (preserveLineDelimeters) { - while (iter.hasNext()) - sb.append((String)iter.next()); - } else { - String lineSeparator= System.getProperty("line.separator"); //$NON-NLS-1$ - while (iter.hasNext()) { - String line= (String)iter.next(); - int l= length(line); - if (l < line.length()) { // line has delimiter - sb.append(line.substring(0, l)); - sb.append(lineSeparator); - } else { - sb.append(line); - } - } - } - return sb.toString(); - } - - /* - * Returns the length (excluding a line delimiter CR, LF, CR/LF) - * of the given string. - */ - /* package */ static int length(String s) { - int l= s.length(); - if (l > 0) { - char c= s.charAt(l-1); - if (c == '\r') - return l-1; - if (c == '\n') { - if (l > 1 && s.charAt(l-2) == '\r') - return l-2; - return l-1; - } - } - return l; - } - - private boolean fHaveChar= false; - private int fLastChar; - private boolean fSawEOF= false; - private BufferedReader fReader; - private boolean fIgnoreSingleCR= false; - private StringBuffer fBuffer= new StringBuffer(); - - public LineReader(BufferedReader reader) { - this.fReader= reader; - Assert.isNotNull(reader); - } - - public void ignoreSingleCR() { - this.fIgnoreSingleCR= true; - } - - /** - * Reads a line of text. A line is considered to be terminated by any one - * of a line feed ('\n'), a carriage return ('\r'), or a carriage return - * followed immediately by a line-feed. - * @return A string containing the contents of the line including - * the line-termination characters, or <code>null</code> if the end of the - * stream has been reached - * @exception IOException If an I/O error occurs - */ - /* package */ String readLine() throws IOException { - try { - while (!this.fSawEOF) { - int c= readChar(); - if (c == -1) { - this.fSawEOF= true; - break; - } - this.fBuffer.append((char)c); - if (c == '\n') - break; - if (c == '\r') { - c= readChar(); - if (c == -1) { - this.fSawEOF= true; - break; // EOF - } - if (c != '\n') { - if (this.fIgnoreSingleCR) { - this.fBuffer.append((char)c); - continue; - } - this.fHaveChar= true; - this.fLastChar= c; - } else - this.fBuffer.append((char)c); - break; - } - } - - if (this.fBuffer.length() != 0) { - return this.fBuffer.toString(); - } - return null; - } finally { - this.fBuffer.setLength(0); - } - } - - /* package */ void close() { - try { - this.fReader.close(); - } catch (IOException ex) { - // silently ignored - } - } - - public List readLines() { - try { - List lines= new ArrayList(); - String line; - while ((line= readLine()) != null) - lines.add(line); - return lines; - } catch (IOException ex) { - // NeedWork - //System.out.println("error while reading file: " + fileName + "(" + ex + ")"); - } finally { - close(); - } - return null; - } - - /* - * Returns the number of characters in the given string without - * counting a trailing line separator. - */ - /* package */ int lineContentLength(String line) { - if (line == null) - return 0; - int length= line.length(); - for (int i= length-1; i >= 0; i--) { - char c= line.charAt(i); - if (c =='\n' || c == '\r') - length--; - else - break; - } - return length; - } - - //---- private - - private int readChar() throws IOException { - if (this.fHaveChar) { - this.fHaveChar= false; - return this.fLastChar; - } - return this.fReader.read(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/PatchReader.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/PatchReader.java deleted file mode 100644 index adf5deb6a..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/PatchReader.java +++ /dev/null @@ -1,683 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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.core.patch; - -import java.io.BufferedReader; -import java.io.IOException; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.StringTokenizer; - -import org.eclipse.compare.patch.IFilePatch2; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; - -import com.ibm.icu.text.DateFormat; -import com.ibm.icu.text.SimpleDateFormat; - -public class PatchReader { - - private static final boolean DEBUG= false; - - private static final String DEV_NULL= "/dev/null"; //$NON-NLS-1$ - - protected static final String MARKER_TYPE= "org.eclipse.compare.rejectedPatchMarker"; //$NON-NLS-1$ - - // diff formats - // private static final int CONTEXT= 0; - // private static final int ED= 1; - // private static final int NORMAL= 2; - // private static final int UNIFIED= 3; - - // we recognize the following date/time formats - private DateFormat[] fDateFormats= new DateFormat[] { - new SimpleDateFormat("EEE MMM dd kk:mm:ss yyyy"), //$NON-NLS-1$ - new SimpleDateFormat("yyyy/MM/dd kk:mm:ss"), //$NON-NLS-1$ - new SimpleDateFormat("EEE MMM dd kk:mm:ss yyyy", Locale.US) //$NON-NLS-1$ - }; - - private boolean fIsWorkspacePatch; - private DiffProject[] fDiffProjects; - private FilePatch2[] fDiffs; - - // API for writing new multi-project patch format - public static final String MULTIPROJECTPATCH_HEADER= "### Eclipse Workspace Patch"; //$NON-NLS-1$ - - public static final String MULTIPROJECTPATCH_VERSION= "1.0"; //$NON-NLS-1$ - - public static final String MULTIPROJECTPATCH_PROJECT= "#P"; //$NON-NLS-1$ - - /** - * Create a patch reader for the default date formats. - */ - public PatchReader() { - // nothing here - } - - /** - * Create a patch reader for the given date formats. - * - * @param dateFormats - * Array of <code>DateFormat</code>s to be used when - * extracting dates from the patch. - */ - public PatchReader(DateFormat[] dateFormats) { - this(); - this.fDateFormats = dateFormats; - } - - public void parse(BufferedReader reader) throws IOException { - List diffs= new ArrayList(); - HashMap diffProjects= new HashMap(4); - String line= null; - boolean reread= false; - String diffArgs= null; - String fileName= null; - // no project means this is a single patch,create a placeholder project for now - // which will be replaced by the target selected by the user in the preview pane - String projectName= ""; //$NON-NLS-1$ - this.fIsWorkspacePatch= false; - - LineReader lr= new LineReader(reader); - if (!Platform.WS_CARBON.equals(Platform.getWS())) - lr.ignoreSingleCR(); // Don't treat single CRs as line feeds to be consistent with command line patch - - // Test for our format - line= lr.readLine(); - if (line != null && line.startsWith(PatchReader.MULTIPROJECTPATCH_HEADER)) { - this.fIsWorkspacePatch= true; - } else { - parse(lr, line); - return; - } - - // read leading garbage - while (true) { - if (!reread) - line= lr.readLine(); - reread= false; - if (line == null) - break; - if (line.length() < 4) - continue; // too short - - if (line.startsWith(PatchReader.MULTIPROJECTPATCH_PROJECT)) { - projectName= line.substring(2).trim(); - continue; - } - - if (line.startsWith("Index: ")) { //$NON-NLS-1$ - fileName= line.substring(7).trim(); - continue; - } - if (line.startsWith("diff")) { //$NON-NLS-1$ - diffArgs= line.substring(4).trim(); - continue; - } - - if (line.startsWith("--- ")) { //$NON-NLS-1$ - // if there is no current project or - // the current project doesn't equal the newly parsed project - // reset the current project to the newly parsed one, create a new DiffProject - // and add it to the array - DiffProject diffProject; - if (!diffProjects.containsKey(projectName)) { - diffProject= new DiffProject(projectName); - diffProjects.put(projectName, diffProject); - } else { - diffProject= (DiffProject) diffProjects.get(projectName); - } - - line= readUnifiedDiff(diffs, lr, line, diffArgs, fileName, diffProject); - diffArgs= fileName= null; - reread= true; - } - } - - lr.close(); - - this.fDiffProjects= (DiffProject[]) diffProjects.values().toArray(new DiffProject[diffProjects.size()]); - this.fDiffs = (FilePatch2[]) diffs.toArray(new FilePatch2[diffs.size()]); - } - - protected FilePatch2 createFileDiff(IPath oldPath, long oldDate, - IPath newPath, long newDate) { - return new FilePatch2(oldPath, oldDate, newPath, newDate); - } - - private String readUnifiedDiff(List diffs, LineReader lr, String line, String diffArgs, String fileName, DiffProject diffProject) throws IOException { - List newDiffs= new ArrayList(); - String nextLine= readUnifiedDiff(newDiffs, lr, line, diffArgs, fileName); - for (Iterator iter= newDiffs.iterator(); iter.hasNext();) { - FilePatch2 diff= (FilePatch2) iter.next(); - diffProject.add(diff); - diffs.add(diff); - } - return nextLine; - } - - public void parse(LineReader lr, String line) throws IOException { - List diffs= new ArrayList(); - boolean reread= false; - String diffArgs= null; - String fileName= null; - List headerLines = new ArrayList(); - - // read leading garbage - reread= line!=null; - while (true) { - if (!reread) - line= lr.readLine(); - reread= false; - if (line == null) - break; - - // remember some infos - if (line.startsWith("Index: ")) { //$NON-NLS-1$ - fileName= line.substring(7).trim(); - } else if (line.startsWith("diff")) { //$NON-NLS-1$ - diffArgs= line.substring(4).trim(); - } else if (line.startsWith("--- ")) { //$NON-NLS-1$ - line= readUnifiedDiff(diffs, lr, line, diffArgs, fileName); - if (!headerLines.isEmpty()) - setHeader((FilePatch2)diffs.get(diffs.size() - 1), headerLines); - diffArgs= fileName= null; - reread= true; - } else if (line.startsWith("*** ")) { //$NON-NLS-1$ - line= readContextDiff(diffs, lr, line, diffArgs, fileName); - if (!headerLines.isEmpty()) - setHeader((FilePatch2)diffs.get(diffs.size() - 1), headerLines); - diffArgs= fileName= null; - reread= true; - } - - // Any lines we read here are header lines. - // However, if reread is set, we will add them to the header on the next pass through - if (!reread) { - headerLines.add(line); - } - } - - lr.close(); - - this.fDiffs = (FilePatch2[]) diffs.toArray(new FilePatch2[diffs.size()]); - } - - private void setHeader(FilePatch2 diff, List headerLines) { - String header = LineReader.createString(false, headerLines); - diff.setHeader(header); - headerLines.clear(); - } - - /* - * Returns the next line that does not belong to this diff - */ - protected String readUnifiedDiff(List diffs, LineReader reader, String line, String args, String fileName) throws IOException { - - String[] oldArgs= split(line.substring(4)); - - // read info about new file - line= reader.readLine(); - if (line == null || !line.startsWith("+++ ")) //$NON-NLS-1$ - return line; - - String[] newArgs= split(line.substring(4)); - - FilePatch2 diff = createFileDiff(extractPath(oldArgs, 0, fileName), - extractDate(oldArgs, 1), extractPath(newArgs, 0, fileName), - extractDate(newArgs, 1)); - diffs.add(diff); - - int[] oldRange= new int[2]; - int[] newRange= new int[2]; - List lines= new ArrayList(); - - boolean encounteredPlus = false; - boolean encounteredMinus = false; - boolean encounteredSpace = false; - - try { - // read lines of hunk - while (true) { - - line= reader.readLine(); - if (line == null) - return null; - - if (reader.lineContentLength(line) == 0) { - //System.out.println("Warning: found empty line in hunk; ignored"); - //lines.add(' ' + line); - continue; - } - - char c= line.charAt(0); - switch (c) { - case '@': - if (line.startsWith("@@ ")) { //$NON-NLS-1$ - // flush old hunk - if (lines.size() > 0) { - Hunk.createHunk(diff, oldRange, newRange, lines,encounteredPlus, encounteredMinus, encounteredSpace); - lines.clear(); - } - - // format: @@ -oldStart,oldLength +newStart,newLength @@ - extractPair(line, '-', oldRange); - extractPair(line, '+', newRange); - continue; - } - break; - case ' ': - encounteredSpace = true; - lines.add(line); - continue; - case '+': - encounteredPlus = true; - lines.add(line); - continue; - case '-': - encounteredMinus = true; - lines.add(line); - continue; - case '\\': - if (line.indexOf("newline at end") > 0) { //$NON-NLS-1$ - int lastIndex= lines.size(); - if (lastIndex > 0) { - line= (String) lines.get(lastIndex-1); - int end= line.length()-1; - char lc= line.charAt(end); - if (lc == '\n') { - end--; - if (end > 0 && line.charAt(end) == '\r') - end--; - } else if (lc == '\r') { - end--; - } - line= line.substring(0, end+1); - lines.set(lastIndex-1, line); - } - continue; - } - break; - default: - if (DEBUG) { - int a1= c, a2= 0; - if (line.length() > 1) - a2= line.charAt(1); - System.out.println("char: " + a1 + " " + a2); //$NON-NLS-1$ //$NON-NLS-2$ - } - break; - } - return line; - } - } finally { - if (lines.size() > 0) - Hunk.createHunk(diff, oldRange, newRange, lines, encounteredPlus, encounteredMinus, encounteredSpace); - } - } - - /* - * Returns the next line that does not belong to this diff - */ - private String readContextDiff(List diffs, LineReader reader, String line, String args, String fileName) throws IOException { - - String[] oldArgs= split(line.substring(4)); - - // read info about new file - line= reader.readLine(); - if (line == null || !line.startsWith("--- ")) //$NON-NLS-1$ - return line; - - String[] newArgs= split(line.substring(4)); - - FilePatch2 diff = createFileDiff(extractPath(oldArgs, 0, fileName), - extractDate(oldArgs, 1), extractPath(newArgs, 0, fileName), - extractDate(newArgs, 1)); - diffs.add(diff); - - int[] oldRange= new int[2]; - int[] newRange= new int[2]; - List oldLines= new ArrayList(); - List newLines= new ArrayList(); - List lines= oldLines; - - - boolean encounteredPlus = false; - boolean encounteredMinus = false; - boolean encounteredSpace = false; - - try { - // read lines of hunk - while (true) { - - line= reader.readLine(); - if (line == null) - return line; - - int l= line.length(); - if (l == 0) - continue; - if (l > 1) { - switch (line.charAt(0)) { - case '*': - if (line.startsWith("***************")) { // new hunk //$NON-NLS-1$ - // flush old hunk - if (oldLines.size() > 0 || newLines.size() > 0) { - Hunk.createHunk(diff, oldRange, newRange, unifyLines(oldLines, newLines), encounteredPlus, encounteredMinus, encounteredSpace); - oldLines.clear(); - newLines.clear(); - } - continue; - } - if (line.startsWith("*** ")) { // old range //$NON-NLS-1$ - // format: *** oldStart,oldEnd *** - extractPair(line, ' ', oldRange); - if (oldRange[0] == 0) { - oldRange[1] = 0; // In case of the file addition - } else { - oldRange[1] = oldRange[1] - oldRange[0] + 1; - } - lines= oldLines; - continue; - } - break; - case ' ': // context line - if (line.charAt(1) == ' ') { - lines.add(line); - continue; - } - break; - case '+': // addition - if (line.charAt(1) == ' ') { - encounteredPlus = true; - lines.add(line); - continue; - } - break; - case '!': // change - if (line.charAt(1) == ' ') { - encounteredSpace = true; - lines.add(line); - continue; - } - break; - case '-': - if (line.charAt(1) == ' ') { // deletion - encounteredMinus = true; - lines.add(line); - continue; - } - if (line.startsWith("--- ")) { // new range //$NON-NLS-1$ - // format: *** newStart,newEnd *** - extractPair(line, ' ', newRange); - if (newRange[0] == 0) { - newRange[1] = 0; // In case of the file removal - } else { - newRange[1] = newRange[1] - newRange[0] + 1; - } - lines= newLines; - continue; - } - break; - default: - break; - } - } - return line; - } - } finally { - // flush last hunk - if (oldLines.size() > 0 || newLines.size() > 0) - Hunk.createHunk(diff, oldRange, newRange, unifyLines(oldLines, newLines), encounteredPlus, encounteredMinus, encounteredSpace); - } - } - - /* - * Creates a List of lines in the unified format from - * two Lists of lines in the 'classic' format. - */ - private List unifyLines(List oldLines, List newLines) { - List result= new ArrayList(); - - String[] ol= (String[]) oldLines.toArray(new String[oldLines.size()]); - String[] nl= (String[]) newLines.toArray(new String[newLines.size()]); - - int oi= 0, ni= 0; - - while (true) { - - char oc= 0; - String o= null; - if (oi < ol.length) { - o= ol[oi]; - oc= o.charAt(0); - } - - char nc= 0; - String n= null; - if (ni < nl.length) { - n= nl[ni]; - nc= n.charAt(0); - } - - // EOF - if (oc == 0 && nc == 0) - break; - - // deletion in old - if (oc == '-') { - do { - result.add('-' + o.substring(2)); - oi++; - if (oi >= ol.length) - break; - o= ol[oi]; - } while (o.charAt(0) == '-'); - continue; - } - - // addition in new - if (nc == '+') { - do { - result.add('+' + n.substring(2)); - ni++; - if (ni >= nl.length) - break; - n= nl[ni]; - } while (n.charAt(0) == '+'); - continue; - } - - // differing lines on both sides - if (oc == '!' && nc == '!') { - // remove old - do { - result.add('-' + o.substring(2)); - oi++; - if (oi >= ol.length) - break; - o= ol[oi]; - } while (o.charAt(0) == '!'); - - // add new - do { - result.add('+' + n.substring(2)); - ni++; - if (ni >= nl.length) - break; - n= nl[ni]; - } while (n.charAt(0) == '!'); - - continue; - } - - // context lines - if (oc == ' ' && nc == ' ') { - do { - Assert.isTrue(o.equals(n), "non matching context lines"); //$NON-NLS-1$ - result.add(' ' + o.substring(2)); - oi++; - ni++; - if (oi >= ol.length || ni >= nl.length) - break; - o= ol[oi]; - n= nl[ni]; - } while (o.charAt(0) == ' ' && n.charAt(0) == ' '); - continue; - } - - if (oc == ' ') { - do { - result.add(' ' + o.substring(2)); - oi++; - if (oi >= ol.length) - break; - o= ol[oi]; - } while (o.charAt(0) == ' '); - continue; - } - - if (nc == ' ') { - do { - result.add(' ' + n.substring(2)); - ni++; - if (ni >= nl.length) - break; - n= nl[ni]; - } while (n.charAt(0) == ' '); - continue; - } - - Assert.isTrue(false, "unexpected char <" + oc + "> <" + nc + ">"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - return result; - } - - /* - * @return the parsed time/date in milliseconds or IFilePatch.DATE_UNKNOWN - * (0) on error - */ - private long extractDate(String[] args, int n) { - if (n < args.length) { - String line= args[n]; - for (int i= 0; i < this.fDateFormats.length; i++) { - this.fDateFormats[i].setLenient(true); - try { - Date date= this.fDateFormats[i].parse(line); - return date.getTime(); - } catch (ParseException ex) { - // silently ignored - } - } - // System.err.println("can't parse date: <" + line + ">"); - } - return IFilePatch2.DATE_UNKNOWN; - } - - /* - * Returns null if file name is "/dev/null". - */ - private IPath extractPath(String[] args, int n, String path2) { - if (n < args.length) { - String path= args[n]; - if (DEV_NULL.equals(path)) - return null; - int pos= path.lastIndexOf(':'); - if (pos >= 0) - path= path.substring(0, pos); - if (path2 != null && !path2.equals(path)) { - if (DEBUG) System.out.println("path mismatch: " + path2); //$NON-NLS-1$ - path= path2; - } - return new Path(path); - } - return null; - } - - /* - * Tries to extract two integers separated by a comma. - * The parsing of the line starts at the position after - * the first occurrence of the given character start an ends - * at the first blank (or the end of the line). - * If only a single number is found this is assumed to be the start of a one line range. - * If an error occurs the range -1,-1 is returned. - */ - private void extractPair(String line, char start, int[] pair) { - pair[0]= pair[1]= -1; - int startPos= line.indexOf(start); - if (startPos < 0) { - if (DEBUG) System.out.println("parsing error in extractPair: couldn't find \'" + start + "\'"); //$NON-NLS-1$ //$NON-NLS-2$ - return; - } - line= line.substring(startPos+1); - int endPos= line.indexOf(' '); - if (endPos < 0) { - if (DEBUG) System.out.println("parsing error in extractPair: couldn't find end blank"); //$NON-NLS-1$ - return; - } - line= line.substring(0, endPos); - int comma= line.indexOf(','); - if (comma >= 0) { - pair[0]= Integer.parseInt(line.substring(0, comma)); - pair[1]= Integer.parseInt(line.substring(comma+1)); - } else { // abbreviated form for one line patch - pair[0]= Integer.parseInt(line); - pair[1]= 1; - } - } - - - /* - * Breaks the given string into tab separated substrings. - * Leading and trailing whitespace is removed from each token. - */ - private String[] split(String line) { - List l= new ArrayList(); - StringTokenizer st= new StringTokenizer(line, "\t"); //$NON-NLS-1$ - while (st.hasMoreElements()) { - String token= st.nextToken().trim(); - if (token.length() > 0) - l.add(token); - } - return (String[]) l.toArray(new String[l.size()]); - } - - public boolean isWorkspacePatch() { - return this.fIsWorkspacePatch; - } - - public DiffProject[] getDiffProjects() { - return this.fDiffProjects; - } - - public FilePatch2[] getDiffs() { - return this.fDiffs; - } - - public FilePatch2[] getAdjustedDiffs() { - if (!isWorkspacePatch() || this.fDiffs.length == 0) - return this.fDiffs; - List result = new ArrayList(); - for (int i = 0; i < this.fDiffs.length; i++) { - FilePatch2 diff = this.fDiffs[i]; - result.add(diff.asRelativeDiff()); - } - return (FilePatch2[]) result.toArray(new FilePatch2[result.size()]); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/Utilities.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/Utilities.java deleted file mode 100644 index 6dfbfe2c9..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/internal/core/patch/Utilities.java +++ /dev/null @@ -1,23 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 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.internal.core.patch; - -import java.io.InputStreamReader; - -public class Utilities { - - public static String getCharset(Object resource) { - if (resource instanceof InputStreamReader) { - return ((InputStreamReader) resource).getEncoding(); - } - return null; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IFilePatch2.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IFilePatch2.java deleted file mode 100644 index 9138e8b68..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IFilePatch2.java +++ /dev/null @@ -1,89 +0,0 @@ -/******************************************************************************* - * Copyright (c) 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.patch; - -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; - -/** - * A representation of a file patch that can be applied to an input stream. - * - * @noimplement This interface is not intended to be implemented by clients. - * @since org.eclipse.compare.core 3.5 - */ -public interface IFilePatch2 { - - /** - * Special constant that will be returned from get getBeforeDate() or - * getAfterDate() if the date is unknown. Equal to Midnight, Jan 1, 1970 - * GMT. - */ - public static long DATE_UNKNOWN = 0; - - /** - * Return the target path for this patch. The target path may differ - * depending on whether the patch is being reversed or not. - * - * @param configuration - * the patch configuration - * @return the target path for this patch - * @see PatchConfiguration#isReversed() - */ - public IPath getTargetPath(PatchConfiguration configuration); - - /** - * Apply this patch to the given contents. The result provides the - * original and patch contents and also indicates whether some portions of - * the patch (called hunks) failed to apply. - * - * @param content - * the contents - * @param configuration - * the patch configuration - * @param monitor - * a progress monitor - * @return the result of the patch application - */ - public IFilePatchResult apply(ReaderCreator content, - PatchConfiguration configuration, IProgressMonitor monitor); - - /** - * Return the header information of the patch or <code>null</code> if there - * was no header text. The header may be multi-line. - * - * @return the header information of the patch or <code>null</code> - */ - public String getHeader(); - - /** - * Returns the milliseconds time value of the before date from the patch, or - * DATE_UNKNOWN if the date is unknown. - * - * @return milliseconds time value of the before date from the patch - */ - public long getBeforeDate(); - - /** - * Returns the milliseconds time value of the after date from the patch, or - * DATE_UNKNOWN if the date is unknown. - * - * @return milliseconds time value of the after date from the patch - */ - public long getAfterDate(); - - /** - * Returns all the hunks this file patch contains. - * - * @return array of hunks - */ - public IHunk[] getHunks(); - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IFilePatchResult.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IFilePatchResult.java deleted file mode 100644 index 9c0667f11..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IFilePatchResult.java +++ /dev/null @@ -1,90 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 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.patch; - -import java.io.InputStream; - -import org.eclipse.core.runtime.CoreException; - -/** - * A file patch result provides the results of an attempt to apply an - * {@link IFilePatch2} to the contents of a file. * - * - * @see IFilePatch2 - * @since 3.3 - * @noimplement This interface is not intended to be implemented by clients. - * Clients can obtain patch results from an {@link IFilePatch2}. - */ -public interface IFilePatchResult { - - /** - * Return a stream the contains the original contents of the file before - * any portions of the patch have been applied. - * @return a stream to the original contents of the file before - * any portions of the patch have been applied - * @see #getPatchedContents() - */ - public InputStream getOriginalContents(); - - /** - * Return a stream that contains the file with as much of the patch - * applied as possible. if {@link #hasMatches()} returns <code>false</code> - * then the patched contents will match the original contents. Otherwise, - * at least a portion of the patch could be successfully applied. if - * {@link #hasRejects()} returns <code>false</code>, then the entire patch was - * applied. Otherwise, portions could not be applied. The portions that could - * not be applied can be obtained by calling {@link #getRejects()}. - * - * @return a stream that contains the file with as much of the patch - * applied as possible. - */ - public InputStream getPatchedContents(); - - /** - * Return whether the patch has portions that were successfully applied. - * @return whether the patch has portions that were successfully applied - * @see #getPatchedContents() - */ - public boolean hasMatches(); - - /** - * Return whether the patch has portions that were not successfully applied. - * @return whether the patch has portions that were not successfully applied - * @see #getPatchedContents() - */ - public boolean hasRejects(); - - /** - * Return the portions of the patch (referred to a hunks) that could not - * be applied. - * @return the portions of the patch (referred to a hunks) that could not - * be applied - * @see #getPatchedContents() - */ - public IHunk[] getRejects(); - - /** - * Returns the name of a charset encoding to be used when decoding the contents - * of this result into characters. Returns <code>null</code> if a proper - * encoding cannot be determined. - * <p> - * Note that this method does not check whether the result is a supported - * charset name. Callers should be prepared to handle - * <code>UnsupportedEncodingException</code> where this charset is used. - * </p> - * - * @return the name of a charset, or <code>null</code> - * @exception CoreException if an error happens while determining - * the charset. See any refinements for more information. - */ - public String getCharset() throws CoreException; - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IHunk.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IHunk.java deleted file mode 100644 index b918e0d0f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IHunk.java +++ /dev/null @@ -1,98 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 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.patch; - -import java.io.InputStream; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; - -/** - * Interface that represents a hunk. A hunk is a portion of a patch. It - * identifies where the hunk is to be located in the target file. One use of - * this interface is a means to communicate to content merge viewers that one of - * the sides of a compare input is a patch hunk. Clients can determine which - * side it is by adapting the side to this interface (see {@link IAdaptable}. - * - * @since 3.3 - * @noimplement This interface is not intended to be implemented by clients but - * can be obtained from an {@link IFilePatchResult} - */ -public interface IHunk { - - /** - * Return a label that can be used to describe the hunk. - * @return a label that can be used to describe the hunk - */ - public String getLabel(); - - /** - * Return the start position of the hunk in the target file. - * - * @return the start position of the hunk in the target file. - */ - public int getStartPosition(); - - /** - * Returns hunk's content in the unified format. This is an internal format in - * which hunk stores its content and is always the same even if the hunk was - * extracted from a patch stored in a different format. In the unified format - * each line is prefixed with one of the following: - * <ul> - * <li> <code>' '</code> for context - * <li> <code>'+'</code> for addition - * <li> <code>'-'</code> for removal - * </ul> - * - * @return hunk's content in the unified format - * @since org.eclipse.compare 3.5 - */ - public String[] getUnifiedLines(); - - /** - * Return the original contents from which the hunk was generated. - * The returned contents usually only represent a portion of the - * file from which the hunk was generated. - * @return the original contents from which the hunk was generated - */ - public InputStream getOriginalContents(); - - /** - * Return the contents that contain the modifications for this hunk. - * The returned contents usually only represent a portion of the - * file that was modified. - * @return the contents that contain the modifications for this hunk - */ - public InputStream getPatchedContents(); - - /** - * Returns the name of a charset encoding to be used when decoding the contents - * of this hunk into characters. Returns <code>null</code> if a proper - * encoding cannot be determined. - * <p> - * Note that this method does not check whether the result is a supported - * charset name. Callers should be prepared to handle - * <code>UnsupportedEncodingException</code> where this charset is used. - * </p> - * - * @return the name of a charset, or <code>null</code> - * @exception CoreException if an error happens while determining - * the charset. See any refinements for more information. - * @deprecated This method can be called before the first attempt to apply - * the hunk when it is impossible to determine the encoding and - * in this case it always returns null. Please see - * {@link IFilePatchResult#getCharset()} as a proper way to - * obtain charset. - */ - public String getCharset() throws CoreException; - - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IHunkFilter.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IHunkFilter.java deleted file mode 100644 index c32079fc6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/IHunkFilter.java +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 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.patch; - -/** - * Filter that is used to determine if a hunk should be applied or not - * - * @since org.eclipse.compare.core 3.5 - */ -public interface IHunkFilter { - - /** - * Returns true if the given hunk should be applied - * - * @param hunk - * the hunk - * @return true if the given hunk should be applied - */ - public boolean select(IHunk hunk); - -}
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/PatchBuilder.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/PatchBuilder.java deleted file mode 100644 index 40d717758..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/PatchBuilder.java +++ /dev/null @@ -1,250 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2010 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.patch; - -import java.util.Arrays; -import java.util.Comparator; - -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.compare.internal.core.patch.Hunk; -import org.eclipse.core.runtime.IPath; - -/** - * Builder for creating IFilePatch2 and IHunk objects as well as building - * relationship between them. - * - * @noextend This class is not intended to be subclassed by clients. - * @noinstantiate This class is not intended to be instantiated by clients. - * - * @since org.eclipse.compare.core 3.5 - */ -public class PatchBuilder { - - /** - * Line prefix used to mark context lines. - */ - public static final char CONTEXT_PREFIX = ' '; - /** - * Line prefix used to mark an added lines. - */ - public static final char ADDITION_PREFIX = '+'; - /** - * Line prefix used to mark an removed lines. - */ - public static final char REMOVAL_PREFIX = '-'; - - /** - * Creates an IHunk instance. - * - * @param start - * the start position in the before file - * @param lines - * content of the hunk. Each line starts with a control - * character. Their meaning is as follows: - * <ul> - * <li> - * '+': add the line - * <li> - * '-': delete the line - * <li> - * ' ': no change, context line - * </ul> - * @return IHunk instance - */ - public static IHunk createHunk(int start, String[] lines) { - int type = getHunkType(lines); - int oldLength = getHunkLength(lines, true); - int newLength = getHunkLength(lines, false); - return new Hunk(null, type, start, oldLength, start, newLength, lines); - } - - /** - * Creates an IFilePatch2 instance and performs recalculation of all hunks' - * after positions. Hunk's after position is position in the file state - * after applying a patch. It is affected by all the hunks that are to be - * applied before a given one. This recalculation is necessary to keep - * IFilePatch2's state coherent. - * - * @param oldPath - * the path of the before state of the file - * @param oldDate - * the timestamp of the before state of the file, see also - * {@link IFilePatch2#DATE_UNKNOWN} - * @param newPath - * the path of the after state of the file - * @param newDate - * the timestamp of the after state of the file, see also - * {@link IFilePatch2#DATE_UNKNOWN} - * @param hunks - * a set of hunks to insert into IFilePatch2 - * @return IFilePatch2 instance - */ - public static IFilePatch2 createFilePatch(IPath oldPath, long oldDate, - IPath newPath, long newDate, IHunk[] hunks) { - reorder(hunks); - FilePatch2 fileDiff = new FilePatch2(oldPath, oldDate, newPath, newDate); - for (int i = 0; i < hunks.length; i++) { - fileDiff.add((Hunk) hunks[i]); - } - return fileDiff; - } - - /** - * Adds IHunks to a given IFilePatch2 and performs recalculation of all - * hunks' after positions. Hunk's after position is position in the file - * state after applying a patch. It is affected by all the hunks that are to - * be applied before a given one. This recalculation is necessary to keep - * IFilePatch2's state coherent. - * - * @param filePatch - * a file patch to add hunks to - * @param toAdd - * a set of IHunks to add - * @return newly created file patch with added hunks - */ - public static IFilePatch2 addHunks(IFilePatch2 filePatch, IHunk[] toAdd) { - IHunk[] result = addHunks(filePatch.getHunks(), toAdd); - reorder(result); - return createFilePatch(filePatch, result); - } - - /** - * Removes IHunks from a given IFilePatch2 and performs recalculation of all - * hunks' after positions. Hunk's after position is position in the file - * state after applying a patch. It is affected by all the hunks that are to - * be applied before a given one. This recalculation is necessary to keep - * IFilePatch2's state coherent. - * - * @param filePatch - * a file patch to add hunks to - * @param toRemove - * a set of IHunks to add - * @return newly created file patch with removed hunks - */ - public static IFilePatch2 removeHunks(IFilePatch2 filePatch, - IHunk[] toRemove) { - IHunk[] result = removeHunks(filePatch.getHunks(), toRemove); - reorder(result); - return createFilePatch(filePatch, result); - } - - private static IFilePatch2 createFilePatch(IFilePatch2 filePatch, - IHunk[] hunks) { - PatchConfiguration config = new PatchConfiguration(); - IPath beforePath = filePatch.getTargetPath(config); - config.setReversed(true); - IPath afterPath = filePatch.getTargetPath(config); - return createFilePatch(beforePath, filePatch.getBeforeDate(), - afterPath, filePatch.getAfterDate(), hunks); - } - - private static int getHunkType(String[] lines) { - boolean hasContextLines = checkForPrefix(CONTEXT_PREFIX, lines); - if (!hasContextLines) { - boolean hasLineAdditions = checkForPrefix(ADDITION_PREFIX, lines); - boolean hasLineDeletions = checkForPrefix(REMOVAL_PREFIX, lines); - if (hasLineAdditions && !hasLineDeletions) { - return FilePatch2.ADDITION; - } else if (!hasLineAdditions && hasLineDeletions) { - return FilePatch2.DELETION; - } - } - return FilePatch2.CHANGE; - } - - private static int getHunkLength(String[] lines, boolean old) { - int length = 0; - for (int i = 0; i < lines.length; i++) { - if (lines[i].length() > 0) { - switch (lines[i].charAt(0)) { - case ' ': - length++; - break; - case '+': - if (!old) { - length++; - } - break; - case '-': - if (old) { - length++; - } - break; - default: - throw new IllegalArgumentException(""); //$NON-NLS-1$ - } - } - } - return length; - } - - private static boolean checkForPrefix(char prefix, String[] lines) { - for (int i = 0; i < lines.length; i++) { - if (lines[i].length() > 0) { - if (lines[i].charAt(0) == prefix) { - return true; - } - } - } - return false; - } - - private static IHunk[] addHunks(IHunk[] hunks, IHunk[] toAdd) { - IHunk[] ret = new IHunk[hunks.length + toAdd.length]; - System.arraycopy(hunks, 0, ret, 0, hunks.length); - System.arraycopy(toAdd, 0, ret, hunks.length, toAdd.length); - return ret; - } - - private static IHunk[] removeHunks(IHunk[] hunks, IHunk[] toRemove) { - int removed = 0; - for (int i = 0; i < hunks.length; i++) { - for (int j = 0; j < toRemove.length; j++) { - if (toRemove[j] == hunks[i]) { - hunks[i] = null; - removed++; - } - } - } - IHunk[] ret = new IHunk[hunks.length - removed]; - for (int i = 0, j = 0; i < hunks.length; i++) { - if (hunks[i] != null) { - ret[j++] = hunks[i]; - } - } - return ret; - } - - private static void reorder(IHunk[] hunks) { - Arrays.sort(hunks, new HunkComparator()); - int shift = 0; - for (int i = 0; i < hunks.length; i++) { - Hunk hunk = (Hunk) hunks[i]; - int start = hunk.getStart(false) + shift; - hunk.setStart(start, true); - shift += hunk.getLength(true) - hunk.getLength(false); - } - } - - static class HunkComparator implements Comparator { - public int compare(Object arg0, Object arg1) { - if ((arg0 != null && arg0 instanceof Hunk) - && (arg1 != null && arg1 instanceof Hunk)) { - Hunk hunk0 = (Hunk) arg0; - Hunk hunk1 = (Hunk) arg1; - int shift = hunk0.getStart(true) - hunk1.getStart(true); - return shift; - } - return 0; - } - } - -}
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/PatchConfiguration.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/PatchConfiguration.java deleted file mode 100644 index 2266965fb..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/PatchConfiguration.java +++ /dev/null @@ -1,158 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 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.patch; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -/** - * A patch configuration allows clients to set parameters that control how a - * patch is applied. - * - * @see IFilePatch2 - * @since 3.3 - * @noextend This class may be instantiated by clients but is not intended to be - * subclassed. - */ -public class PatchConfiguration { - - private int fStripPrefixSegments; - private int fFuzz; - private boolean fIgnoreWhitespace= false; - private boolean fReverse= false; - private HashMap properties = new HashMap(); - private List hunkFilters = new ArrayList(); - - /** - * Return whether the patch should be reversed when applied. - * @return whether the patch should be reversed when applied - */ - public boolean isReversed() { - return this.fReverse; - } - - /** - * Set whether the patch should be reversed when applied. - * @param reversed whether the patch should be reversed when applied - */ - public void setReversed(boolean reversed) { - this.fReverse = reversed; - } - - /** - * Return the number of prefix segments to be stripped when attempting - * to apply a patch. - * @return the number of prefix segments to be stripped when attempting - * to apply a patch - */ - public int getPrefixSegmentStripCount() { - return this.fStripPrefixSegments; - } - - /** - * Set the number of prefix segments to be stripped when attempting - * to apply a patch. - * @param stripCount the number of prefix segments to be stripped when attempting - * to apply a patch. - */ - public void setPrefixSegmentStripCount(int stripCount) { - this.fStripPrefixSegments = stripCount; - } - - /** - * Return the fuzz factor to be used when applying a patch. - * If the fuzz factor is set to -1, then the patcher is to make a best - * effort to apply the patch by adjusting the fuzz factor - * accordingly. - * @return the fuzz factor to be used when applying a patch. - */ - public int getFuzz() { - return this.fFuzz; - } - - /** - * Set the fuzz factor to be used when applying a patch. - * @param fuzz the fuzz factor to be used when applying a patch. - */ - public void setFuzz(int fuzz) { - this.fFuzz = fuzz; - } - - /** - * Return whether whitespace should be ignored. - * @return whether whitespace should be ignored - */ - public boolean isIgnoreWhitespace() { - return this.fIgnoreWhitespace; - } - - /** - * Set whether whitespace should be ignored - * @param ignoreWhitespace whether whitespace should be ignored - */ - public void setIgnoreWhitespace(boolean ignoreWhitespace) { - this.fIgnoreWhitespace = ignoreWhitespace; - } - - /** - * Return the property associated with the given key or - * <code>null</code> if there is no property for the key. - * @param key the key - * @return the property associated with the given key or - * <code>null</code> - */ - public Object getProperty(String key) { - return this.properties.get(key); - } - - /** - * Set the property associated with the given key - * @param key the key - * @param value the value to be associated with the key - */ - public void setProperty(String key, Object value) { - this.properties.put(key, value); - } - - /** - * Adds a hunk filter. - * - * @param filter the filter - * @since org.eclipse.compare.core 3.5 - */ - public void addHunkFilter(IHunkFilter filter) { - this.hunkFilters.add(filter); - } - - /** - * Removes a hunk filter. - * - * @param filter the filter - * @since org.eclipse.compare.core 3.5 - */ - public void removeHunkFilter(IHunkFilter filter) { - this.hunkFilters.remove(filter); - } - - /** - * Return an array of hunk filters that have been added to this - * configuration. - * - * @return an array of hunk filters that have been added to this configuration - * @since org.eclipse.compare.core 3.5 - */ - public IHunkFilter[] getHunkFilters() { - return (IHunkFilter[]) this.hunkFilters.toArray(new IHunkFilter[this.hunkFilters - .size()]); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/PatchParser.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/PatchParser.java deleted file mode 100644 index cd77da853..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/PatchParser.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 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.patch; - -import java.io.BufferedReader; -import java.io.IOException; - -import org.eclipse.compare.internal.core.ComparePlugin; -import org.eclipse.compare.internal.core.patch.PatchReader; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; - -/** - * Helper class for parsing patches. - * - * @since org.eclipse.compare.core 3.5 - */ -public class PatchParser { - - /** - * Parse the given patch and return the set of file patches that it - * contains. - * - * @param content - * a patch reader creator - * @return the set of file patches that the patch contains - * @throws CoreException - * if an error occurs reading the contents - */ - public static IFilePatch2[] parsePatch(ReaderCreator content) - throws CoreException { - BufferedReader reader = new BufferedReader(content.createReader()); - try { - PatchReader patchReader = new PatchReader(); - patchReader.parse(reader); - return patchReader.getAdjustedDiffs(); - } catch (IOException e) { - throw new CoreException(new Status(IStatus.ERROR, - ComparePlugin.PLUGIN_ID, 0, e.getMessage(), e)); - } finally { - try { - reader.close(); - } catch (IOException e) { - // ignored - } - } - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/ReaderCreator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/ReaderCreator.java deleted file mode 100644 index e5846bd9e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/ReaderCreator.java +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * Copyright (c) 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.patch; - -import java.io.Reader; - -import org.eclipse.core.runtime.CoreException; - -/** - * Abstract class for creating readers. - * - * @since org.eclipse.compare.core 3.5 - */ -public abstract class ReaderCreator { - - /** - * Creates new reader. The caller is responsible for closing the reader when - * finished. - * - * @return a reader - * @exception CoreException - * if the reader can't be created - */ - public abstract Reader createReader() throws CoreException; - - /** - * Returns whether the reader can be created. - * - * @return true if the reader can be created, false otherwise - */ - public boolean canCreateReader() { - return true; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/package.html b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/package.html deleted file mode 100644 index e1c40fd3d..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/patch/package.html +++ /dev/null @@ -1,15 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> - <title>Package-level Javadoc</title> -</head> -<body> -Provides support for applying and working with patches. -<h2> -Package Specification</h2> -<p> -This package specifies API for applying and working with patches. -</p> -</body> -</html> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/AbstractRangeDifferenceFactory.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/AbstractRangeDifferenceFactory.java deleted file mode 100644 index 04af7cb4f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/AbstractRangeDifferenceFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * Copyright (c) 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.rangedifferencer; - -/** - * @since org.eclipse.compare.core 3.5 - */ -public abstract class AbstractRangeDifferenceFactory { - protected abstract RangeDifference createRangeDifference(); - - RangeDifference createRangeDifference(int changeKind) { - RangeDifference rangeDifference = createRangeDifference(); - rangeDifference.kind = changeKind; - return rangeDifference; - } - - RangeDifference createRangeDifference(int kind, int rightStart, - int rightLength, int leftStart, int leftLength) { - RangeDifference rangeDifference = createRangeDifference(); - rangeDifference.kind = kind; - rangeDifference.rightStart = rightStart; - rangeDifference.rightLength = rightLength; - rangeDifference.leftStart = leftStart; - rangeDifference.leftLength = leftLength; - return rangeDifference; - } - - RangeDifference createRangeDifference(int kind, int rightStart, - int rightLength, int leftStart, int leftLength, int ancestorStart, - int ancestorLength) { - RangeDifference rangeDifference = createRangeDifference(); - rangeDifference.kind = kind; - rangeDifference.rightStart = rightStart; - rangeDifference.rightLength = rightLength; - rangeDifference.leftStart = leftStart; - rangeDifference.leftLength = leftLength; - rangeDifference.ancestorStart = ancestorStart; - rangeDifference.ancestorLength = ancestorLength; - return rangeDifference; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/DifferencesIterator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/DifferencesIterator.java deleted file mode 100644 index d42c4bda3..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/DifferencesIterator.java +++ /dev/null @@ -1,77 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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.rangedifferencer; - -import java.util.ArrayList; -import java.util.List; - -/** - * A custom iterator to iterate over a List of <code>RangeDifferences</code>. - * It is used internally by the <code>RangeDifferencer</code>. - */ -/* package */ class DifferencesIterator { - - List fRange; - int fIndex; - RangeDifference[] fArray; - RangeDifference fDifference; - - /* - * Creates a differences iterator on an array of <code>RangeDifference</code>s. - */ - DifferencesIterator(RangeDifference[] differenceRanges) { - - this.fArray= differenceRanges; - this.fIndex= 0; - this.fRange= new ArrayList(); - if (this.fIndex < this.fArray.length) - this.fDifference= this.fArray[this.fIndex++]; - else - this.fDifference= null; - } - - /* - * Returns the number of RangeDifferences - */ - int getCount() { - return this.fRange.size(); - } - - /* - * Appends the edit to its list and moves to the next <code>RangeDifference</code>. - */ - void next() { - this.fRange.add(this.fDifference); - if (this.fDifference != null) { - if (this.fIndex < this.fArray.length) - this.fDifference= this.fArray[this.fIndex++]; - else - this.fDifference= null; - } - } - - /* - * Difference iterators are used in pairs. - * This method returns the other iterator. - */ - DifferencesIterator other(DifferencesIterator right, DifferencesIterator left) { - if (this == right) - return left; - return right; - } - - /* - * Removes all <code>RangeDifference</code>s - */ - void removeAll() { - this.fRange.clear(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/IRangeComparator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/IRangeComparator.java deleted file mode 100644 index 6af289eef..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/IRangeComparator.java +++ /dev/null @@ -1,60 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.rangedifferencer; - -/** - * For breaking an object to compare into a sequence of comparable entities. - * <p> - * It is used by <code>RangeDifferencer</code> to find longest sequences of - * matching and non-matching ranges. - * <p> - * For example, to compare two text documents and find longest common sequences - * of matching and non-matching lines, the implementation must break the document - * into lines. <code>getRangeCount</code> would return the number of lines in the - * document, and <code>rangesEqual</code> would compare a specified line given - * with one in another <code>IRangeComparator</code>. - * </p> - * <p> - * Clients should implement this interface; there is no standard implementation. - * </p> - */ -public interface IRangeComparator { - - /** - * Returns the number of comparable entities. - * - * @return the number of comparable entities - */ - int getRangeCount(); - - /** - * Returns whether the comparable entity given by the first index - * matches an entity specified by the other <code>IRangeComparator</code> and index. - * - * @param thisIndex the index of the comparable entity within this <code>IRangeComparator</code> - * @param other the IRangeComparator to compare this with - * @param otherIndex the index of the comparable entity within the other <code>IRangeComparator</code> - * @return <code>true</code> if the comparable entities are equal - */ - boolean rangesEqual(int thisIndex, IRangeComparator other, int otherIndex); - - /** - * Returns whether a comparison should be skipped because it would be too costly (or lengthy). - * - * @param length a number on which to base the decision whether to return - * <code>true</code> or <code>false</code> - * @param maxLength another number on which to base the decision whether to return - * <code>true</code> or <code>false</code> - * @param other the other <code>IRangeComparator</code> to compare with - * @return <code>true</code> to avoid a too lengthy range comparison - */ - boolean skipRangeComparison(int length, int maxLength, IRangeComparator other); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/RangeComparatorLCS.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/RangeComparatorLCS.java deleted file mode 100644 index 3689800b2..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/RangeComparatorLCS.java +++ /dev/null @@ -1,192 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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.rangedifferencer; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.compare.internal.core.LCS; -import org.eclipse.compare.internal.core.Messages; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.SubMonitor; - -/* package */ class RangeComparatorLCS extends LCS { - - private final IRangeComparator comparator1, comparator2; - private int[][] lcs; - - public static RangeDifference[] findDifferences(AbstractRangeDifferenceFactory factory, IProgressMonitor pm, IRangeComparator left, IRangeComparator right) { - RangeComparatorLCS lcs = new RangeComparatorLCS(left, right); - SubMonitor monitor = SubMonitor.convert(pm, Messages.RangeComparatorLCS_0, 100); - try { - lcs.longestCommonSubsequence(monitor.newChild(95)); - return lcs.getDifferences(monitor.newChild(5), factory); - } finally { - if (pm != null) - pm.done(); - } - } - - public RangeComparatorLCS(IRangeComparator comparator1, IRangeComparator comparator2) { - this.comparator1 = comparator1; - this.comparator2 = comparator2; - } - - protected int getLength1() { - return this.comparator1.getRangeCount(); - } - - protected int getLength2() { - return this.comparator2.getRangeCount(); - } - - protected void initializeLcs(int lcsLength) { - this.lcs = new int[2][lcsLength]; - } - - protected boolean isRangeEqual(int i1, int i2) { - return this.comparator1.rangesEqual(i1, this.comparator2, i2); - } - - protected void setLcs(int sl1, int sl2) { - // Add one to the values so that 0 can mean that the slot is empty - this.lcs[0][sl1] = sl1 + 1; - this.lcs[1][sl1] = sl2 + 1; - } - - public RangeDifference[] getDifferences(SubMonitor subMonitor, AbstractRangeDifferenceFactory factory) { - try { - List differences = new ArrayList(); - int length = getLength(); - if (length == 0) { - differences.add(factory.createRangeDifference(RangeDifference.CHANGE, 0, this.comparator2.getRangeCount(), 0, this.comparator1.getRangeCount())); - } else { - subMonitor.beginTask(null, length); - int index1, index2; - index1 = index2 = 0; - int l1, l2; - int s1 = -1; - int s2 = -1; - while(index1 < this.lcs[0].length && index2 < this.lcs[1].length) { - // Move both LCS lists to the next occupied slot - while ((l1= this.lcs[0][index1]) == 0) { - index1++; - if (index1 >= this.lcs[0].length) - break; - } - if (index1 >= this.lcs[0].length) - break; - while ((l2= this.lcs[1][index2]) == 0) { - index2++; - if (index2 >= this.lcs[1].length) - break; - } - if (index2 >= this.lcs[1].length) - break; - // Convert the entry to an array index (see setLcs(int, int)) - int end1 = l1 - 1; - int end2 = l2 - 1; - if (s1 == -1 && (end1 != 0 || end2 != 0)) { - // There is a diff at the beginning - // TODO: We need to conform that this is the proper order - differences.add(factory.createRangeDifference(RangeDifference.CHANGE, 0, end2, 0, end1)); - } else if (end1 != s1 + 1 || end2 != s2 + 1) { - // A diff was found on one of the sides - int leftStart = s1 + 1; - int leftLength = end1 - leftStart; - int rightStart = s2 + 1; - int rightLength = end2 - rightStart; - // TODO: We need to conform that this is the proper order - differences.add(factory.createRangeDifference(RangeDifference.CHANGE, rightStart, rightLength, leftStart, leftLength)); - } - s1 = end1; - s2 = end2; - index1++; - index2++; - worked(subMonitor, 1); - } - if (s1 != -1 && (s1 + 1 < this.comparator1.getRangeCount() || s2 + 1 < this.comparator2.getRangeCount())) { - // TODO: we need to find the proper way of representing an append - int leftStart = s1 < this.comparator1.getRangeCount() ? s1 + 1 : s1; - int rightStart = s2 < this.comparator2.getRangeCount() ? s2 + 1 : s2; - // TODO: We need to confirm that this is the proper order - differences.add(factory.createRangeDifference(RangeDifference.CHANGE, rightStart, this.comparator2.getRangeCount() - (s2 + 1), leftStart, this.comparator1.getRangeCount() - (s1 + 1))); - } - - } - return (RangeDifference[]) differences.toArray(new RangeDifference[differences.size()]); - } finally { - subMonitor.done(); - } - } - - private void worked(SubMonitor subMonitor, int work) { - if (subMonitor.isCanceled()) - throw new OperationCanceledException(); - subMonitor.worked(work); - } - - /** - * This method takes an LCS result interspersed with zeros (i.e. empty slots - * from the LCS algorithm), compacts it and shifts the LCS chunks as far towards - * the front as possible. This tends to produce good results most of the time. - * - * @param lcsSide A subsequence of original, presumably it is the LCS of it and - * some other collection of lines - * @param length The number of non-empty (i.e non-zero) entries in LCS - * @param comparator The comparator used to generate the LCS - */ - private void compactAndShiftLCS(int[] lcsSide, int length, - IRangeComparator comparator) { - // If the LCS is empty, just return - if (length == 0) - return; - // Skip any leading empty slots - int j = 0; - while (lcsSide[j] == 0) { - j++; - } - // Put the first non-empty value in position 0 - lcsSide[0] = lcsSide[j]; - j++; - // Push all non-empty values down into the first N slots (where N is the length) - for (int i = 1; i < length; i++) { - while (lcsSide[j] == 0) { - j++; - } - // Push the difference down as far as possible by comparing the line at the - // start of the diff with the line and the end and adjusting if they are the same - int nextLine = lcsSide[i - 1] + 1; - if (nextLine != lcsSide[j] && comparator.rangesEqual(nextLine - 1, comparator, lcsSide[j] - 1)) { - lcsSide[i] = nextLine; - } else { - lcsSide[i] = lcsSide[j]; - } - j++; - } - // Zero all slots after the length - for (int i = length; i < lcsSide.length; i++) { - lcsSide[i] = 0; - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.internal.LCS#longestCommonSubsequence(org.eclipse.core.runtime.SubMonitor) - */ - public void longestCommonSubsequence(SubMonitor subMonitor) { - super.longestCommonSubsequence(subMonitor); - if (this.lcs != null) { // The LCS can be null if one of the sides is empty - compactAndShiftLCS(this.lcs[0], getLength(), this.comparator1); - compactAndShiftLCS(this.lcs[1], getLength(), this.comparator2); - } - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/RangeDifference.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/RangeDifference.java deleted file mode 100644 index 9881bc14a..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/RangeDifference.java +++ /dev/null @@ -1,326 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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.rangedifferencer; - -/** - * Description of a change between two or three ranges of comparable entities. - * <p> - * <code>RangeDifference</code> objects are the elements of a compare result returned from - * the <code>RangeDifferencer</code> <code>find* </code> methods. - * Clients use these objects as they are returned from the differencer. - * This class is not intended to be instantiated outside of the Compare framework. - * <p> - * Note: A range in the <code>RangeDifference</code> object is given as a start index - * and length in terms of comparable entities. However, these entity indices and counts - * are not necessarily character positions. For example, if an entity represents a line - * in a document, the start index would be a line number and the count would be in lines. - * </p> - * - * @see RangeDifferencer - * @noinstantiate This class is not intended to be instantiated by clients. - */ -public class RangeDifference { - - /** Two-way change constant indicating no change. */ - public final static int NOCHANGE = 0; - - /** - * Two-way change constant indicating two-way change (same as - * <code>RIGHT</code>) - */ - public final static int CHANGE = 2; - - /** Three-way change constant indicating a change in both right and left. */ - public final static int CONFLICT = 1; - - /** Three-way change constant indicating a change in right. */ - public final static int RIGHT = 2; - - /** Three-way change constant indicating a change in left. */ - public final static int LEFT = 3; - - /** - * Three-way change constant indicating the same change in both right and - * left, that is only the ancestor is different. - */ - public final static int ANCESTOR = 4; - - /** Constant indicating an unknown change kind. */ - public final static int ERROR = 5; - - /** - * the kind of change: NOCHANGE, CHANGE, LEFT, RIGHT, ANCESTOR, CONFLICT, - * ERROR - * - * @since org.eclipse.compare.core 3.5 - */ - protected int kind; - - /** - * @since org.eclipse.compare.core 3.5 - */ - protected int leftStart; - - /** - * @since org.eclipse.compare.core 3.5 - */ - protected int leftLength; - - /** - * @since org.eclipse.compare.core 3.5 - */ - protected int rightStart; - - /** - * @since org.eclipse.compare.core 3.5 - */ - protected int rightLength; - - /** - * @since org.eclipse.compare.core 3.5 - */ - protected int ancestorStart; - - /** - * @since org.eclipse.compare.core 3.5 - */ - protected int ancestorLength; - - /** - * Creates a new range difference with the given change kind. - * - * @param changeKind - * the kind of change - * @since org.eclipse.compare.core 3.5 - */ - protected RangeDifference(int changeKind) { - this.kind = changeKind; - } - - /** - * Creates a new <code>RangeDifference</code> with the given change kind and - * left and right ranges. - * - * @param kind - * the kind of change - * @param rightStart - * start index of entity on right side - * @param rightLength - * number of entities on right side - * @param leftStart - * start index of entity on left side - * @param leftLength - * number of entities on left side - * @since org.eclipse.compare.core 3.5 - */ - protected RangeDifference(int kind, int rightStart, int rightLength, int leftStart, int leftLength) { - this.kind= kind; - this.rightStart= rightStart; - this.rightLength= rightLength; - this.leftStart= leftStart; - this.leftLength= leftLength; - } - - /** - * Creates a new <code>RangeDifference</code> with the given change kind and - * left, right, and ancestor ranges. - * - * @param kind - * the kind of change - * @param rightStart - * start index of entity on right side - * @param rightLength - * number of entities on right side - * @param leftStart - * start index of entity on left side - * @param leftLength - * number of entities on left side - * @param ancestorStart - * start index of entity on ancestor side - * @param ancestorLength - * number of entities on ancestor side - * @since org.eclipse.compare.core 3.5 - */ - protected RangeDifference(int kind, int rightStart, int rightLength, int leftStart, int leftLength, - int ancestorStart, int ancestorLength) { - this(kind, rightStart, rightLength, leftStart, leftLength); - this.ancestorStart= ancestorStart; - this.ancestorLength= ancestorLength; - } - - /** - * Returns the kind of difference. - * - * @return the kind of difference, one of - * <code>NOCHANGE</code>, <code>CHANGE</code>, <code>LEFT</code>, <code>RIGHT</code>, - * <code>ANCESTOR</code>, <code>CONFLICT</code>, <code>ERROR</code> - */ - public int kind() { - return this.kind; - } - - /** - * Returns the start index of the entity range on the ancestor side. - * - * @return the start index of the entity range on the ancestor side - */ - public int ancestorStart() { - return this.ancestorStart; - } - - /** - * Returns the number of entities on the ancestor side. - * - * @return the number of entities on the ancestor side - */ - public int ancestorLength() { - return this.ancestorLength; - } - - /** - * Returns the end index of the entity range on the ancestor side. - * - * @return the end index of the entity range on the ancestor side - */ - public int ancestorEnd() { - return this.ancestorStart + this.ancestorLength; - } - - /** - * Returns the start index of the entity range on the right side. - * - * @return the start index of the entity range on the right side - */ - public int rightStart() { - return this.rightStart; - } - - /** - * Returns the number of entities on the right side. - * - * @return the number of entities on the right side - */ - public int rightLength() { - return this.rightLength; - } - - /** - * Returns the end index of the entity range on the right side. - * - * @return the end index of the entity range on the right side - */ - public int rightEnd() { - return this.rightStart + this.rightLength; - } - - /** - * Returns the start index of the entity range on the left side. - * - * @return the start index of the entity range on the left side - */ - public int leftStart() { - return this.leftStart; - } - - /** - * Returns the number of entities on the left side. - * - * @return the number of entities on the left side - */ - public int leftLength() { - return this.leftLength; - } - - /** - * Returns the end index of the entity range on the left side. - * - * @return the end index of the entity range on the left side - */ - public int leftEnd() { - return this.leftStart + this.leftLength; - } - - /** - * Returns the maximum number of entities in the left, right, and ancestor sides of this range. - * - * @return the maximum number of entities in the left, right, and ancestor sides of this range - */ - public int maxLength() { - return Math.max(this.rightLength, Math.max(this.leftLength, this.ancestorLength)); - } - - public boolean equals(Object obj) { - if (obj instanceof RangeDifference) { - RangeDifference other = (RangeDifference) obj; - return this.kind == other.kind - && this.leftStart == other.leftStart - && this.leftLength == other.leftLength - && this.rightStart == other.rightStart - && this.rightLength == other.rightLength - && this.ancestorStart == other.ancestorStart - && this.ancestorLength == other.ancestorLength; - } - return super.equals(obj); - } - - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + this.kind; - result = prime * result + this.leftStart; - result = prime * result + this.leftLength; - result = prime * result + this.rightStart; - result = prime * result + this.rightLength; - result = prime * result + this.ancestorStart; - result = prime * result + this.ancestorLength; - return result; - } - - public String toString() { - StringBuffer buf = new StringBuffer("RangeDifference {"); //$NON-NLS-1$ - switch (this.kind) { - case NOCHANGE: - buf.append("NOCHANGE"); //$NON-NLS-1$ - break; - case CHANGE: - buf.append("CHANGE/RIGHT"); //$NON-NLS-1$ - break; - case CONFLICT: - buf.append("CONFLICT"); //$NON-NLS-1$ - break; - case LEFT: - buf.append("LEFT"); //$NON-NLS-1$ - break; - case ERROR: - buf.append("ERROR"); //$NON-NLS-1$ - break; - case ANCESTOR: - buf.append("ANCESTOR"); //$NON-NLS-1$ - break; - default: - break; - } - - buf.append(", "); //$NON-NLS-1$ - - buf.append("Left: " + toRangeString(this.leftStart, this.leftLength) + " Right: " + toRangeString(this.rightStart, this.rightLength)); //$NON-NLS-1$ //$NON-NLS-2$ - if (this.ancestorLength > 0 || this.ancestorStart > 0) - buf.append(" Ancestor: " + toRangeString(this.ancestorStart, this.ancestorLength)); //$NON-NLS-1$ - - buf.append("}"); //$NON-NLS-1$ - return buf.toString(); - } - - private String toRangeString(int start, int length) { - return "(" + start + ", " + length + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/RangeDifferencer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/RangeDifferencer.java deleted file mode 100644 index e39c04d1e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/RangeDifferencer.java +++ /dev/null @@ -1,468 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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.rangedifferencer; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.compare.internal.core.Messages; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.SubMonitor; - -/** - * A <code>RangeDifferencer</code> finds the differences between two or three <code>IRangeComparator</code>s. - * <p> - * To use the differencer, clients provide an <code>IRangeComparator</code> - * that breaks their input data into a sequence of comparable entities. The differencer - * returns the differences among these sequences as an array of <code>RangeDifference</code> objects - * (<code>findDifferences</code> methods). - * Every <code>RangeDifference</code> represents a single kind of difference - * and the corresponding ranges of the underlying comparable entities in the - * left, right, and optionally ancestor sides. - * </p> - * <p> - * Alternatively, the <code>findRanges</code> methods not only return objects for - * the differing ranges but for non-differing ranges too. - * </p> - * - * @see IRangeComparator - * @see RangeDifference - */ -public final class RangeDifferencer { - - private static final RangeDifference[] EMPTY_RESULT= new RangeDifference[0]; - - private static final AbstractRangeDifferenceFactory defaultFactory = new AbstractRangeDifferenceFactory() { - protected RangeDifference createRangeDifference() { - return new RangeDifference(RangeDifference.NOCHANGE); - } - }; - - /* (non Javadoc) - * Cannot be instantiated! - */ - private RangeDifferencer() { - // nothing to do - } - - /** - * Finds the differences between two <code>IRangeComparator</code>s. - * The differences are returned as an array of <code>RangeDifference</code>s. - * If no differences are detected an empty array is returned. - * - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences, or an empty array if no differences were found - */ - public static RangeDifference[] findDifferences(IRangeComparator left, IRangeComparator right) { - return findDifferences((IProgressMonitor)null, left, right); - } - - /** - * Finds the differences between two <code>IRangeComparator</code>s. - * The differences are returned as an array of <code>RangeDifference</code>s. - * If no differences are detected an empty array is returned. - * - * @param pm if not <code>null</code> used to report progress - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences, or an empty array if no differences were found - * @since 2.0 - */ - public static RangeDifference[] findDifferences(IProgressMonitor pm, IRangeComparator left, IRangeComparator right) { - return findDifferences(defaultFactory, null, left, right); - } - - /** - * Finds the differences between two <code>IRangeComparator</code>s. - * The differences are returned as an array of <code>RangeDifference</code>s. - * If no differences are detected an empty array is returned. - * - * @param factory - * @param pm if not <code>null</code> used to report progress - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences, or an empty array if no differences were found - * @since org.eclipse.compare.core 3.5 - */ - public static RangeDifference[] findDifferences(AbstractRangeDifferenceFactory factory, IProgressMonitor pm, IRangeComparator left, IRangeComparator right) { - return RangeComparatorLCS.findDifferences(factory, pm, left, right); - } - - /** - * Finds the differences among three <code>IRangeComparator</code>s. - * The differences are returned as a list of <code>RangeDifference</code>s. - * If no differences are detected an empty list is returned. - * If the ancestor range comparator is <code>null</code>, a two-way - * comparison is performed. - * - * @param ancestor the ancestor range comparator or <code>null</code> - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences, or an empty array if no differences were found - */ - public static RangeDifference[] findDifferences(IRangeComparator ancestor, IRangeComparator left, IRangeComparator right) { - return findDifferences(null, ancestor, left, right); - } - - /** - * Finds the differences among three <code>IRangeComparator</code>s. - * The differences are returned as a list of <code>RangeDifference</code>s. - * If no differences are detected an empty list is returned. - * If the ancestor range comparator is <code>null</code>, a two-way - * comparison is performed. - * - * @param pm if not <code>null</code> used to report progress - * @param ancestor the ancestor range comparator or <code>null</code> - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences, or an empty array if no differences were found - * @since 2.0 - */ - public static RangeDifference[] findDifferences(IProgressMonitor pm, IRangeComparator ancestor, IRangeComparator left, IRangeComparator right) { - return findDifferences(defaultFactory, pm, ancestor, left, right); - } - - /** - * Finds the differences among three <code>IRangeComparator</code>s. - * The differences are returned as a list of <code>RangeDifference</code>s. - * If no differences are detected an empty list is returned. - * If the ancestor range comparator is <code>null</code>, a two-way - * comparison is performed. - * - * @param factory - * @param pm if not <code>null</code> used to report progress - * @param ancestor the ancestor range comparator or <code>null</code> - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences, or an empty array if no differences were found - * @since org.eclipse.compare.core 3.5 - */ - public static RangeDifference[] findDifferences(AbstractRangeDifferenceFactory factory, IProgressMonitor pm, IRangeComparator ancestor, IRangeComparator left, IRangeComparator right) { - try { - if (ancestor == null) - return findDifferences(factory, pm, left, right); - SubMonitor monitor = SubMonitor.convert(pm, Messages.RangeComparatorLCS_0, 100); - RangeDifference[] leftAncestorScript= null; - RangeDifference[] rightAncestorScript= findDifferences(factory, monitor.newChild(50), ancestor, right); - if (rightAncestorScript != null) { - monitor.setWorkRemaining(100); - leftAncestorScript= findDifferences(factory, monitor.newChild(50), ancestor, left); - } - if (rightAncestorScript == null || leftAncestorScript == null) - return null; - - DifferencesIterator myIter= new DifferencesIterator(rightAncestorScript); - DifferencesIterator yourIter= new DifferencesIterator(leftAncestorScript); - - List diff3= new ArrayList(); - diff3.add(factory.createRangeDifference(RangeDifference.ERROR)); // add a sentinel - - int changeRangeStart= 0; - int changeRangeEnd= 0; - // - // Combine the two two-way edit scripts into one - // - monitor.setWorkRemaining(rightAncestorScript.length + leftAncestorScript.length); - while (myIter.fDifference != null || yourIter.fDifference != null) { - - DifferencesIterator startThread; - myIter.removeAll(); - yourIter.removeAll(); - // - // take the next diff that is closer to the start - // - if (myIter.fDifference == null) - startThread= yourIter; - else if (yourIter.fDifference == null) - startThread= myIter; - else { // not at end of both scripts take the lowest range - if (myIter.fDifference.leftStart < yourIter.fDifference.leftStart) { // 2 -> common (Ancestor) change range - startThread= myIter; - } else if (myIter.fDifference.leftStart > yourIter.fDifference.leftStart) { - startThread= yourIter; - } else { - if (myIter.fDifference.leftLength == 0 && yourIter.fDifference.leftLength == 0) { - //insertion into the same position is conflict. - changeRangeStart= myIter.fDifference.leftStart; - changeRangeEnd= myIter.fDifference.leftEnd(); - myIter.next(); - yourIter.next(); - diff3.add(createRangeDifference3(factory, myIter, yourIter, diff3, right, left, changeRangeStart, changeRangeEnd)); - continue; - } else if (myIter.fDifference.leftLength == 0) { - //insertion into a position, and modification to the next line, is not conflict. - startThread= myIter; - } else if (yourIter.fDifference.leftLength == 0) { - startThread = yourIter; - } else { - //modifications to overlapping lines is conflict. - startThread= myIter; - } - } - - } - changeRangeStart= startThread.fDifference.leftStart; - changeRangeEnd= startThread.fDifference.leftEnd(); - - startThread.next(); - monitor.worked(1); - // - // check for overlapping changes with other thread - // merge overlapping changes with this range - // - DifferencesIterator other= startThread.other(myIter, yourIter); - while (other.fDifference != null && other.fDifference.leftStart < changeRangeEnd) { - int newMax= other.fDifference.leftEnd(); - other.next(); - monitor.worked(1); - if (newMax > changeRangeEnd) { - changeRangeEnd= newMax; - other= other.other(myIter, yourIter); - } - } - diff3.add(createRangeDifference3(factory, myIter, yourIter, diff3, right, left, changeRangeStart, changeRangeEnd)); - } - - // remove sentinel - diff3.remove(0); - return (RangeDifference[]) diff3.toArray(EMPTY_RESULT); - } finally { - if (pm != null) - pm.done(); - } - } - - /** - * Finds the differences among two <code>IRangeComparator</code>s. - * In contrast to <code>findDifferences</code>, the result - * contains <code>RangeDifference</code> elements for non-differing ranges too. - * - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences - */ - public static RangeDifference[] findRanges(IRangeComparator left, - IRangeComparator right) { - return findRanges((IProgressMonitor) null, left, right); - } - - /** - * Finds the differences among two <code>IRangeComparator</code>s. - * In contrast to <code>findDifferences</code>, the result - * contains <code>RangeDifference</code> elements for non-differing ranges too. - * - * @param pm if not <code>null</code> used to report progress - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences - * @since 2.0 - */ - public static RangeDifference[] findRanges(IProgressMonitor pm, IRangeComparator left, IRangeComparator right) { - return findRanges(defaultFactory, pm, left, right); - } - - /** - * Finds the differences among two <code>IRangeComparator</code>s. - * In contrast to <code>findDifferences</code>, the result - * contains <code>RangeDifference</code> elements for non-differing ranges too. - * - * @param factory - * @param pm if not <code>null</code> used to report progress - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences - * @since org.eclipse.compare.core 3.5 - */ - public static RangeDifference[] findRanges(AbstractRangeDifferenceFactory factory, IProgressMonitor pm, IRangeComparator left, IRangeComparator right) { - RangeDifference[] in= findDifferences(factory, pm, left, right); - List out= new ArrayList(); - - RangeDifference rd; - - int mstart= 0; - int ystart= 0; - - for (int i= 0; i < in.length; i++) { - RangeDifference es= in[i]; - - rd= factory.createRangeDifference(RangeDifference.NOCHANGE, mstart, es.rightStart() - mstart, ystart, es.leftStart() - ystart); - if (rd.maxLength() != 0) - out.add(rd); - - out.add(es); - - mstart= es.rightEnd(); - ystart= es.leftEnd(); - } - rd= factory.createRangeDifference(RangeDifference.NOCHANGE, mstart, right.getRangeCount() - mstart, ystart, left.getRangeCount() - ystart); - if (rd.maxLength() > 0) - out.add(rd); - - return (RangeDifference[]) out.toArray(EMPTY_RESULT); - } - - /** - * Finds the differences among three <code>IRangeComparator</code>s. - * In contrast to <code>findDifferences</code>, the result - * contains <code>RangeDifference</code> elements for non-differing ranges too. - * If the ancestor range comparator is <code>null</code>, a two-way - * comparison is performed. - * - * @param ancestor the ancestor range comparator or <code>null</code> - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences - */ - public static RangeDifference[] findRanges(IRangeComparator ancestor, IRangeComparator left, IRangeComparator right) { - return findRanges(null, ancestor, left, right); - } - - /** - * Finds the differences among three <code>IRangeComparator</code>s. - * In contrast to <code>findDifferences</code>, the result - * contains <code>RangeDifference</code> elements for non-differing ranges too. - * If the ancestor range comparator is <code>null</code>, a two-way - * comparison is performed. - * - * @param pm if not <code>null</code> used to report progress - * @param ancestor the ancestor range comparator or <code>null</code> - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences - * @since 2.0 - */ - public static RangeDifference[] findRanges(IProgressMonitor pm, IRangeComparator ancestor, IRangeComparator left, IRangeComparator right) { - return findRanges(defaultFactory, pm, ancestor, left, right); - } - - /** - * Finds the differences among three <code>IRangeComparator</code>s. - * In contrast to <code>findDifferences</code>, the result - * contains <code>RangeDifference</code> elements for non-differing ranges too. - * If the ancestor range comparator is <code>null</code>, a two-way - * comparison is performed. - * - * @param factory - * @param pm if not <code>null</code> used to report progress - * @param ancestor the ancestor range comparator or <code>null</code> - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences - * @since org.eclipse.compare.core 3.5 - */ - public static RangeDifference[] findRanges(AbstractRangeDifferenceFactory factory, IProgressMonitor pm, IRangeComparator ancestor, IRangeComparator left, IRangeComparator right) { - if (ancestor == null) - return findRanges(factory,pm, left, right); - - RangeDifference[] in= findDifferences(factory, pm, ancestor, left, right); - List out= new ArrayList(); - - RangeDifference rd; - - int mstart= 0; - int ystart= 0; - int astart= 0; - - for (int i= 0; i < in.length; i++) { - RangeDifference es= in[i]; - - rd= factory.createRangeDifference(RangeDifference.NOCHANGE, mstart, es.rightStart() - mstart, ystart, es.leftStart() - ystart, astart, es.ancestorStart() - astart); - if (rd.maxLength() > 0) - out.add(rd); - - out.add(es); - - mstart= es.rightEnd(); - ystart= es.leftEnd(); - astart= es.ancestorEnd(); - } - rd= factory.createRangeDifference(RangeDifference.NOCHANGE, mstart, right.getRangeCount() - mstart, ystart, left.getRangeCount() - ystart, astart, ancestor.getRangeCount() - astart); - if (rd.maxLength() > 0) - out.add(rd); - - return (RangeDifference[]) out.toArray(EMPTY_RESULT); - } - - //---- private methods - - /* - * Creates a <code>RangeDifference3</code> given the - * state of two DifferenceIterators. - */ - private static RangeDifference createRangeDifference3(AbstractRangeDifferenceFactory configurator, DifferencesIterator myIter, DifferencesIterator yourIter, List diff3, - IRangeComparator right, IRangeComparator left, int changeRangeStart, int changeRangeEnd) { - - int rightStart, rightEnd; - int leftStart, leftEnd; - int kind= RangeDifference.ERROR; - RangeDifference last= (RangeDifference) diff3.get(diff3.size() - 1); - - Assert.isTrue((myIter.getCount() != 0 || yourIter.getCount() != 0)); // At least one range array must be non-empty - // - // find corresponding lines to fChangeRangeStart/End in right and left - // - if (myIter.getCount() == 0) { // only left changed - rightStart= changeRangeStart - last.ancestorEnd() + last.rightEnd(); - rightEnd= changeRangeEnd - last.ancestorEnd() + last.rightEnd(); - kind= RangeDifference.LEFT; - } else { - RangeDifference f= (RangeDifference) myIter.fRange.get(0); - RangeDifference l= (RangeDifference) myIter.fRange.get(myIter.fRange.size() - 1); - rightStart= changeRangeStart - f.leftStart + f.rightStart; - rightEnd= changeRangeEnd - l.leftEnd() + l.rightEnd(); - } - - if (yourIter.getCount() == 0) { // only right changed - leftStart= changeRangeStart - last.ancestorEnd() + last.leftEnd(); - leftEnd= changeRangeEnd - last.ancestorEnd() + last.leftEnd(); - kind= RangeDifference.RIGHT; - } else { - RangeDifference f= (RangeDifference) yourIter.fRange.get(0); - RangeDifference l= (RangeDifference) yourIter.fRange.get(yourIter.fRange.size() - 1); - leftStart= changeRangeStart - f.leftStart + f.rightStart; - leftEnd= changeRangeEnd - l.leftEnd() + l.rightEnd(); - } - - if (kind == RangeDifference.ERROR) { // overlapping change (conflict) -> compare the changed ranges - if (rangeSpansEqual(right, rightStart, rightEnd - rightStart, left, leftStart, leftEnd - leftStart)) - kind= RangeDifference.ANCESTOR; - else - kind= RangeDifference.CONFLICT; - } - return configurator.createRangeDifference(kind, rightStart, rightEnd - rightStart, leftStart, leftEnd - leftStart, changeRangeStart, changeRangeEnd - changeRangeStart); - } - - /* - * Tests whether <code>right</code> and <code>left</code> changed in the same way - */ - private static boolean rangeSpansEqual(IRangeComparator right, int rightStart, int rightLen, IRangeComparator left, int leftStart, int leftLen) { - if (rightLen == leftLen) { - int i= 0; - for (i= 0; i < rightLen; i++) { - if (!rangesEqual(right, rightStart + i, left, leftStart + i)) - break; - } - if (i == rightLen) - return true; - } - return false; - } - - /* - * Tests if two ranges are equal - */ - private static boolean rangesEqual(IRangeComparator a, int ai, IRangeComparator b, int bi) { - return a.rangesEqual(ai, b, bi); - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/package.html b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/package.html deleted file mode 100644 index 8dd70e808..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.core/src/org/eclipse/compare/rangedifferencer/package.html +++ /dev/null @@ -1,41 +0,0 @@ -<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> - <meta name="Author" content="IBM"> - <meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]"> - <title>Package-level Javadoc</title> -</head> -<body> -Provides support for finding the differences between -two or three sequences of comparable entities. -<h2> -Package Specification</h2> - -The class <b>RangeDifferencer</b> finds longest sequences of matching and -non-matching comparable entities. -<p> - -Clients must supply the input to the differencer as an implementation -of the <b>IRangeComparator</b> interface. -An <b>IRangeComparator</b> breaks the input data into a sequence -of entities and provides a method for comparing -one entity with the entity in another <b>IRangeComparator</b>. -<p> - -For example, to compare two text documents and find longest common -sequences of matching and non-matching lines, -the implementation of <b>IRangeComparator</b> -must break the document into lines and provide a method for testing -whether two lines are considered equal. -See <b>org.eclipse.compare.internal.DocLineComparator</b> for how this can be done. -<p> - -The differencer returns the differences among these sequences as an -array of <b>RangeDifference</b> objects. -Every single <b>RangeDifference</b> describes the kind of difference -(no change, change, addition, deletion) and the corresponding ranges -of the underlying comparable entities in the two or three inputs. - -</body> -</html> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/.classpath b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/.classpath deleted file mode 100644 index 2fbb7a23e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/.classpath +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/> - <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> - <classpathentry kind="src" path="src"/> - <classpathentry kind="output" path="bin"/> -</classpath> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/.project b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/.project deleted file mode 100644 index dd687751b..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/.project +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>org.eclipse.compare.win32</name> - <comment></comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.pde.ManifestBuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.pde.SchemaBuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.pde.PluginNature</nature> - <nature>org.eclipse.jdt.core.javanature</nature> - <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature> - </natures> -</projectDescription> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b88ad0d26..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Mon Jun 09 13:49:08 EDT 2008 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.4 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning -org.eclipse.jdt.core.compiler.source=1.3 diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/META-INF/MANIFEST.MF b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/META-INF/MANIFEST.MF deleted file mode 100644 index 49f71c207..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/META-INF/MANIFEST.MF +++ /dev/null @@ -1,19 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %pluginName -Bundle-SymbolicName: org.eclipse.compare.win32;singleton:=true -Bundle-Version: 1.0.100.qualifier -Bundle-Vendor: %providerName -Bundle-RequiredExecutionEnvironment: J2SE-1.4 -Eclipse-PlatformFilter: (osgi.os=win32) -Require-Bundle: org.eclipse.compare;bundle-version="[3.5.0,4.0.0)", - org.eclipse.core.filesystem;bundle-version="[1.2.0,2.0.0)", - org.eclipse.ui.forms;bundle-version="[3.4.0,4.0.0)", - org.eclipse.ui.workbench;bundle-version="[3.5.0,4.0.0)", - org.eclipse.jface;bundle-version="[3.5.0,4.0.0)", - org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)", - org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)" -Export-Package: org.eclipse.compare.internal.win32;x-internal:=true -Bundle-Activator: org.eclipse.compare.internal.win32.Activator -Bundle-ActivationPolicy: lazy -Bundle-Localization: plugin diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/about.html b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/about.html deleted file mode 100644 index 460233046..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/about.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> -<title>About</title> -</head> -<body lang="EN-US"> -<h2>About This Content</h2> - -<p>June 2, 2006</p> -<h3>License</h3> - -<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise -indicated below, the Content is provided to you under the terms and conditions of the -Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available -at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>. -For purposes of the EPL, "Program" will mean the Content.</p> - -<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is -being redistributed by another party ("Redistributor") and different terms and conditions may -apply to your use of any object code in the Content. Check the Redistributor's license that was -provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise -indicated below, the terms and conditions of the EPL still apply to any source code in the Content -and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p> - -</body> -</html>
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/build.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/build.properties deleted file mode 100644 index 1b473f7ff..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/build.properties +++ /dev/null @@ -1,19 +0,0 @@ -############################################################################### -# Copyright (c) 2008, 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 -############################################################################### -source.. = src/ -output.. = bin/ -bin.includes = META-INF/,\ - .,\ - plugin.xml,\ - icons/,\ - about.html,\ - plugin.properties -src.includes = about.html diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/icons/full/dlcl16/save.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/icons/full/dlcl16/save.gif Binary files differdeleted file mode 100644 index ad505a9c2..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/icons/full/dlcl16/save.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/icons/full/elcl16/editor_area.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/icons/full/elcl16/editor_area.gif Binary files differdeleted file mode 100644 index 4b6b76831..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/icons/full/elcl16/editor_area.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/icons/full/elcl16/save.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/icons/full/elcl16/save.gif Binary files differdeleted file mode 100644 index 499dd0ca6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/icons/full/elcl16/save.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/plugin.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/plugin.properties deleted file mode 100644 index 5b550f1b4..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/plugin.properties +++ /dev/null @@ -1,17 +0,0 @@ -############################################################################### -# Copyright (c) 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 -############################################################################### -# -# Resource strings for Compare Win32 Plug-in -# -pluginName = Compare Support for Word -providerName = Eclipse.org - -wordDocumentContentTypeName = Word Document diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/plugin.xml b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/plugin.xml deleted file mode 100644 index 8d584976f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/plugin.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<?eclipse version="3.2"?> -<plugin> - <extension - point="org.eclipse.compare.contentMergeViewers"> - <viewer - class="org.eclipse.compare.internal.win32.WordViewerCreator" - extensions="doc" - id="org.eclipse.compare.wordMergeViewer"> - </viewer> - <contentTypeBinding - contentMergeViewerId="org.eclipse.compare.wordMergeViewer" - contentTypeId="org.eclipse.compare.wordDoc"> - </contentTypeBinding> - </extension> - - <extension - point="org.eclipse.core.contenttype.contentTypes"> - <content-type - file-extensions="doc" - id="org.eclipse.compare.wordDoc" - name="%wordDocumentContentTypeName"> - </content-type> - </extension> - -</plugin> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/AbstractMergeViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/AbstractMergeViewer.java deleted file mode 100644 index a66f37104..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/AbstractMergeViewer.java +++ /dev/null @@ -1,288 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 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.win32; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URI; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.IEditableContent; -import org.eclipse.compare.IResourceProvider; -import org.eclipse.compare.IStreamContentAccessor; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.structuremergeviewer.Differencer; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.core.filesystem.EFS; -import org.eclipse.core.filesystem.IFileStore; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.Viewer; - -/** - * Abstract class that caches any remote contents in local so that external - * tools can be used to show a comparison. - */ -public abstract class AbstractMergeViewer extends Viewer { - - private Object input; - private File leftFile; - private File rightFile; - private File resultFile; - private final CompareConfiguration configuration; - - public AbstractMergeViewer(CompareConfiguration configuration) { - this.configuration = configuration; - } - - public Object getInput() { - return input; - } - - public ISelection getSelection() { - return StructuredSelection.EMPTY; - } - - public void refresh() { - // Nothing to do - } - - public void setInput(Object input) { - this.input = input; - reset(); - } - - protected void reset() { - if (leftFile != null && leftFile.exists()) { - leftFile.delete(); - } - if (rightFile != null && rightFile.exists()) { - rightFile.delete(); - } - if (resultFile != null && resultFile.exists()) { - resultFile.delete(); - } - leftFile = null; - rightFile = null; - resultFile = null; - } - - public void setSelection(ISelection selection, boolean reveal) { - // Nothing to do - } - - protected boolean isOneSided() { - if (input instanceof ICompareInput) { - ICompareInput ci = (ICompareInput) input; - int type = ci.getKind() & Differencer.CHANGE_TYPE_MASK; - return type != Differencer.CHANGE; - } - return false; - } - - protected File getFileForSingleSide() throws CoreException { - File file = getFileForLeft(); - if (file != null && file.exists()) - return file; - return getFileForRight(); - } - - protected File getFileForRight() throws CoreException { - if (rightFile != null) - return rightFile; - ICompareInput ci = getCompareInput(); - if (ci != null) { - ITypedElement right = ci.getRight(); - File file = getLocalFile(right); - if (file != null) { - return file; - } - rightFile = cacheContents(right); - return rightFile; - } - return null; - } - - protected File getFileForLeft() throws CoreException { - if (leftFile != null) - return leftFile; - ICompareInput ci = getCompareInput(); - if (ci != null) { - ITypedElement left = ci.getLeft(); - File file = getLocalFile(left); - if (file != null) { - return file; - } - leftFile = cacheContents(left); - return leftFile; - } - return null; - } - - protected File getResultFile() throws IOException { - if (resultFile != null) - return resultFile; - resultFile = File.createTempFile("merge", ".doc"); //$NON-NLS-1$ //$NON-NLS-2$ - resultFile.deleteOnExit(); - // Need to delete the file so that clients will know that the files doesn't exist yet - resultFile.delete(); - return resultFile; - } - - protected boolean hasResultFile() { - return resultFile != null; - } - - private File cacheContents(ITypedElement element) throws CoreException { - if (element instanceof IStreamContentAccessor) { - IStreamContentAccessor sca = (IStreamContentAccessor) element; - InputStream contents = sca.getContents(); - if (contents != null) { - try { - return createTempFile(contents); - } catch (IOException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, e.getMessage(), e)); - } finally { - try { - contents.close(); - } catch (IOException e) { - // Ignore - } - } - } - } - return null; - } - - private File createTempFile(InputStream contents) throws IOException { - File file = File.createTempFile("compare", ".doc"); //$NON-NLS-1$ //$NON-NLS-2$ - file.deleteOnExit(); - OutputStream out = new BufferedOutputStream(new FileOutputStream(file)); - try { - byte[] buffer = new byte[1024]; - int length; - while ((length = contents.read(buffer)) != -1) { - out.write(buffer, 0, length); - } - return file; - } finally { - out.close(); - } - } - - protected ICompareInput getCompareInput() { - if (input instanceof ICompareInput) { - return (ICompareInput) input; - } - return null; - } - - protected File getLocalFile(ITypedElement left) throws CoreException { - IFile file = getEclipseFile(left); - if (file != null) { - URI uri = file.getLocationURI(); - IFileStore store = EFS.getStore(uri); - if (store != null) { - return store.toLocalFile(EFS.NONE, null); - } - } - return null; - } - - protected IFile getEclipseFile(Object element) { - if (element instanceof IResourceProvider) { - IResourceProvider rp = (IResourceProvider) element; - IResource resource = rp.getResource(); - if (resource.getType() == IResource.FILE) { - return (IFile)resource; - } - } - if (element instanceof IAdaptable) { - IAdaptable a = (IAdaptable) element; - Object result = a.getAdapter(IResource.class); - if (result == null) { - result = a.getAdapter(IFile.class); - } - if (result instanceof IFile) { - return (IFile) result; - } - } - return null; - } - - protected IEditableContent getSaveTarget() { - IEditableContent left = getEditableLeft(); - IEditableContent right = getEditableRight(); - if (left != null && right == null) { - return left; - } - if (left == null && right != null) { - return right; - } - return null; - } - - private IEditableContent getEditableLeft() { - ICompareInput compareInput = getCompareInput(); - if (compareInput != null) { - ITypedElement left = compareInput.getLeft(); - if (left instanceof IEditableContent && configuration.isLeftEditable()) { - return (IEditableContent) left; - } - } - return null; - } - - private IEditableContent getEditableRight() { - ICompareInput compareInput = getCompareInput(); - if (compareInput != null) { - ITypedElement right = compareInput.getRight(); - if (right instanceof IEditableContent && configuration.isRightEditable()) { - return (IEditableContent) right; - - } - } - return null; - } - - protected byte[] asBytes(File file) throws IOException { - InputStream in = new BufferedInputStream(new FileInputStream(file)); - try { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int length; - while ((length = in.read(buffer)) != -1) { - out.write(buffer, 0, length); - } - out.close(); - return out.toByteArray(); - } finally { - in.close(); - } - } - - public CompareConfiguration getConfiguration() { - return configuration; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/Activator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/Activator.java deleted file mode 100644 index 7b935df48..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/Activator.java +++ /dev/null @@ -1,66 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 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.win32; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Plugin; -import org.eclipse.core.runtime.Status; -import org.osgi.framework.BundleContext; - -public class Activator extends Plugin { - - // The plug-in ID - public static final String PLUGIN_ID = "org.eclipse.compare.win32"; - - // The shared instance - private static Activator plugin; - - /** - * The constructor - */ - public Activator() { - } - - /* - * (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) - */ - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - } - - /* - * (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) - */ - public void stop(BundleContext context) throws Exception { - plugin = null; - super.stop(context); - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static Activator getDefault() { - return plugin; - } - - public static void log(Throwable e) { - log(new Status(IStatus.ERROR, PLUGIN_ID, 0, "Internal error", e)); - } - - public static void log(IStatus status) { - getDefault().getLog().log(status); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/CompareWin32Messages.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/CompareWin32Messages.java deleted file mode 100644 index 80fc1254b..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/CompareWin32Messages.java +++ /dev/null @@ -1,37 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 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.win32; - -import org.eclipse.osgi.util.NLS; - -public class CompareWin32Messages extends NLS { - private static final String BUNDLE_NAME = "org.eclipse.compare.internal.win32.messages"; //$NON-NLS-1$ - public static String WordComparison_0; - public static String WordComparison_1; - public static String WordComparison_16; - public static String WordComparison_2; - public static String WordComparison_3; - public static String WordComparison_4; - public static String WordComparison_6; - public static String WordComparison_9; - public static String WordMergeViewer_1; - public static String WordMergeViewer_2; - public static String WordMergeViewer_3; - public static String WordMergeViewer_4; - public static String WordMergeViewer_5; - static { - // initialize resource bundle - NLS.initializeMessages(BUNDLE_NAME, CompareWin32Messages.class); - } - - private CompareWin32Messages() { - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordComparison.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordComparison.java deleted file mode 100644 index def6628bc..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordComparison.java +++ /dev/null @@ -1,480 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 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.win32; - -import java.io.File; -import java.util.Vector; - -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; -import org.eclipse.swt.ole.win32.OLE; -import org.eclipse.swt.ole.win32.OleAutomation; -import org.eclipse.swt.ole.win32.OleClientSite; -import org.eclipse.swt.ole.win32.OleFrame; -import org.eclipse.swt.ole.win32.Variant; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.IWorkbenchActionConstants; -import org.eclipse.ui.IWorkbenchWindow; - -/** - * Class that manages a Word document comparison using OLE. - */ -public class WordComparison { - - private final OleFrame frame; - private OleClientSite site; - private boolean inplace; - private OleAutomation document; - - public WordComparison(Composite composite) { - frame = new OleFrame(composite, SWT.NONE); - } - - // These helper methods facilitate writing the OLE apps - private static Variant invoke(OleAutomation auto, String command) { - return auto.invoke(property(auto, command), new Variant[0]); - } - - private static Variant invoke(OleAutomation auto, OleAutomation reference, String command) { - return auto.invoke(property(auto, reference, command), new Variant[0]); - } - - private static Variant invoke(OleAutomation auto, OleAutomation reference, String command, String value) { - return auto.invoke(property(auto, reference, command), new Variant[] { new Variant(value) }); - } - - private static Variant invoke(OleAutomation auto, String command, int value) { - return auto.invoke(property(auto, command), new Variant[] { new Variant(value) }); - } - - private static Variant invoke(OleAutomation auto, String command, String value) { - return auto.invoke(property(auto, command), new Variant[] { new Variant(value) }); - } - - private static Variant getVariantProperty(OleAutomation auto, String name) { - Variant varResult = auto.getProperty(property(auto, name)); - if (varResult != null && varResult.getType() != OLE.VT_EMPTY) { - return varResult; - } - throw new SWTException(NLS.bind(CompareWin32Messages.WordComparison_0, name)); - } - - private static OleAutomation getAutomationProperty(OleAutomation auto, String name) { - Variant varResult = getVariantProperty(auto, name); - try { - OleAutomation automation = varResult.getAutomation(); - if (automation != null) - return automation; - } finally { - varResult.dispose(); - } - throw new SWTException(NLS.bind(CompareWin32Messages.WordComparison_1, name)); - } - - private static OleAutomation getAutomationResult(OleAutomation auto, String command, int value) { - Variant varResult = invoke(auto, command, value); - if (varResult != null) { - try { - OleAutomation result = varResult.getAutomation(); - if (result != null) - return result; - } finally { - varResult.dispose(); - } - } - throw new SWTException(NLS.bind(CompareWin32Messages.WordComparison_2, command, Integer.toString(value))); - } - - private static OleAutomation getAutomationResult(OleAutomation auto, String command, String value) { - Variant varResult = invoke(auto, command, value); - if (varResult != null) { - try { - OleAutomation result = varResult.getAutomation(); - if (result != null) - return result; - } finally { - varResult.dispose(); - } - } - throw new SWTException(NLS.bind(CompareWin32Messages.WordComparison_3, command, value)); - } - - - /** - * <p>This methods workarounds the feature in doc documents. Some properties are not accessible - * using names when a diff document is created. The workaround is to obtain the id of the - * method from an original document and use it in the newly created one.</p> - * - * <p>An exception is thrown if the id cannot be retrieved</p> - * - * Reference information for id assignment: <a href=" - * http://msdn.microsoft.com/en-us/library/w7a36sdf%28VS.80%29.aspx">http://msdn.microsoft.com/en-us/library/w7a36sdf%28VS.80%29.aspx</a> - * - * @param auto - object from which we want to get the property, must not be <code>null</code> - * @param reference - an reference object from which the property will be obtained. - * @param name - the name of the property, must not be <code>null</code> - */ - private static int property(OleAutomation auto, OleAutomation reference, String name) { - int[] ids = auto.getIDsOfNames(new String[] { name }); - if (ids != null) { - return ids[0]; - } - if(reference == null) throw new SWTException(NLS.bind(CompareWin32Messages.WordComparison_4, name)) ; - - // the property was not retrieved at that point, try to get it from the reference object - ids = reference.getIDsOfNames(new String[] { name }); - if (ids == null) { - throw new SWTException(NLS.bind(CompareWin32Messages.WordComparison_4, name)); - } - return ids[0]; - } - - private static int property(OleAutomation auto, String name) { - int[] ids = auto.getIDsOfNames(new String[] { name }); - if (ids == null) throw new SWTException(NLS.bind(CompareWin32Messages.WordComparison_4, name)); - return ids[0]; - } - - private static boolean setProperty(OleAutomation auto, String name, boolean value) { - return auto.setProperty(property(auto, name), new Variant(value)); - } - - /** - * Open the file at the given path as a document in Word. - * - * @param filePath - * the path of the file containing the document - * @param inplace - * whether Word is to be opened in-place or in a separate window - * @throws SWTException - * if the document could not be opened for some reason - */ - public void openDocument(String filePath, boolean inplace) throws SWTException { - resetSite(inplace ? filePath : null); - if (inplace) { - site.doVerb(OLE.OLEIVERB_SHOW); - } else { - OleAutomation application = createApplication(); - try { - // Track the external document we just opened - document = openDocument(application, filePath); - setDocumentVisible(document, true); - } finally { - application.dispose(); - } - } - } - - /** - * Compares the base document with the revised document and saves the - * comparison in the working copy which can then be opened using - * openDocument. - * - * @param baseDocument - * the base document - * @param revisedDocument - * the revised document - * @param workingCopy - * the working copy (will be overwritten) - * @throws SWTException - * if an SWT error occurs - */ - public void createWorkingCopy(String baseDocument, String revisedDocument, String workingCopy) throws SWTException { - resetSite(null); - OleAutomation application = createApplication(); - try { - OleAutomation document = openDocument(application, revisedDocument); - try { - setDocumentVisible(document,false); - compareDocument(document, baseDocument, revisedDocument); - OleAutomation activeDocument = getActiveDocument(application); - try { - Variant varResult = invoke(activeDocument, document, "SaveAs", workingCopy); //$NON-NLS-1$ - if (varResult == null) - throw new SWTException(NLS.bind(CompareWin32Messages.WordComparison_6, workingCopy)); - varResult.dispose(); - } finally { - closeDocument(activeDocument, document); - } - } finally { - closeDocument(document, null); - } - } finally { - try { - //Quit application without saving any changes - int [] ids = application.getIDsOfNames(new String [] {"Quit", "SaveChanges"}); - final Variant wdDoNotSaveChanges = new Variant(0); - Variant varResult = application.invoke(ids[0], new Variant[]{ wdDoNotSaveChanges }, new int[] {ids[1]}); - if (varResult != null) { - varResult.dispose(); - } - } catch (SWTException e) { - // We don't want to throw the exception as we may mask another exception - Activator.log(e); - } finally { - application.dispose(); - } - } - } - - private void closeDocument(OleAutomation document, OleAutomation reference) { - // Close the first document: destination.Close() - try { - Variant varResult = invoke(document, reference, "Close"); //$NON-NLS-1$ - if (varResult != null) { - varResult.dispose(); - } - } catch (SWTException e) { - // We don't want to throw the exception as we may mask another - // exception - Activator.log(e); - } finally { - document.dispose(); - } - } - - private void compareDocument(OleAutomation document, String baseDocument, String revisedDocument) { - // Compare to the second document: compare = destination.Compare(p1) - Variant varResult = invoke(document, "Compare", baseDocument); //$NON-NLS-1$ - if (varResult == null) - throw new SWTException(NLS.bind(CompareWin32Messages.WordComparison_9, baseDocument, revisedDocument)); - varResult.dispose(); - } - - private boolean getDocumentDirty(OleAutomation document) { - // word.document.Saved - if (document != null) { - Variant variantProperty = getVariantProperty(document, "Saved"); //$NON-NLS-1$ - if (variantProperty != null) { - try { - return !variantProperty.getBoolean(); - } finally { - variantProperty.dispose(); - } - } - } - return false; - } - - private void setDocumentVisible(OleAutomation document, boolean visible) { - // Hide it: destination.Windows[0].Visible=0|1 - OleAutomation windows = getAutomationProperty(document, "Windows"); //$NON-NLS-1$ - try { - OleAutomation window = getAutomationResult(windows, "Item", 1); //$NON-NLS-1$ - try { - setProperty(window, "Visible", visible); //$NON-NLS-1$ - } finally { - window.dispose(); - } - } finally { - windows.dispose(); - } - } - - private OleAutomation openDocument(OleAutomation application, String doc) { - // Open the first document: word.Documents.Open(p2) - OleAutomation documents = getAutomationProperty(application, "Documents"); //$NON-NLS-1$ - try { - OleAutomation document = getAutomationResult(documents, "Open", doc); //$NON-NLS-1$ - if (document == null) { - throw new SWTException(NLS.bind(CompareWin32Messages.WordComparison_16, doc)); - } - return document; - } finally { - documents.dispose(); - } - } - - private OleAutomation getActiveDocument(OleAutomation application) { - return getAutomationProperty(application, "ActiveDocument"); //$NON-NLS-1$ - } - - /* - * Create a handle to the application - */ - private OleAutomation createApplication() { - return new OleAutomation(site); - } - - /* - * When opening a new comparison, we want to close any existing site - * and create a new one. - */ - private void resetSite(String filePath) { - if (site != null && !site.isDisposed()) { - disposeSite(); - } - inplace = filePath != null; - if (inplace) { - site = new OleClientSite(frame, SWT.NONE, "Word.Document", new File(filePath)); //$NON-NLS-1$ - } else { - site = new OleClientSite(frame, SWT.NONE, "Word.Application"); //$NON-NLS-1$ - } - } - - private void disposeSite() { - if (document != null) { - closeDocument(document, null); - document = null; - OleAutomation application = createApplication(); - try { - OleAutomation documents = getAutomationProperty(application, "Documents"); //$NON-NLS-1$ - try { - Variant property = getVariantProperty(documents, "Count"); //$NON-NLS-1$ - if (property != null) { - try { - if (property.getLong() == 0) { - // There are no other documents open so close the application - Variant result = invoke(application, "Quit"); //$NON-NLS-1$ - if (result != null) { - result.dispose(); - } - } - } finally { - property.dispose(); - } - } - } finally { - documents.dispose(); - } - } finally { - application.dispose(); - } - } - site.dispose(); - site = null; - } - - public void saveAsDocument(String doc) { - if (site == null || site.isDisposed()) return; - if (inplace) { - site.deactivateInPlaceClient(); - site.save(new File(doc), true); - site.doVerb(OLE.OLEIVERB_SHOW); - } else if (document != null) { - try { - Variant variant = invoke(document, "SaveAs", doc); //$NON-NLS-1$ - if (variant != null) { - variant.dispose(); - } - } catch (SWTException e) { - // Ignore since this probably means the document was closed by the user - } - } - } - - /** - * Return the OLEFrame for the comparison document. - * @return the OLEFrame for the comparison document - */ - public OleFrame getFrame() { - return frame; - } - - /** - * Dispose of the comparison. - */ - public void dispose() { - try { - disposeSite(); - } finally { - if (!frame.isDisposed()) { - frame.dispose(); - } - } - } - - /** - * Return whether the comparison document is dirty. This method handles - * both an in-place document and a document opened in a separate window. - * @return weather the comparison document is dirty - */ - public boolean isDirty() { - return (inplace && site != null && !site.isDisposed() && site.isDirty()) - || (!inplace && getDocumentDirty(document)); - } - - /** - * Initialize the workbench menus for proper menu merging - * Copied from org.eclipse.ui.internal.editorsupport.win32OleEditor - */ - protected void initializeWorkbenchMenus(IWorkbenchWindow window) { - //If there was an OLE Error or nothing has been created yet - if (frame == null || frame.isDisposed()) - return; - // Get the browser menu bar. If one does not exist then - // create it. - Shell shell = frame.getShell(); - Menu menuBar = shell.getMenuBar(); - if (menuBar == null) { - menuBar = new Menu(shell, SWT.BAR); - shell.setMenuBar(menuBar); - } - - // Swap the file and window menus. - MenuItem[] windowMenu = new MenuItem[1]; - MenuItem[] fileMenu = new MenuItem[1]; - Vector containerItems = new Vector(); - - for (int i = 0; i < menuBar.getItemCount(); i++) { - MenuItem item = menuBar.getItem(i); - String id = ""; //$NON-NLS-1$ - if (item.getData() instanceof IMenuManager) - id = ((IMenuManager) item.getData()).getId(); - if (id.equals(IWorkbenchActionConstants.M_FILE)) - fileMenu[0] = item; - else if (id.equals(IWorkbenchActionConstants.M_WINDOW)) - windowMenu[0] = item; - else { - if (window.isApplicationMenu(id)) { - containerItems.addElement(item); - } - } - } - MenuItem[] containerMenu = new MenuItem[containerItems.size()]; - containerItems.copyInto(containerMenu); - frame.setFileMenus(fileMenu); - frame.setContainerMenus(containerMenu); - frame.setWindowMenus(windowMenu); - } - - /** - * Return whether the comparison document is being shown in-place or in - * a separate window. - * @return whether the comparison document is being shown in-place or in - * a separate window - */ - public boolean isInplace() { - return inplace; - } - - /** - * Return whether the comparison document is open. - * @return whether the comparison document is open - */ - public boolean isOpen() { - return site != null && !site.isDisposed(); - } - - /** - * Close any open documents - */ - public void close() { - if (isOpen()) { - disposeSite(); - } - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordMergeViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordMergeViewer.java deleted file mode 100644 index ac17d303f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordMergeViewer.java +++ /dev/null @@ -1,472 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 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.win32; - -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.compare.CompareUI; -import org.eclipse.compare.CompareViewerPane; -import org.eclipse.compare.IEditableContent; -import org.eclipse.compare.IPropertyChangeNotifier; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.contentmergeviewer.IFlushable; -import org.eclipse.compare.structuremergeviewer.Differencer; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.FileLocator; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.SafeRunner; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.IToolBarManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.dialogs.ErrorDialog; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.layout.GridLayoutFactory; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.util.SafeRunnable; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; -import org.eclipse.swt.custom.BusyIndicator; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Label; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.forms.widgets.FormToolkit; -import org.eclipse.ui.part.PageBook; - -public class WordMergeViewer extends AbstractMergeViewer implements IFlushable, IPropertyChangeNotifier { - - private static final String RESOURCE_BUNDLE_NAME = "org.eclipse.compare.internal.win32.WordMergeViewer"; //$NON-NLS-1$ - - private FormToolkit formToolkit; - private PageBook composite; - private Composite docArea; - private Composite textArea; - private Label description; - private WordComparison wordArea; - private boolean isDirty; - private ListenerList listeners = new ListenerList(ListenerList.IDENTITY); - private Action saveAction; - private ResourceBundle resourceBundle; - private Action inplaceAction; - private long resultFileTimestamp = -1; - - public WordMergeViewer(Composite parent, CompareConfiguration configuration) { - super(configuration); - createContentArea(parent); - getControl().addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - handleDispose(); - } - }); - getControl().setData(CompareUI.COMPARE_VIEWER_TITLE, CompareWin32Messages.WordMergeViewer_1); - IToolBarManager toolBarManager = CompareViewerPane.getToolBarManager(parent); - if (toolBarManager != null) { - toolBarManager.removeAll(); - initializeToolbar(toolBarManager); - } - updateEnablements(); - } - - private void createContentArea(Composite parent) { - formToolkit = new FormToolkit(parent.getDisplay()); - composite = new PageBook(parent, SWT.NONE); - createDocArea(composite); - createTextArea(composite); - } - - private void initializeToolbar(IToolBarManager toolBarManager) { - toolBarManager.add(new Separator("modes")); //$NON-NLS-1$ - toolBarManager.add(new Separator("file")); //$NON-NLS-1$ - CompareConfiguration configuration = getConfiguration(); - // For now, only support saving if one side is editable - if (configuration.isRightEditable() || configuration.isLeftEditable() - && (configuration.isRightEditable() != configuration.isLeftEditable())) { - saveAction = new Action() { - public void run() { - saveDocument(); - } - }; - initAction(saveAction, getResourceBundle(), "action.save."); //$NON-NLS-1$ - toolBarManager.appendToGroup("file", saveAction); //$NON-NLS-1$ - } - - inplaceAction = new Action(CompareWin32Messages.WordMergeViewer_2, Action.AS_CHECK_BOX) { - public void run() { - toggleInplaceExternalState(); - } - }; - initAction(inplaceAction, getResourceBundle(), "action.inplace."); //$NON-NLS-1$ - toolBarManager.appendToGroup("modes", inplaceAction); //$NON-NLS-1$ - - toolBarManager.update(true); - } - - /* - * Initialize the given Action from a ResourceBundle. - */ - private static void initAction(IAction a, ResourceBundle bundle, String prefix) { - - String labelKey= "label"; //$NON-NLS-1$ - String tooltipKey= "tooltip"; //$NON-NLS-1$ - String imageKey= "image"; //$NON-NLS-1$ - String descriptionKey= "description"; //$NON-NLS-1$ - - if (prefix != null && prefix.length() > 0) { - labelKey= prefix + labelKey; - tooltipKey= prefix + tooltipKey; - imageKey= prefix + imageKey; - descriptionKey= prefix + descriptionKey; - } - - a.setText(getString(bundle, labelKey, labelKey)); - a.setToolTipText(getString(bundle, tooltipKey, null)); - a.setDescription(getString(bundle, descriptionKey, null)); - - String relPath= getString(bundle, imageKey, null); - if (relPath != null && relPath.trim().length() > 0) { - - String dPath; - String ePath; - - if (relPath.indexOf("/") >= 0) { //$NON-NLS-1$ - String path= relPath.substring(1); - dPath= 'd' + path; - ePath= 'e' + path; - } else { - dPath= "dlcl16/" + relPath; //$NON-NLS-1$ - ePath= "elcl16/" + relPath; //$NON-NLS-1$ - } - - ImageDescriptor id= getImageDescriptor(dPath); // we set the disabled image first (see PR 1GDDE87) - if (id != null) - a.setDisabledImageDescriptor(id); - id= getImageDescriptor(ePath); - if (id != null) { - a.setImageDescriptor(id); - a.setHoverImageDescriptor(id); - } - } - } - - private static ImageDescriptor getImageDescriptor(String relativePath) { - IPath path= new Path("$nl$/icons/full/").append(relativePath); - URL url= FileLocator.find(Activator.getDefault().getBundle(), path, null); - if (url == null) - return null; - return ImageDescriptor.createFromURL(url); - } - - private static String getString(ResourceBundle bundle, String key, String dfltValue) { - - if (bundle != null) { - try { - return bundle.getString(key); - } catch (MissingResourceException x) { - // fall through - } - } - return dfltValue; - } - - private ResourceBundle getResourceBundle() { - if (resourceBundle == null) { - resourceBundle = ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME); - } - return resourceBundle; - } - - private Composite createComposite(Composite parent) { - return formToolkit.createComposite(parent); - } - - private void updateEnablements() { - if (saveAction != null) - saveAction.setEnabled(isDirty()); - inplaceAction.setChecked(wordArea.isInplace()); - inplaceAction.setEnabled(wordArea.isOpen()); - } - - - private void createDocArea(PageBook book) { - docArea = createComposite(book); - docArea.setLayout(GridLayoutFactory.fillDefaults().create()); - wordArea = new WordComparison(docArea); - IWorkbenchPart workbenchPart = getConfiguration().getContainer().getWorkbenchPart(); - if (workbenchPart != null) { - wordArea.initializeWorkbenchMenus(workbenchPart.getSite().getWorkbenchWindow()); - } - wordArea.getFrame().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - wordArea.getFrame().setBackground(formToolkit.getColors().getBackground()); - updateDirtyFlag(); - } - - private void createTextArea(PageBook book) { - textArea = createComposite(book); - textArea.setLayout(GridLayoutFactory.fillDefaults().extendedMargins(10, 10, 10, 10).create()); - description = formToolkit.createLabel(textArea, getTextDescription(), SWT.WRAP); - description.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - } - - protected void saveDocument() { - try { - File result = getResultFile(); - wordArea.saveAsDocument(result.getAbsolutePath()); - // Forward the saved content to the save target - IEditableContent saveTarget = getSaveTarget(); - if (saveTarget == null) { - if (MessageDialog.openQuestion(WordMergeViewer.this.composite.getShell(), "Save to File?", "The compare editor is not saveable. Would you like to save your changes to another file?")) { - FileDialog dialog = new FileDialog(WordMergeViewer.this.composite.getShell(), SWT.SAVE); - String filename = dialog.open(); - if (filename != null) { - wordArea.saveAsDocument(filename); - } - } - } else { - synchronized (result) { - if (result.exists()) { - saveTarget.setContent(asBytes(result)); - resultFileTimestamp = result.lastModified(); - } - } - } - updateEnablements(); - } catch (IOException e) { - ErrorDialog.openError(WordMergeViewer.this.composite.getShell(), null, null, new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, e.getMessage(), e)); - } catch (SWTException e) { - ErrorDialog.openError(WordMergeViewer.this.composite.getShell(), null, null, new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, e.getMessage(), e)); - } - } - - public void flush(IProgressMonitor monitor) { - Display.getDefault().syncExec(new Runnable() { - public void run() { - if (isReallyDirty()) - saveDocument(); - } - }); - } - - - protected void toggleInplaceExternalState() { - BusyIndicator.showWhile(Display.getDefault(), new Runnable() { - public void run() { - try { - if (isReallyDirty()) { - // If the file is dirty, save the result file before switching so our changes are not lost - try { - File result = getResultFile(); - wordArea.saveAsDocument(result.getAbsolutePath()); - } catch (IOException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, e.getMessage(), e)); - } - } - openComparison(!wordArea.isInplace()); - } catch (CoreException e) { - ErrorDialog.openError(WordMergeViewer.this.composite.getShell(), null, null, e.getStatus()); - Activator.log(e); - } - } - }); - } - - private boolean isReallyDirty() { - return isDirty() || wordArea.isDirty(); - } - - private void openComparison(boolean inplace) throws CoreException { - try { - if (isOneSided()) { - File file = getFileForSingleSide(); - if (file != null) { - try { - wordArea.openDocument(file.getAbsolutePath(), inplace); - } catch (SWTException e) { - throw new CoreException(new Status(IStatus.ERROR, - Activator.PLUGIN_ID, NLS.bind( - CompareWin32Messages.WordComparison_16, - file.getAbsolutePath()), e)); - } - } - } else { - File left = getFileForLeft(); - File right = getFileForRight(); - if (left != null && right != null) { - File result = getResultFile(); - int direction = getCompareInput().getKind() & Differencer.DIRECTION_MASK; - File base, revised; - if (direction == Differencer.RIGHT) { - base = left; - revised = right; - } else { - base = right; - revised = left; - } - synchronized (result) { - if (!result.exists()) { - wordArea.createWorkingCopy(base.getAbsolutePath(), revised.getAbsolutePath(), result.getAbsolutePath()); - resultFileTimestamp = result.lastModified(); - description.setText(getTextDescription()); - } - try { - wordArea.openDocument(result.getAbsolutePath(), inplace); - } catch (SWTException e) { - throw new CoreException(new Status(IStatus.ERROR, - Activator.PLUGIN_ID, NLS.bind( - CompareWin32Messages.WordComparison_16, - result.getAbsolutePath()), e)); - } - } - } - } - if (wordArea.isInplace()) { - composite.showPage(docArea); - } else { - composite.showPage(textArea); - } - } catch (SWTException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, e.getMessage(), e)); - } catch (IOException e) { - throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, e.getMessage(), e)); - } - updateEnablements(); - } - - private String getTextDescription() { - if (saveAction != null &&hasResultFile()) { - IEditableContent saveTarget = getSaveTarget(); - String name = CompareWin32Messages.WordMergeViewer_3; - if (saveTarget instanceof ITypedElement) { - ITypedElement te = (ITypedElement) saveTarget; - name = te.getName(); - } - try { - return NLS.bind(CompareWin32Messages.WordMergeViewer_4, getResultFile().getName(), name); - } catch (IOException e) { - // This shouldn't happen since the result file has already been created - } - } - return CompareWin32Messages.WordMergeViewer_5; - } - - public Control getControl() { - return composite; - } - - public void setInput(Object input) { - super.setInput(input); - try { - openComparison(true); - } catch (CoreException e) { - ErrorDialog.openError(WordMergeViewer.this.composite.getShell(), null, null, e.getStatus()); - Activator.log(e); - } - } - - private void updateDirtyFlag() { - final Runnable dirtyFlagUpdater = new Runnable() { - public void run() { - if (wordArea.getFrame().isDisposed()) - return; - boolean dirty = wordArea.isDirty(); - if (hasResultFile()) { - try { - File resultFile = getResultFile(); - synchronized (resultFile) { - if (resultFile.exists()) { - long lastModified = resultFile.lastModified(); - if (lastModified != resultFileTimestamp) { - dirty = true; - } - } - } - } catch (IOException e) { - // Shouldn't happen since we only get the result file if it has already been created - } - } - if (isDirty() != dirty) { - setDirty(dirty); - } - composite.getDisplay().timerExec(1000, this); - } - }; - dirtyFlagUpdater.run(); - } - - protected boolean isDirty() { - return isDirty; - } - - protected void setDirty(boolean dirty) { - if (isDirty != dirty) { - isDirty = dirty; - updateEnablements(); - firePropertyChange(CompareEditorInput.DIRTY_STATE, Boolean.valueOf(!isDirty), Boolean.valueOf(isDirty)); - } - } - - private void firePropertyChange(String property, Object oldValue, Object newValue) { - Object[] allListeners = listeners.getListeners(); - final PropertyChangeEvent event = new PropertyChangeEvent(this, property, oldValue, newValue); - for (int i = 0; i < allListeners.length; i++) { - final IPropertyChangeListener listener = (IPropertyChangeListener)allListeners[i]; - SafeRunner.run(new SafeRunnable() { - public void run() throws Exception { - listener.propertyChange(event); - } - }); - } - } - - public void addPropertyChangeListener(IPropertyChangeListener listener) { - listeners.add(listener); - } - - public void removePropertyChangeListener(IPropertyChangeListener listener) { - listeners.remove(listener); - } - - private void handleDispose() { - BusyIndicator.showWhile(Display.getDefault(), new Runnable() { - public void run() { - wordArea.dispose(); - formToolkit.dispose(); - reset(); - } - }); - } - - protected void reset() { - if (wordArea.isOpen()) { - wordArea.close(); - } - super.reset(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordMergeViewer.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordMergeViewer.properties deleted file mode 100644 index 6118d570c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordMergeViewer.properties +++ /dev/null @@ -1,18 +0,0 @@ -############################################################################### -# Copyright (c) 2008 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 -############################################################################### - -action.save.label=Save -action.save.tooltip=Save the changes to the Word document comparison -action.save.image=save.gif - -action.inplace.label=Edit Inplace -action.inplace.tooltip=Toggle whether the word document is edited in-place or in a separate window -action.inplace.image=editor_area.gif
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordViewerCreator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordViewerCreator.java deleted file mode 100644 index 85d6e05b6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/WordViewerCreator.java +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 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.win32; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.IViewerCreator; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.widgets.Composite; - -/** - * Factory registered with the <code>org.eclipse.compare.contentMergeViewers</code> - * extension point to create a Word document comparison. - */ -public class WordViewerCreator implements IViewerCreator { - - public Viewer createViewer(Composite parent, CompareConfiguration config) { - return new WordMergeViewer(parent, config); - } - - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/messages.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/messages.properties deleted file mode 100644 index 0d0e4904e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare.win32/src/org/eclipse/compare/internal/win32/messages.properties +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################### -# Copyright (c) 2008 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 -############################################################################### -# NLS_ENCODING=UTF-8 -# NLS_MESSAGEFORMAT_VAR -WordMergeViewer_1=Word Document Compare -WordMergeViewer_2=Inplace -WordMergeViewer_3=<unknown> -WordMergeViewer_4=The Word document comparison is being shown in a separate window. The comparison is using the temporary file ''{0}'' to host the comparison. To save this file back to ''{1}'', you will need to save this compare editor. -WordMergeViewer_5=The Word document comparison is being shown in a separate window. You can click the 'Toggle in-place' toolbar button to have the document appear inside this pane. -WordComparison_0=The property ''{0}'' could not be retrieved -WordComparison_1=The property ''{0}'' could not be retrieved -WordComparison_2=The command ''{0}'' with value ''{1}'' had no result -WordComparison_3=The command ''{0}'' with value ''{1}'' had no result -WordComparison_4=Invalid property name: {0}. -WordComparison_6=Document ''{0}'' could not be saved -WordComparison_9=The request to the Word application to perform the comparison between ''{0}'' and ''{1}'' failed. Comparing the files manually may succeed. -WordComparison_16=The document at {0} could not be opened diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.classpath b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.classpath deleted file mode 100644 index d6b5509a8..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.classpath +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="src" path="compare/"/> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/> - <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> - <classpathentry kind="output" path="bin"/> -</classpath> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.cvsignore b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.cvsignore deleted file mode 100644 index ba077a403..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -bin diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.project b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.project deleted file mode 100644 index 3f5efe710..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.project +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>org.eclipse.compare</name> - <comment></comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.pde.ManifestBuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.pde.SchemaBuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.jdt.core.javanature</nature> - <nature>org.eclipse.pde.PluginNature</nature> - <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature> - </natures> -</projectDescription> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.settings/.api_filters b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.settings/.api_filters deleted file mode 100644 index 055fcfbca..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.settings/.api_filters +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<component id="org.eclipse.compare" version="2"> - <resource path="META-INF/MANIFEST.MF" type="org.eclipse.compare.patch.IFilePatchResult"> - <filter id="403853384"> - <message_arguments> - <message_argument value="org.eclipse.compare.patch.IFilePatchResult"/> - </message_arguments> - </filter> - </resource> - <resource path="META-INF/MANIFEST.MF" type="org.eclipse.compare.patch.IHunk"> - <filter id="403853384"> - <message_arguments> - <message_argument value="org.eclipse.compare.patch.IHunk"/> - </message_arguments> - </filter> - </resource> - <resource path="META-INF/MANIFEST.MF" type="org.eclipse.compare.patch.PatchConfiguration"> - <filter id="336744520"> - <message_arguments> - <message_argument value="org.eclipse.compare.patch.PatchConfiguration"/> - </message_arguments> - </filter> - </resource> - <resource path="compare/org/eclipse/compare/CompareViewerSwitchingPane.java" type="org.eclipse.compare.CompareViewerSwitchingPane"> - <filter id="338944126"> - <message_arguments> - <message_argument value="org.eclipse.compare.CompareViewerSwitchingPane"/> - <message_argument value="setTitleArgument(String)"/> - </message_arguments> - </filter> - <filter id="338944126"> - <message_arguments> - <message_argument value="org.eclipse.compare.CompareViewerSwitchingPane"/> - <message_argument value="getTitleArgument()"/> - </message_arguments> - </filter> - </resource> - <resource path="compare/org/eclipse/compare/ISharedDocumentAdapter.java" type="org.eclipse.compare.ISharedDocumentAdapter"> - <filter id="403853384"> - <message_arguments> - <message_argument value="org.eclipse.compare.ISharedDocumentAdapter"/> - </message_arguments> - </filter> - </resource> -</component> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 14b3cf71a..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,72 +0,0 @@ -#Wed Nov 15 09:22:56 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,NORMAL,NORMAL
-org.eclipse.jdt.core.compiler.taskTags=TODO,XXX,FIXME
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/META-INF/MANIFEST.MF b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/META-INF/MANIFEST.MF deleted file mode 100644 index 857781080..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/META-INF/MANIFEST.MF +++ /dev/null @@ -1,30 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %pluginName -Bundle-SymbolicName: org.eclipse.compare; singleton:=true -Bundle-Version: 3.5.200.qualifier -Bundle-Activator: org.eclipse.compare.internal.CompareUIPlugin -Bundle-Vendor: %providerName -Bundle-Localization: plugin -Export-Package: org.eclipse.compare, - org.eclipse.compare.contentmergeviewer, - org.eclipse.compare.internal;x-internal:=true, - org.eclipse.compare.internal.merge;x-internal:=true, - org.eclipse.compare.internal.patch;x-internal:=true, - org.eclipse.compare.patch, - org.eclipse.compare.structuremergeviewer -Require-Bundle: org.eclipse.ui;bundle-version="[3.5.0,4.0.0)", - org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)", - org.eclipse.jface.text;bundle-version="[3.3.0,4.0.0)", - org.eclipse.ui.ide;bundle-version="[3.3.0,4.0.0)", - org.eclipse.ui.views;bundle-version="[3.2.0,4.0.0)", - org.eclipse.ui.workbench.texteditor;bundle-version="[3.5.0,4.0.0)", - org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)", - org.eclipse.core.expressions;bundle-version="[3.2.0,4.0.0)", - org.eclipse.ui.editors;bundle-version="[3.5.0,4.0.0)", - org.eclipse.ui.forms;bundle-version="[3.2.0,4.0.0)", - org.eclipse.compare.core;bundle-version="[3.5.0,4.0.0)";visibility:=reexport -Bundle-ActivationPolicy: lazy -Import-Package: com.ibm.icu.util, - com.ibm.icu.text -Bundle-RequiredExecutionEnvironment: J2SE-1.4 diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/about.html b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/about.html deleted file mode 100644 index 460233046..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/about.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> -<title>About</title> -</head> -<body lang="EN-US"> -<h2>About This Content</h2> - -<p>June 2, 2006</p> -<h3>License</h3> - -<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise -indicated below, the Content is provided to you under the terms and conditions of the -Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available -at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>. -For purposes of the EPL, "Program" will mean the Content.</p> - -<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is -being redistributed by another party ("Redistributor") and different terms and conditions may -apply to your use of any object code in the Content. Check the Redistributor's license that was -provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise -indicated below, the terms and conditions of the EPL still apply to any source code in the Content -and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p> - -</body> -</html>
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/build.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/build.properties deleted file mode 100644 index b326bd3fb..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/build.properties +++ /dev/null @@ -1,19 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2006 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 -############################################################################### -source.. = compare/ -bin.includes = icons/,\ - plugin.xml,\ - .,\ - plugin.properties,\ - about.html,\ - META-INF/ -src.includes = about.html,\ - schema/ diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/BufferedContent.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/BufferedContent.java deleted file mode 100644 index 307cf578b..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/BufferedContent.java +++ /dev/null @@ -1,131 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -import org.eclipse.compare.internal.ContentChangeNotifier; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.core.runtime.CoreException; - -/** - * Abstract implementation for a buffered <code>IStreamContentAccessor</code>. - * <p> - * Subclasses must implement the <code>createStream</code> method - * to connect the buffered content with a streamable source (e.g., a file). - * <p> - * As long as the contents of <code>BufferedContent</code> is only retrieved as an input stream - * (by means of <code>getContents</code>) and the <code>BufferedContent</code> is not modified (with - * <code>setContent</code>) no buffering takes place. - * Buffering starts when either method <code>getContent</code> or <code>setContent</code> is called. - * - * @see IContentChangeNotifier - * @see IStreamContentAccessor - */ -public abstract class BufferedContent implements IContentChangeNotifier, IStreamContentAccessor { - - byte[] fContent; - private ContentChangeNotifier fChangeNotifier; - - /** - * Creates a buffered stream content accessor. - */ - protected BufferedContent() { - // empty implementation - } - - /* (non-Javadoc) - * see IStreamContentAccessor.getContents - */ - public InputStream getContents() throws CoreException { - if (fContent != null) - return new ByteArrayInputStream(fContent); - return createStream(); - } - - /** - * Creates and returns a stream for reading the contents. - * <p> - * Subclasses must implement this method. - * </p> - * - * @return the stream from which the content is read - * @exception CoreException if the contents could not be accessed - */ - protected abstract InputStream createStream() throws CoreException; - - /** - * Sets the contents. Registered content change listeners are notified. - * - * @param contents the new contents - */ - public void setContent(byte[] contents) { - fContent= contents; - fireContentChanged(); - } - - /** - * Returns the contents as an array of bytes. - * - * @return the contents as an array of bytes, or <code>null</code> if - * the contents could not be accessed - */ - public byte[] getContent() { - if (fContent == null) { - try { - InputStream is= createStream(); - fContent= Utilities.readBytes(is); - } catch(CoreException ex) { - // NeedWork - } - } - return fContent; - } - - /** - * Discards the buffered content. - */ - public void discardBuffer() { - fContent= null; - } - - /* (non-Javadoc) - * see IContentChangeNotifier.addChangeListener - */ - public void addContentChangeListener(IContentChangeListener listener) { - if (fChangeNotifier == null) - fChangeNotifier= new ContentChangeNotifier(this); - fChangeNotifier.addContentChangeListener(listener); - } - - /* (non-Javadoc) - * see IContentChangeNotifier.removeChangeListener - */ - public void removeContentChangeListener(IContentChangeListener listener) { - if (fChangeNotifier != null) { - fChangeNotifier.removeContentChangeListener(listener); - if (fChangeNotifier.isEmpty()) - fChangeNotifier= null; - } - } - - /** - * Notifies all registered <code>IContentChangeListener</code>s of a content change. - */ - protected void fireContentChanged() { - if (fChangeNotifier == null || fChangeNotifier.isEmpty()) { - return; - } - fChangeNotifier.fireContentChanged(); - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java deleted file mode 100644 index 23db3dd30..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java +++ /dev/null @@ -1,710 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.eclipse.compare.internal.CompareContainer; -import org.eclipse.compare.internal.ComparePreferencePage; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.DiffImageDescriptor; -import org.eclipse.compare.internal.ICompareUIConstants; -import org.eclipse.compare.rangedifferencer.RangeDifference; -import org.eclipse.compare.structuremergeviewer.Differencer; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.resource.LocalResourceManager; -import org.eclipse.jface.resource.ResourceManager; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.ILabelProviderListener; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.LabelProviderChangedEvent; -import org.eclipse.swt.graphics.Image; - -/** - * A <code>CompareConfiguration</code> object - * controls various UI aspects of compare/merge viewers like - * title labels and images, or whether a side of a merge viewer is editable. - * In addition to these fixed properties <code>ICompareConfiguration</code> provides - * API for an open ended set of properties. Different viewers which share the same - * configuration can communicate via this mechanism. E.g. if a compare editor - * has a button for controlling whether compare viewers ignore white space, - * the button would trigger a change of the boolean <code>IGNORE_WHITESPACE</code> property - * and all interested viewers would receive notification. - * <p> - * Suitable default labels are provided (without images); both the left and right sides - * are editable. - * </p> - * <p> - * Clients may use this class as is, or subclass to add new state and behavior. - * </p> - */ -public class CompareConfiguration { - - /** - * Name of the ignore whitespace property (value <code>"IGNORE_WHITESPACE"</code>). - */ - public static final String IGNORE_WHITESPACE= "IGNORE_WHITESPACE"; //$NON-NLS-1$ - /** - * Name of the show pseudo conflicts property (value <code>"SHOW_PSEUDO_CONFLICTS"</code>). - */ - public static final String SHOW_PSEUDO_CONFLICTS= "SHOW_PSEUDO_CONFLICTS"; //$NON-NLS-1$ - /** - * Name of the use outline view property (value <code>"USE_OUTLINE_VIEW"</code>). - * @since 3.0 - */ - public static final String USE_OUTLINE_VIEW= "USE_OUTLINE_VIEW"; //$NON-NLS-1$ - - private static ImageDescriptor[] fgImages= new ImageDescriptor[16]; - private static boolean fLeftIsLocal= true; - - static { - if (fLeftIsLocal) { - fgImages[Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/del_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/r_inadd_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/r_outadd_ov.gif"); //$NON-NLS-1$ - - fgImages[Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/add_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/r_indel_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/r_outdel_ov.gif"); //$NON-NLS-1$ - - fgImages[Differencer.LEFT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/r_inchg_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/r_outchg_ov.gif"); //$NON-NLS-1$ - } else { - fgImages[Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/add_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/inadd_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/outadd_ov.gif"); //$NON-NLS-1$ - - fgImages[Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/del_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/indel_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/outdel_ov.gif"); //$NON-NLS-1$ - - fgImages[Differencer.LEFT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/inchg_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/outchg_ov.gif"); //$NON-NLS-1$ - } - - fgImages[Differencer.CONFLICTING + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/confadd_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.CONFLICTING + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/confdel_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.CONFLICTING + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/confchg_ov.gif"); //$NON-NLS-1$ - } - - private IPreferenceStore fPreferenceStore; - private ListenerList fListeners= new ListenerList(); - private HashMap fProperties= new HashMap(); - private boolean fLeftEditable= true; - private boolean fRightEditable= true; - private String fAncestorLabel; - private String fLeftLabel; - private String fRightLabel; - private Image fAncestorImage; - private Image fRightImage; - private Image fLeftImage; - private ICompareContainer fContainer; - private DefaultLabelProvider labelProvider = new DefaultLabelProvider(); - private boolean fDisposed; - private LocalResourceManager fResourceManager; - private Set fIgnoredChanges = new HashSet(6); - - private class DefaultLabelProvider extends LabelProvider implements ICompareInputLabelProvider, ILabelProviderListener { - private Map labelProviders = new HashMap(); - private ICompareInputLabelProvider defaultLabelProvider; - public Image getAncestorImage(Object input) { - ICompareInputLabelProvider provider = getLabelProvider(input); - if (provider != null) { - Image image = provider.getAncestorImage(input); - if (image != null) - return image; - } - return fAncestorImage; - } - public String getAncestorLabel(Object input) { - ICompareInputLabelProvider provider = getLabelProvider(input); - if (provider != null) { - String label = provider.getAncestorLabel(input); - if (label != null) - return label; - } - return fAncestorLabel; - } - public Image getLeftImage(Object input) { - ICompareInputLabelProvider provider = getLabelProvider(input); - if (provider != null) { - Image image = provider.getLeftImage(input); - if (image != null) - return image; - } - return fLeftImage; - } - public String getLeftLabel(Object input) { - ICompareInputLabelProvider provider = getLabelProvider(input); - if (provider != null) { - String label = provider.getLeftLabel(input); - if (label != null) - return label; - } - return fLeftLabel; - } - public Image getRightImage(Object input) { - ICompareInputLabelProvider provider = getLabelProvider(input); - if (provider != null) { - Image image = provider.getRightImage(input); - if (image != null) - return image; - } - return fRightImage; - } - public String getRightLabel(Object input) { - ICompareInputLabelProvider provider = getLabelProvider(input); - if (provider != null) { - String label = provider.getRightLabel(input); - if (label != null) - return label; - } - return fRightLabel; - } - public ICompareInputLabelProvider getLabelProvider(Object input) { - ICompareInputLabelProvider lp = (ICompareInputLabelProvider)labelProviders.get(input); - if (lp == null) - return defaultLabelProvider; - return lp; - } - public void setLabelProvider(ICompareInput input, ICompareInputLabelProvider labelProvider) { - ICompareInputLabelProvider old = (ICompareInputLabelProvider)labelProviders.get(input); - if (old != null) - old.removeListener(this); - labelProviders.put(input, labelProvider); - labelProvider.addListener(this); - } - public Image getImage(Object element) { - ICompareInputLabelProvider provider = getLabelProvider(element); - if (provider != null) { - Image image = provider.getImage(element); - if (image != null) - return image; - } - if (element instanceof ICompareInput) { - ICompareInput ci = (ICompareInput) element; - Image image = ci.getImage(); - if (image != null) - return image; - } - return super.getImage(element); - } - public String getText(Object element) { - ICompareInputLabelProvider provider = getLabelProvider(element); - if (provider != null) { - String label = provider.getText(element); - if (label != null) - return label; - } - if (element instanceof ICompareInput) { - ICompareInput ci = (ICompareInput) element; - String label = ci.getName(); - if (label != null) - return label; - } - return super.getText(element); - } - - public void dispose() { - for (Iterator iterator = labelProviders.values().iterator(); iterator.hasNext();) { - ICompareInputLabelProvider lp = (ICompareInputLabelProvider) iterator.next(); - lp.removeListener(this); - } - if (defaultLabelProvider != null) - defaultLabelProvider.removeListener(this); - defaultLabelProvider = null; - labelProviders.clear(); - } - - public void labelProviderChanged(LabelProviderChangedEvent event) { - fireLabelProviderChanged(new LabelProviderChangedEvent(this, event.getElements())); - } - public void setDefaultLabelProvider(ICompareInputLabelProvider labelProvider) { - if (defaultLabelProvider != null) - defaultLabelProvider.removeListener(this); - defaultLabelProvider = labelProvider; - if (defaultLabelProvider != null) - defaultLabelProvider.addListener(this); - } - } - - /** - * Creates a new configuration with editable left and right sides, - * suitable default labels, and no images. - * The given preference store is used to connect this configuration - * with the Compare preference page properties <code>ComparePreferencePage.INITIALLY_SHOW_ANCESTOR_PANE</code>, - * and <code>CompareConfiguration.IGNORE_WHITESPACE</code>. - * - * @param prefStore the preference store which this configuration holds onto. - * @since 2.0 - */ - public CompareConfiguration(IPreferenceStore prefStore) { - - setProperty("LEFT_IS_LOCAL", Boolean.valueOf(fLeftIsLocal)); //$NON-NLS-1$ - - fPreferenceStore= prefStore; - if (fPreferenceStore != null) { - boolean b= fPreferenceStore.getBoolean(ComparePreferencePage.INITIALLY_SHOW_ANCESTOR_PANE); - setProperty(ICompareUIConstants.PROP_ANCESTOR_VISIBLE, new Boolean(b)); - - b= fPreferenceStore.getBoolean(ComparePreferencePage.IGNORE_WHITESPACE); - setProperty(CompareConfiguration.IGNORE_WHITESPACE, new Boolean(b)); - } - } - - /** - * Creates a new configuration with editable left and right sides, - * suitable default labels, and no images. - * This configuration uses the preference store of the Compare plug-in - * (<code>CompareUIPlugin.getDefault().getPreferenceStore()</code>). - */ - public CompareConfiguration() { - this(CompareUIPlugin.getDefault().getPreferenceStore()); - } - - /** - * Returns the preference store of this configuration. - * @return the preference store of this configuration. - * @since 2.0 - */ - public IPreferenceStore getPreferenceStore() { - return fPreferenceStore; - } - - /** - * Returns an image showing the specified change kind. - * The different kind of changes are defined in the <code>Differencer</code>. - * Newly created images are remembered by this class and - * disposed when the <code>dispose</code> method is called. - * - * @param kind the kind of change as defined in <code>Differencer</code>. - * @return an modification of the base image reflecting the kind of change. - * @see org.eclipse.compare.structuremergeviewer.Differencer - * @since 2.0 - */ - public Image getImage(int kind) { - if (fDisposed) - return null; - ImageDescriptor id= fgImages[kind & 15]; - ResourceManager rm = getResourceManager(); - return rm.createImage(id); - } - - private synchronized ResourceManager getResourceManager() { - if (fResourceManager == null) { - fResourceManager = new LocalResourceManager(JFaceResources.getResources()); - } - return fResourceManager; - } - - /** - * Returns an image showing the specified change kind applied to a - * given base image. The different kind of changes are defined in the <code>Differencer</code>. - * Typically an implementation would build a composite image - * from the given base image and an image representing the change kind. - * Newly created images are remembered by this class and - * disposed when the <code>dispose</code> method is called. - * - * @param base the image which is modified to reflect the kind of change - * @param kind the kind of change as defined in <code>Differencer</code>. - * @return an modification of the base image reflecting the kind of change. - * @see org.eclipse.compare.structuremergeviewer.Differencer - */ - public Image getImage(Image base, int kind) { - if (fDisposed) - return null; - kind &= 15; - ImageDescriptor id = new DiffImageDescriptor(base, fgImages[kind], ICompareUIConstants.COMPARE_IMAGE_WIDTH, !fLeftIsLocal); - ResourceManager rm = getResourceManager(); - return rm.createImage(id); - } - - /** - * Dispose of this compare configuration. - * This method is called if the compare configuration is no longer used. - * An implementation must dispose of all resources. - */ - public void dispose() { - fDisposed = true; - if (fResourceManager != null) { - fResourceManager.dispose(); - } - labelProvider.dispose(); - } - - /** - * Fires a <code>PropertyChangeEvent</code> to registered listeners. - * - * @param propertyName the name of the property that has changed - * @param oldValue the property's old value - * @param newValue the property's new value - */ - private void fireChange(String propertyName, Object oldValue, Object newValue) { - PropertyChangeEvent event= null; - Object[] listeners= fListeners.getListeners(); - if (listeners != null) { - for (int i= 0; i < listeners.length; i++) { - IPropertyChangeListener l= (IPropertyChangeListener) listeners[i]; - if (event == null) - event= new PropertyChangeEvent(this, propertyName, oldValue, newValue); - l.propertyChange(event); - } - } - } - - /* (non javadoc) - * see IPropertyChangeNotifier.addListener - */ - public void addPropertyChangeListener(IPropertyChangeListener listener) { - fListeners.add(listener); - } - - /* (non javadoc) - * see IPropertyChangeNotifier.removeListener - */ - public void removePropertyChangeListener(IPropertyChangeListener listener) { - fListeners.remove(listener); - } - - /** - * Sets the property with the given name. - * If the new value differs from the old a <code>PropertyChangeEvent</code> - * is sent to registered listeners. - * - * @param key the name of the property to set - * @param newValue the new value of the property - */ - public void setProperty(String key, Object newValue) { - Object oldValue= fProperties.get(key); - fProperties.put(key, newValue); - if (oldValue == null || !oldValue.equals(newValue)) - fireChange(key, oldValue, newValue); - } - - /** - * Returns the property with the given name, or <code>null</code> - * if no such property exists. - * - * @param key the name of the property to retrieve - * @return the property with the given name, or <code>null</code> if not found - */ - public Object getProperty(String key) { - return fProperties.get(key); - } - - //---- ancestor - - /** - * Sets the label to use for the ancestor of compare/merge viewers. - * This label will be used if the element for which a label - * is requested does not have an ancestor or the element does not have - * a registered label provider or the label provider returns <code>null</code> - * as the label. - * - * @param label the new label for the ancestor of compare/merge viewers - */ - public void setAncestorLabel(String label) { - fAncestorLabel= label; - } - - /** - * Returns the label for the ancestor side of compare/merge viewers. - * This label is typically shown in the title of the ancestor area in a compare viewer. - * - * @param element the input object of a compare/merge viewer or <code>null</code> - * @return the label for the ancestor side or <code>null</code> - */ - public String getAncestorLabel(Object element) { - return labelProvider.getAncestorLabel(element); - } - - /** - * Sets the image to use for the ancestor of compare/merge viewers. - * The CompareConfiguration does not automatically dispose the old image. - * This image will be used if the element for which a image - * is requested does not have an ancestor or the element does not have - * a registered label provider or the label provider returns <code>null</code> - * as the image. - * - * @param image the new image for the ancestor of compare/merge viewers - */ - public void setAncestorImage(Image image) { - fAncestorImage= image; - } - - /** - * Returns the image for the ancestor side of compare/merge viewers. - * This image is typically shown in the title of the ancestor area in a compare viewer. - * - * @param element the input object of a compare/merge viewer or <code>null</code> - * @return the image for the ancestor side or <code>null</code> - */ - public Image getAncestorImage(Object element) { - return labelProvider.getAncestorImage(element); - } - - //---- left side - - /** - * Controls whether the left side of a merge viewer is editable. - * - * @param editable if the value is <code>true</code> left side is editable - */ - public void setLeftEditable(boolean editable) { - fLeftEditable= editable; - } - - /** - * Returns whether the left hand side of a merge viewer is editable. - * - * @return <code>true</code> if the left hand side is editable - */ - public boolean isLeftEditable() { - return fLeftEditable; - } - - /** - * Sets the label to use for the left side of compare/merge viewers. - * This label will be used if the element for which a label - * is requested does not have a left contributor or the element does not have - * a registered label provider or the label provider returns <code>null</code> - * as the label. - * - * @param label the new label for the left side of compare/merge viewers - */ - public void setLeftLabel(String label) { - fLeftLabel= label; - } - - /** - * Returns the label for the left hand side of compare/merge viewers. - * This label is typically shown in the title of the left side of a compare viewer. - * - * @param element the input object of a compare/merge viewer or <code>null</code> - * @return the label for the left hand side or <code>null</code> - */ - public String getLeftLabel(Object element) { - return labelProvider.getLeftLabel(element); - } - - /** - * Sets the image to use for the left side of compare/merge viewers. - * The compare configuration does not automatically dispose the old image. - * This image will be used if the element for which a image - * is requested does not have an left contributor or the element does not have - * a registered label provider or the label provider returns <code>null</code> - * as the image. - * - * @param image the new image for the left side of compare/merge viewers - */ - public void setLeftImage(Image image) { - fLeftImage= image; - } - - /** - * Returns the image for the left hand side of compare/merge viewers. - * This image is typically shown in the title of the left side of a compare viewer. - * - * @param element the input object of a compare/merge viewer or <code>null</code> - * @return the image for the left hand side or <code>null</code> - */ - public Image getLeftImage(Object element) { - return labelProvider.getLeftImage(element); - } - - //---- right side - - /** - * Controls whether the right side of a merge viewer is editable. - * - * @param editable if the value is <code>true</code> right side is editable - */ - public void setRightEditable(boolean editable) { - fRightEditable= editable; - } - - /** - * Returns whether the right hand side of a merge viewer is editable. - * - * @return <code>true</code> if the right hand side is editable - */ - public boolean isRightEditable() { - return fRightEditable; - } - - /** - * Sets the label to use for the right side of compare/merge viewers. - * This label will be used if the element for which a label - * is requested does not have an right contributor or the element does not have - * a registered label provider or the label provider returns <code>null</code> - * as the label. - * - * @param label the new label for the right side of compare/merge viewers - */ - public void setRightLabel(String label) { - fRightLabel= label; - } - - /** - * Returns the label for the right hand side of compare/merge viewers. - * This label is typically shown in the title of the right side of a compare viewer. - * - * @param element the input object of a compare/merge viewer or <code>null</code> - * @return the label for the right hand side or <code>null</code> - */ - public String getRightLabel(Object element) { - return labelProvider.getRightLabel(element); - } - - /** - * Sets the image to use for the right side of compare/merge viewers. - * The compare configuration does not automatically dispose the old image. - * This image will be used if the element for which a image - * is requested does not have an right contributor or the element does not have - * a registered label provider or the label provider returns <code>null</code> - * as the image. - * - * @param image the new image for the right side of compare/merge viewers - */ - public void setRightImage(Image image) { - fRightImage= image; - } - - /** - * Returns the image for the right hand side of compare/merge viewers. - * This image is typically shown in the title of the right side of a compare viewer. - * - * @param element the input object of a compare/merge viewer or <code>null</code> - * @return the image for the right hand side or <code>null</code> - */ - public Image getRightImage(Object element) { - return labelProvider.getRightImage(element); - } - - /** - * Return the container of the compare associated with this configuration. - * @return the container of the compare associated with this configuration - * @since 3.3 - */ - public ICompareContainer getContainer() { - if (fContainer == null) { - // Create a default container in case one is not provided - fContainer= new CompareContainer(); - } - return fContainer; - } - - /** - * Set the container of the compare associated with this configuration. - * @param container the container of the compare associated with this configuration. - * @since 3.3 - */ - public void setContainer(ICompareContainer container) { - fContainer = container; - } - - /** - * Return the label provider that is used to determine the - * text and labels return by this compare configuration. - * @return the label provider that is used to determine the - * text and labels return by this compare configuration - * @see #getAncestorImage(Object) - * @see #getAncestorLabel(Object) - * @see #getLeftImage(Object) - * @see #getLeftLabel(Object) - * @see #getRightImage(Object) - * @see #getRightLabel(Object) - * @since 3.3 - */ - public ICompareInputLabelProvider getLabelProvider() { - return labelProvider; - } - - /** - * Set the label provider for the given compare input. The compare configuration - * will not dispose of the label provider when the configuration is disposed. - * It is up to the provider of the label provider to ensure that it is - * disposed when it is no longer needed. - * @param input the compare input - * @param labelProvider the label provider for the compare input - * @since 3.3 - */ - public void setLabelProvider(ICompareInput input, ICompareInputLabelProvider labelProvider) { - this.labelProvider.setLabelProvider(input, labelProvider); - } - - /** - * Set the default label provider for this configuration. The default label - * provider is used when a particular label provider has not been assigned - * using - * {@link #setLabelProvider(ICompareInput, ICompareInputLabelProvider)}. - * The compare configuration will not dispose of the label provider when the - * configuration is disposed. It is up to the provider of the label provider - * to ensure that it is disposed when it is no longer needed. - * - * @param labelProvider the default label provider - * @since 3.3 - */ - public void setDefaultLabelProvider(ICompareInputLabelProvider labelProvider) { - this.labelProvider.setDefaultLabelProvider(labelProvider); - } - - /** - * Set whether given change kind should be ignored while computing - * differences between documents. Changes specified by this method will be - * excluded from a comparison result. - * - * @param kind - * type of change, possible values are: - * {@link RangeDifference#CHANGE} - * {@link RangeDifference#CONFLICT} {@link RangeDifference#RIGHT} - * {@link RangeDifference#LEFT} {@link RangeDifference#ANCESTOR} - * {@link RangeDifference#ERROR} - * @param ignored - * whether given kind should be included in the ignored set - * @since 3.5 - */ - public void setChangeIgnored(int kind, boolean ignored) { - if (ignored) { - fIgnoredChanges.add(new Integer(kind)); - } else { - fIgnoredChanges.remove(new Integer(kind)); - } - } - - /** - * Return if a given change kind is ignored while computing differences - * between documents. - * - * @param kind - * type of change, possible values are: - * {@link RangeDifference#CHANGE} - * {@link RangeDifference#CONFLICT} {@link RangeDifference#RIGHT} - * {@link RangeDifference#LEFT} {@link RangeDifference#ANCESTOR} - * {@link RangeDifference#ERROR} - * @return whether kind of change is ignored - * @since 3.5 - */ - public boolean isChangeIgnored(int kind) { - return fIgnoredChanges.contains(new Integer(kind)); - } - -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java deleted file mode 100644 index d9fba9f7e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java +++ /dev/null @@ -1,1532 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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; - -import java.lang.reflect.InvocationTargetException; -import java.util.ResourceBundle; - -import org.eclipse.compare.contentmergeviewer.ContentMergeViewer; -import org.eclipse.compare.contentmergeviewer.IFlushable; -import org.eclipse.compare.internal.BinaryCompareViewer; -import org.eclipse.compare.internal.ChangePropertyAction; -import org.eclipse.compare.internal.CompareContentViewerSwitchingPane; -import org.eclipse.compare.internal.CompareEditorInputNavigator; -import org.eclipse.compare.internal.CompareMessages; -import org.eclipse.compare.internal.ComparePreferencePage; -import org.eclipse.compare.internal.CompareStructureViewerSwitchingPane; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.ICompareUIConstants; -import org.eclipse.compare.internal.IFlushable2; -import org.eclipse.compare.internal.OutlineViewerCreator; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.internal.ViewerDescriptor; -import org.eclipse.compare.structuremergeviewer.DiffTreeViewer; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener; -import org.eclipse.compare.structuremergeviewer.IDiffContainer; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.PlatformObject; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jface.action.IStatusLineManager; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.action.ToolBarManager; -import org.eclipse.jface.dialogs.ErrorDialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.text.IFindReplaceTarget; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.IOpenListener; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.OpenEvent; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.BusyIndicator; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.ui.IActionBars; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IPersistableElement; -import org.eclipse.ui.ISaveablesSource; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.part.FileEditorInput; -import org.eclipse.ui.part.IShowInSource; -import org.eclipse.ui.part.ShowInContext; -import org.eclipse.ui.services.IServiceLocator; -import org.eclipse.ui.texteditor.ITextEditorExtension3; - - -/** - * A compare operation which can present its results in a special editor. - * Running the compare operation and presenting the results in a compare editor - * are combined in one class because it allows a client to keep the implementation - * all in one place while separating it from the innards of a specific UI implementation of compare/merge. - * <p> - * A <code>CompareEditorInput</code> defines methods for the following sequence steps: - * <UL> - * <LI>running a lengthy compare operation under progress monitor control, - * <LI>creating a UI for displaying the model and initializing the some widgets with the compare result, - * <LI>tracking the dirty state of the model in case of merge, - * <LI>saving the model. - * </UL> - * The Compare plug-in's <code>openCompareEditor</code> method takes an <code>CompareEditorInput</code> - * and starts sequencing through the above steps. If the compare result is not empty a new compare editor - * is opened and takes over the sequence until eventually closed. - * <p> - * The <code>prepareInput</code> method should contain the - * code of the compare operation. It is executed under control of a progress monitor - * and can be canceled. If the result of the compare is not empty, that is if there are differences - * that needs to be presented, the <code>ICompareInput</code> should hold onto them and return them with - * the <code>getCompareResult</code> method. - * If the value returned from <code>getCompareResult</code> is not <code>null</code> - * a compare editor is opened on the <code>ICompareInput</code> with title and title image initialized by the - * corresponding methods of the <code>ICompareInput</code>. - * <p> - * Creation of the editor's SWT controls is delegated to the <code>createContents</code> method. - * Here the SWT controls must be created and initialized with the result of the compare operation. - * <p> - * If merging is allowed, the modification state of the compared constituents must be tracked and the dirty - * state returned from method <code>isSaveNeeded</code>. The value <code>true</code> triggers a subsequent call - * to <code>save</code> where the modified resources can be saved. - * <p> - * The most important part of this implementation is the setup of the compare/merge UI. - * The UI uses a simple browser metaphor to present compare results. - * The top half of the layout shows the structural compare results (e.g. added, deleted, and changed files), - * the bottom half the content compare results (e.g. textual differences between two files). - * A selection in the top pane is fed to the bottom pane. If a content viewer is registered - * for the type of the selected object, this viewer is installed in the pane. - * In addition if a structure viewer is registered for the selection type the top pane - * is split vertically to make room for another pane and the structure viewer is installed - * in it. When comparing Java files this second structure viewer would show the structural - * differences within a Java file, e.g. added, deleted or changed methods and fields. - * <p> - * Subclasses provide custom setups, e.g. for a Catch-up/Release operation - * by passing a subclass of <code>CompareConfiguration</code> and by implementing the <code>prepareInput</code> method. - * If a subclass cannot use the <code>DiffTreeViewer</code> which is installed by default in the - * top left pane, method <code>createDiffViewer</code> can be overridden. - * <p> - * If subclasses of this class implement {@link ISaveablesSource}, the compare editor will - * pass these models through to the workbench. The editor will still show the dirty indicator - * if one of these underlying models is dirty. It is the responsibility of subclasses that - * implement this interface to call {@link #setDirty(boolean)} when the dirty state of - * any of the models managed by the subclass change dirty state. - * - * @see CompareUI - * @see CompareEditorInput - */ -public abstract class CompareEditorInput extends PlatformObject implements IEditorInput, IPropertyChangeNotifier, IRunnableWithProgress, ICompareContainer { - - private static final boolean DEBUG= false; - - /** - * The name of the "dirty" property (value <code>"DIRTY_STATE"</code>). - */ - public static final String DIRTY_STATE= "DIRTY_STATE"; //$NON-NLS-1$ - - /** - * The name of the "title" property. This property is fired when the title - * of the compare input changes. Clients should also re-obtain the tool tip - * when this property changes. - * @see #getTitle() - * @since 3.3 - */ - public static final String PROP_TITLE= ICompareUIConstants.PROP_TITLE; - - /** - * The name of the "title image" property. This property is fired when the title - * image of the compare input changes. - * @see #getTitleImage() - * @since 3.3 - */ - public static final String PROP_TITLE_IMAGE= ICompareUIConstants.PROP_TITLE_IMAGE; - - /** - * The name of the "selected edition" property. This property is fired when the selected - * edition of the compare input changes. - * @see #isEditionSelectionDialog() - * @see #getSelectedEdition() - * @since 3.3 - */ - public static final String PROP_SELECTED_EDITION= ICompareUIConstants.PROP_SELECTED_EDITION; - - private static final String COMPARE_EDITOR_IMAGE_NAME= "eview16/compare_view.gif"; //$NON-NLS-1$ - private static Image fgTitleImage; - - private Splitter fComposite; - private CompareConfiguration fCompareConfiguration; - private CompareViewerPane fStructureInputPane; - private CompareViewerSwitchingPane fStructurePane1; - private CompareViewerSwitchingPane fStructurePane2; - private CompareViewerSwitchingPane fContentInputPane; - private CompareViewerPane fFocusPane; - private String fMessage; - private Object fInput; - private String fTitle; - private ListenerList fListenerList= new ListenerList(); - private CompareNavigator fNavigator; - private ContentMergeViewer fLeftDirtyViewer = null; - private ContentMergeViewer fRightDirtyViewer = null; - private IPropertyChangeListener fDirtyStateListener; - - boolean fStructureCompareOnSingleClick= true; - - private ICompareContainer fContainer; - private boolean fContainerProvided; - private String fHelpContextId; - private InternalOutlineViewerCreator fOutlineView; - private ViewerDescriptor fContentViewerDescriptor; - private ViewerDescriptor fStructureViewerDescriptor; - - private class InternalOutlineViewerCreator extends OutlineViewerCreator { - private OutlineViewerCreator getWrappedCreator() { - if (fContentInputPane != null) { - Viewer v = fContentInputPane.getViewer(); - if (v != null) { - return (OutlineViewerCreator)Utilities.getAdapter(v, OutlineViewerCreator.class); - } - } - return null; - } - public Viewer findStructureViewer(Viewer oldViewer, - ICompareInput input, Composite parent, - CompareConfiguration configuration) { - OutlineViewerCreator creator = getWrappedCreator(); - if (creator != null) - return creator.findStructureViewer(oldViewer, input, parent, configuration); - return null; - } - - public boolean hasViewerFor(Object input) { - OutlineViewerCreator creator = getWrappedCreator(); - return creator != null; - } - - public Object getInput() { - OutlineViewerCreator creator = getWrappedCreator(); - if (creator != null) - return creator.getInput(); - return null; - } - } - - /** - * Creates a <code>CompareEditorInput</code> which is initialized with the given - * compare configuration. - * The compare configuration is passed to subsequently created viewers. - * - * @param configuration the compare configuration - */ - public CompareEditorInput(CompareConfiguration configuration) { - fCompareConfiguration= configuration; - Assert.isNotNull(configuration); - - fDirtyStateListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent e) { - String propertyName= e.getProperty(); - if (CompareEditorInput.DIRTY_STATE.equals(propertyName)) { - boolean changed= false; - Object newValue= e.getNewValue(); - if (newValue instanceof Boolean) - changed= ((Boolean)newValue).booleanValue(); - setDirty(e.getSource(), changed); - } - } - }; - - IPreferenceStore ps= configuration.getPreferenceStore(); - if (ps != null) - fStructureCompareOnSingleClick= ps.getBoolean(ComparePreferencePage.OPEN_STRUCTURE_COMPARE); - - fContainer = configuration.getContainer(); - configuration.setContainer(this); - } - - private boolean structureCompareOnSingleClick() { - return fStructureCompareOnSingleClick; - } - - private boolean isShowStructureInOutlineView() { - Object object= getCompareConfiguration().getProperty(CompareConfiguration.USE_OUTLINE_VIEW); - return object instanceof Boolean && ((Boolean)object).booleanValue(); - } - - /* (non Javadoc) - * see IAdaptable.getAdapter - */ - public Object getAdapter(Class adapter) { - if (ICompareNavigator.class.equals(adapter) || CompareNavigator.class.equals(adapter)) { - return getNavigator(); - } - if (adapter == IShowInSource.class) { - final IFile file = (IFile)Utilities.getAdapter(this, IFile.class); - if (file != null) - return new IShowInSource() { - public ShowInContext getShowInContext() { - return new ShowInContext(new FileEditorInput(file), StructuredSelection.EMPTY); - } - }; - } - if (adapter == OutlineViewerCreator.class) { - synchronized (this) { - if (fOutlineView == null) - fOutlineView = new InternalOutlineViewerCreator(); - return fOutlineView; - } - } - if (adapter == IFindReplaceTarget.class) { - if (fContentInputPane != null) { - Viewer v = fContentInputPane.getViewer(); - if (v != null) { - return Utilities.getAdapter(v, IFindReplaceTarget.class); - } - } - } - if (adapter == IEditorInput.class) { - if (fContentInputPane != null) { - Viewer v = fContentInputPane.getViewer(); - if (v != null) { - return Utilities.getAdapter(v, IEditorInput.class); - } - } - } - - if (adapter == ITextEditorExtension3.class) { - if (fContentInputPane != null) { - Viewer v = fContentInputPane.getViewer(); - if (v != null) { - return Utilities.getAdapter(v, ITextEditorExtension3.class); - } - } - } - - return super.getAdapter(adapter); - } - - public synchronized ICompareNavigator getNavigator() { - if (fNavigator == null) - fNavigator= new CompareEditorInputNavigator( - new Object[] { - fStructureInputPane, - fStructurePane1, - fStructurePane2, - fContentInputPane - } - ); - return fNavigator; - } - - /* (non Javadoc) - * see IEditorInput.getImageDescriptor - */ - public ImageDescriptor getImageDescriptor() { - return null; - } - - /* (non Javadoc) - * see IEditorInput.getToolTipText - */ - public String getToolTipText() { - return getTitle(); - } - - /* (non Javadoc) - * see IEditorInput.getName - */ - public String getName() { - return getTitle(); - } - - /** - * Returns <code>null</code> since this editor cannot be persisted. - * - * @return <code>null</code> because this editor cannot be persisted - */ - public IPersistableElement getPersistable() { - return null; - } - - /** - * Returns <code>false</code> to indicate that this input - * should not appear in the "File Most Recently Used" menu. - * - * @return <code>false</code> - */ - public boolean exists() { - return false; - } - - /* - * FIXME! - */ - protected void setMessage(String message) { - fMessage= message; - } - - /* - * FIXME! - */ - public String getMessage() { - return fMessage; - } - - /** - * Returns the title which will be used in the compare editor's title bar. - * It can be set with <code>setTitle</code>. - * - * @return the title - */ - public String getTitle() { - if (fTitle == null) - return Utilities.getString("CompareEditorInput.defaultTitle"); //$NON-NLS-1$ - return fTitle; - } - - /** - * Sets the title which will be used when presenting the compare result. - * This method must be called before the editor is opened. - * - * @param title the title to use for the CompareEditor - */ - public void setTitle(String title) { - String oldTitle = fTitle; - fTitle= title; - Utilities.firePropertyChange(fListenerList, this, PROP_TITLE, oldTitle, title); - } - - /** - * Returns the title image which will be used in the compare editor's title bar. - * Returns the title image which will be used when presenting the compare result. - * This implementation returns a generic compare icon. - * Subclasses can override. - * - * @return the title image, or <code>null</code> if none - */ - public Image getTitleImage() { - if (fgTitleImage == null) { - fgTitleImage= CompareUIPlugin.getImageDescriptor(COMPARE_EDITOR_IMAGE_NAME).createImage(); - CompareUI.disposeOnShutdown(fgTitleImage); - } - return fgTitleImage; - } - - /** - * Returns the configuration object for the viewers within the compare editor. - * Returns the configuration which was passed to the constructor. - * - * @return the compare configuration - */ - public CompareConfiguration getCompareConfiguration() { - return fCompareConfiguration; - } - - /** - * Adds standard actions to the given <code>ToolBarManager</code>. - * <p> - * Subclasses may override to add their own actions. - * </p> - * - * @param toolBarManager the <code>ToolBarManager</code> to which to contribute - */ - public void contributeToToolBar(ToolBarManager toolBarManager) { - ResourceBundle bundle= CompareUI.getResourceBundle(); - ChangePropertyAction ignoreWhitespace= ChangePropertyAction.createIgnoreWhiteSpaceAction(bundle, getCompareConfiguration()); - toolBarManager.getControl().addDisposeListener(ignoreWhitespace); - ChangePropertyAction showPseudoConflicts= ChangePropertyAction.createShowPseudoConflictsAction(bundle, getCompareConfiguration()); - toolBarManager.getControl().addDisposeListener(showPseudoConflicts); - toolBarManager.add(new Separator()); - toolBarManager.add(ignoreWhitespace); - toolBarManager.add(showPseudoConflicts); - } - - /** - * Runs the compare operation and stores the compare result. - * - * @param monitor the progress monitor to use to display progress and receive - * requests for cancelation - * @exception InvocationTargetException if the <code>prepareInput</code> method must propagate a checked exception, - * it should wrap it inside an <code>InvocationTargetException</code>; runtime exceptions are automatically - * wrapped in an <code>InvocationTargetException</code> by the calling context - * @exception InterruptedException if the operation detects a request to cancel, - * using <code>IProgressMonitor.isCanceled()</code>, it should exit by throwing - * <code>InterruptedException</code> - */ - public void run(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException { - fInput= prepareInput(monitor); - } - - /** - * Runs the compare operation and returns the compare result. - * If <code>null</code> is returned no differences were found and no compare editor needs to be opened. - * Progress should be reported to the given progress monitor. - * A request to cancel the operation should be honored and acknowledged - * by throwing <code>InterruptedException</code>. - * <p> - * Note: this method is typically called in a modal context thread which doesn't have a Display assigned. - * Implementors of this method shouldn't therefore allocated any SWT resources in this method. - * </p> - * - * @param monitor the progress monitor to use to display progress and receive - * requests for cancelation - * @return the result of the compare operation, or <code>null</code> if there are no differences - * @exception InvocationTargetException if the <code>prepareInput</code> method must propagate a checked exception, - * it should wrap it inside an <code>InvocationTargetException</code>; runtime exceptions are automatically - * wrapped in an <code>InvocationTargetException</code> by the calling context - * @exception InterruptedException if the operation detects a request to cancel, - * using <code>IProgressMonitor.isCanceled()</code>, it should exit by throwing - * <code>InterruptedException</code> - */ - protected abstract Object prepareInput(IProgressMonitor monitor) - throws InvocationTargetException, InterruptedException; - - /** - * Returns the compare result computed by the most recent call to the - * <code>run</code> method. Returns <code>null</code> if no - * differences were found. - * - * @return the compare result prepared in method <code>prepareInput</code> - * or <code>null</code> if there were no differences - */ - public Object getCompareResult() { - return fInput; - } - - /** - * Create the SWT controls that are used to display the result of the compare operation. - * Creates the SWT Controls and sets up the wiring between the individual panes. - * This implementation creates all four panes but makes only the necessary ones visible. - * Finally it feeds the compare result into the top left structure viewer - * and the content viewer. - * <p> - * Subclasses may override if they need to change the layout or wiring between panes. - * - * @param parent the parent control under which the control must be created - * @return the SWT control hierarchy for the compare editor - */ - public Control createContents(Composite parent) { - - fComposite= new Splitter(parent, SWT.VERTICAL); - fComposite.setData(this); - - Control outline= createOutlineContents(fComposite, SWT.HORIZONTAL); - - fContentInputPane= createContentViewerSwitchingPane(fComposite, SWT.BORDER | SWT.FLAT, this); - - if (fFocusPane == null) - fFocusPane= fContentInputPane; - if (outline != null) - fComposite.setVisible(outline, false); - fComposite.setVisible(fContentInputPane, true); - - if (fStructureInputPane != null && fComposite.getChildren().length == 2) - fComposite.setWeights(new int[] { 30, 70 }); - - fComposite.layout(); - - feedInput(); - - fComposite.addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - /* - * When the UI associated with this compare editor input is - * disposed each composite being part of the UI releases its - * children first. A dispose listener is added to the last - * widget found in that structure. Therefore, compare editor - * input is disposed at the end making it possible to refer - * during widgets disposal. - */ - Composite composite = fComposite; - Control control = composite; - while (composite.getChildren().length > 0) { - control = composite.getChildren()[composite.getChildren().length - 1]; - if (control instanceof Composite) - composite = (Composite) control; - else - break; - } - control.addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent ev) { - handleDispose(); - } - }); - } - }); - if (fHelpContextId != null) - PlatformUI.getWorkbench().getHelpSystem().setHelp(fComposite, fHelpContextId); - contentsCreated(); - return fComposite; - } - - /** - * @param parent the parent control under which the control must be created - * @param style the style of widget to construct - * @param cei the compare editor input for the viewer - * @return the pane displaying content changes - * @nooverride This method is not intended to be re-implemented or extended by clients. - * @noreference This method is not intended to be referenced by clients. - */ - protected CompareViewerSwitchingPane createContentViewerSwitchingPane(Splitter parent, int style, CompareEditorInput cei) { - return new CompareContentViewerSwitchingPane(parent, style, cei); - } - - /** - * Callback that occurs when the UI associated with this compare editor - * input is disposed. This method will only be invoked if the UI has been - * created (i.e. after the call to {@link #createContents(Composite)}. - * Subclasses can extend this method but ensure that the overridden method - * is invoked. - * - * @since 3.3 - */ - protected void handleDispose() { - fContainerProvided = false; - fContainer = null; - fComposite = null; - fStructureInputPane = null; - fStructurePane1 = null; - fStructurePane2 = null; - fContentInputPane = null; - fFocusPane = null; - fNavigator = null; - fCompareConfiguration.dispose(); - } - - /** - * Callback that occurs after the control for the input has - * been created. If this method gets invoked then {@link #handleDispose()} - * will be invoked when the control is disposed. Subclasses may extend this - * method to register any listeners that need to be de-registered when the - * input is disposed. - * @since 3.3 - */ - protected void contentsCreated() { - // Default is to do nothing - } - - /** - * @param parent the parent control under which the control must be created - * @param direction the layout direction of the contents, either </code>SWT.HORIZONTAL<code> or </code>SWT.VERTICAL<code> - * @return the SWT control hierarchy for the outline part of the compare editor - * @since 3.0 - */ - public Control createOutlineContents(Composite parent, int direction) { - final Splitter h= new Splitter(parent, direction); - - fStructureInputPane= createStructureInputPane(h); - if (hasChildren(getCompareResult())) - fFocusPane= fStructureInputPane; - - fStructurePane1= new CompareStructureViewerSwitchingPane(h, SWT.BORDER | SWT.FLAT, true, this); - h.setVisible(fStructurePane1, false); - - fStructurePane2= new CompareStructureViewerSwitchingPane(h, SWT.BORDER | SWT.FLAT, true, this); - h.setVisible(fStructurePane2, false); - - // setup the wiring for top left pane - fStructureInputPane.addOpenListener( - new IOpenListener() { - public void open(OpenEvent oe) { - feed1(oe.getSelection()); - } - } - ); - fStructureInputPane.addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent e) { - ISelection s= e.getSelection(); - if (s == null || s.isEmpty()) - feed1(s); - if (isEditionSelectionDialog()) - firePropertyChange(new PropertyChangeEvent(this, PROP_SELECTED_EDITION, null, getSelectedEdition())); - } - } - ); - fStructureInputPane.addDoubleClickListener( - new IDoubleClickListener() { - public void doubleClick(DoubleClickEvent event) { - feedDefault1(event.getSelection()); - } - } - ); - - fStructurePane1.addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent e) { - feed2(e.getSelection()); - } - } - ); - - fStructurePane2.addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent e) { - feed3(e.getSelection()); - } - } - ); - - return h; - } - - /** - * Create the pane that will contain the structure input pane (upper left). - * By default, a {@link CompareViewerSwitchingPane} is returned. Subclasses - * may override to provide an alternate pane. - * @param parent the parent composite - * @return the structure input pane - * @since 3.3 - */ - protected CompareViewerPane createStructureInputPane( - final Composite parent) { - return new CompareStructureViewerSwitchingPane(parent, SWT.BORDER | SWT.FLAT, true, this) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - if (CompareEditorInput.this.hasChildren(input)) { - return createDiffViewer(this); - } - return super.getViewer(oldViewer, input); - } - }; - } - - /* private */ boolean hasChildren(Object input) { - if (input instanceof IDiffContainer) { - IDiffContainer dn= (IDiffContainer) input; - return dn.hasChildren(); - } - return false; - } - - private void feedInput() { - if (fStructureInputPane != null - && (fInput instanceof ICompareInput - || isCustomStructureInputPane())) { - if (hasChildren(fInput) || isCustomStructureInputPane()) { - // The input has multiple entries so set the input of the structure input pane - fStructureInputPane.setInput(fInput); - } else if (!structureCompareOnSingleClick() || isShowStructureInOutlineView()) { - // We want to avoid showing the structure in the editor if we can so first - // we'll set the content pane to see if we need to provide a structure - internalSetContentPaneInput(fInput); - // If the content viewer is unusable - if (hasUnusableContentViewer() - || (structureCompareOnSingleClick() - && isShowStructureInOutlineView() - && !hasOutlineViewer(fInput))) { - fStructureInputPane.setInput(fInput); - } - } else { - fStructureInputPane.setInput(fInput); - } - ISelection sel= fStructureInputPane.getSelection(); - if (sel == null || sel.isEmpty()) - feed1(sel); // we only feed downstream viewers if the top left pane is empty - } - } - - private boolean hasOutlineViewer(Object input) { - if (!isShowStructureInOutlineView()) - return false; - OutlineViewerCreator creator = (OutlineViewerCreator)getAdapter(OutlineViewerCreator.class); - if (creator != null) - return creator.hasViewerFor(input); - return false; - } - - private boolean hasUnusableContentViewer() { - return fContentInputPane.isEmpty() || fContentInputPane.getViewer() instanceof BinaryCompareViewer; - } - - private boolean isCustomStructureInputPane() { - return !(fStructureInputPane instanceof CompareViewerSwitchingPane); - } - - private void feed1(final ISelection selection) { - BusyIndicator.showWhile(fComposite.getDisplay(), - new Runnable() { - public void run() { - if (selection == null || selection.isEmpty()) { - Object input= fStructureInputPane.getInput(); - if (input != null) - internalSetContentPaneInput(input); - if (!Utilities.okToUse(fStructurePane1) || !Utilities.okToUse(fStructurePane2)) - return; - fStructurePane2.setInput(null); // clear downstream pane - fStructurePane1.setInput(null); - } else { - Object input= getElement(selection); - internalSetContentPaneInput(input); - if (!Utilities.okToUse(fStructurePane1) || !Utilities.okToUse(fStructurePane2)) - return; - if (structureCompareOnSingleClick() || hasUnusableContentViewer()) - fStructurePane1.setInput(input); - fStructurePane2.setInput(null); // clear downstream pane - if (fStructurePane1.getInput() != input) - fStructurePane1.setInput(null); - } - } - } - ); - } - - private void feedDefault1(final ISelection selection) { - BusyIndicator.showWhile(fComposite.getDisplay(), - new Runnable() { - public void run() { - if (!selection.isEmpty()) - fStructurePane1.setInput(getElement(selection)); - } - } - ); - } - - private void feed2(final ISelection selection) { - BusyIndicator.showWhile(fComposite.getDisplay(), - new Runnable() { - public void run() { - if (selection.isEmpty()) { - Object input= fStructurePane1.getInput(); - internalSetContentPaneInput(input); - fStructurePane2.setInput(null); - } else { - Object input= getElement(selection); - internalSetContentPaneInput(input); - fStructurePane2.setInput(input); - } - } - } - ); - } - - private void feed3(final ISelection selection) { - BusyIndicator.showWhile(fComposite.getDisplay(), - new Runnable() { - public void run() { - if (selection.isEmpty()) - internalSetContentPaneInput(fStructurePane2.getInput()); - else - internalSetContentPaneInput(getElement(selection)); - } - } - ); - - } - - private void internalSetContentPaneInput(Object input) { - Object oldInput = fContentInputPane.getInput(); - fContentInputPane.setInput(input); - if (fOutlineView != null) - fOutlineView.fireInputChange(oldInput, input); - } - - /** - * Returns the first element of the given selection if the selection - * is a <code>IStructuredSelection</code> with exactly one element. Returns - * <code>null</code> otherwise. - * - * @param selection the selection - * @return the first element of the selection, or <code>null</code> - */ - private static Object getElement(ISelection selection) { - if (selection instanceof IStructuredSelection) { - IStructuredSelection ss= (IStructuredSelection) selection; - if (ss.size() == 1) - return ss.getFirstElement(); - } - return null; - } - - /** - * Asks this input to take focus within its container (editor). - * - * @noreference Clients should not call this method but they may override if - * they implement a different layout with different visual - * components. Clients are free to call the inherited method. - * - * @deprecated Please use {@link #setFocus2()} instead. - */ - public void setFocus() { - setFocus2(); - } - - /** - * Asks this input to take focus within its container (editor). - * - * @noreference Clients should not call this method but they may override if - * they implement a different layout with different visual - * components. Clients are free to call the inherited method. - * - * @return <code>true</code> if the input got focus, and <code>false</code> - * if it was unable to. - * @since 3.5 - */ - public boolean setFocus2() { - if (fFocusPane != null) { - return fFocusPane.setFocus(); - } else if (fComposite != null) - return fComposite.setFocus(); - return false; - } - - /** - * Factory method for creating a differences viewer for the top left pane. - * It is called from <code>createContents</code> and returns a <code>DiffTreeViewer</code>. - * <p> - * Subclasses may override if they need a different viewer. - * </p> - * - * @param parent the SWT parent control under which to create the viewer's SWT controls - * @return a compare viewer for the top left pane - */ - public Viewer createDiffViewer(Composite parent) { - return new DiffTreeViewer(parent, fCompareConfiguration); - } - - /** - * Implements the dynamic viewer switching for structure viewers. - * The method must return a compare viewer based on the old (or current) viewer - * and a new input object. If the old viewer is suitable for showing the new input the old viewer - * can be returned. Otherwise a new viewer must be created under the given parent composite or - * <code>null</code> can be returned to indicate that no viewer could be found. - * <p> - * This implementation forwards the request to <code>CompareUI.findStructureViewer</code>. - * <p> - * Subclasses may override to implement a different strategy. - * </p> - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a structure viewer - * @param parent the SWT parent composite under which the new viewer is created - * @return a compare viewer which is suitable for the given input object or <code>null</code> - */ - public Viewer findStructureViewer(Viewer oldViewer, ICompareInput input, Composite parent) { - return fStructureViewerDescriptor != null ? fStructureViewerDescriptor.createViewer(oldViewer, parent, - fCompareConfiguration) : CompareUI.findStructureViewer(oldViewer, - input, parent, fCompareConfiguration); - } - - /** - * Implements the dynamic viewer switching for content viewers. - * The method must return a compare viewer based on the old (or current) viewer - * and a new input object. If the old viewer is suitable for showing the new input the old viewer - * can be returned. Otherwise a new viewer must be created under the given parent composite or - * <code>null</code> can be returned to indicate that no viewer could be found. - * <p> - * This implementation forwards the request to <code>CompareUI.findContentViewer</code>. - * <p> - * Subclasses may override to implement a different strategy. - * </p> - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a structure viewer - * @param parent the SWT parent composite under which the new viewer is created - * @return a compare viewer which is suitable for the given input object or <code>null</code> - */ - public Viewer findContentViewer(Viewer oldViewer, ICompareInput input, Composite parent) { - - Viewer newViewer = fContentViewerDescriptor != null ? fContentViewerDescriptor.createViewer(oldViewer, parent, - fCompareConfiguration) : CompareUI.findContentViewer(oldViewer, - input, parent, fCompareConfiguration); - - boolean isNewViewer= newViewer != oldViewer; - if (DEBUG) System.out.println("CompareEditorInput.findContentViewer: " + isNewViewer); //$NON-NLS-1$ - - if (isNewViewer && newViewer instanceof IPropertyChangeNotifier) { - final IPropertyChangeNotifier dsp= (IPropertyChangeNotifier) newViewer; - dsp.addPropertyChangeListener(fDirtyStateListener); - - Control c= newViewer.getControl(); - c.addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - dsp.removePropertyChangeListener(fDirtyStateListener); - } - } - ); - } - - return newViewer; - } - - /** - * @param vd - * the content viewer descriptor - * @noreference This method is not intended to be referenced by clients. - * @nooverride This method is not intended to be re-implemented or extended - * by clients. - */ - public void setContentViewerDescriptor(ViewerDescriptor vd) { - this.fContentViewerDescriptor = vd; - } - - /** - * @return the content viewer descriptor set for the input - * @noreference This method is not intended to be referenced by clients. - * @nooverride This method is not intended to be re-implemented or extended - * by clients. - */ - public ViewerDescriptor getContentViewerDescriptor() { - return this.fContentViewerDescriptor; - } - - /** - * @param vd - * the structure viewer descriptor - * @noreference This method is not intended to be referenced by clients. - * @nooverride This method is not intended to be re-implemented or extended - * by clients. - */ - public void setStructureViewerDescriptor(ViewerDescriptor vd) { - this.fStructureViewerDescriptor = vd; - } - - /** - * @return the structure viewer descriptor set for the input - * @noreference This method is not intended to be referenced by clients. - * @nooverride This method is not intended to be re-implemented or extended - * by clients. - */ - public ViewerDescriptor getStructureViewerDescriptor() { - return this.fStructureViewerDescriptor; - } - - /** - * Returns <code>true</code> if there are unsaved changes in either left or - * right side. The value returned is the value of the - * <code>DIRTY_STATE</code> property of this input object. - * - * Returns <code>true</code> if left or right side has unsaved changes - * Subclasses don't have to override if the functionality provided by - * <code>setDirty</code> is sufficient. - * - * @return <code>true</code> if there are changes that need to be saved - */ - public boolean isSaveNeeded() { - return isLeftSaveNeeded() || isRightSaveNeeded(); - } - - /** - * Returns <code>true</code> if there are unsaved changes for left side. - * - * @return <code>true</code> if there are changes that need to be saved - * @noreference This method is not intended to be referenced by clients. - */ - protected boolean isLeftSaveNeeded() { - return fLeftDirtyViewer != null; - } - - /** - * Returns <code>true</code> if there are unsaved changes for right side. - * - * @return <code>true</code> if there are changes that need to be saved - * @noreference This method is not intended to be referenced by clients. - */ - protected boolean isRightSaveNeeded() { - return fRightDirtyViewer != null; - } - - /** - * Returns <code>true</code> if there are unsaved changes. - * The method should be called by any parts or dialogs - * that contain the input. - * By default, this method calls {@link #isSaveNeeded()} - * but subclasses may extend. - * @return <code>true</code> if there are unsaved changes - * @since 3.3 - */ - public boolean isDirty() { - return isSaveNeeded(); - } - - /** - * Sets the dirty state of this input to the given value and sends out a - * <code>PropertyChangeEvent</code> if the new value differs from the old - * value. Direct calling this method with parameter dirty equal to - * <code>false</code> when there are unsaved changes in viewers, results in - * inconsistent state. The dirty state of compare input should be based only - * on the information if there are changes in viewers for left or right - * side. - * - * @param dirty - * the dirty state for this compare input - */ - public void setDirty(boolean dirty) { - boolean oldDirty = isSaveNeeded(); - boolean newDirty = dirty || isSaveNeeded(); - if (!newDirty) { - fLeftDirtyViewer = null; - fRightDirtyViewer = null; - } - if (oldDirty != isSaveNeeded()) { - Utilities.firePropertyChange(fListenerList, this, DIRTY_STATE, Boolean.valueOf(oldDirty), Boolean.valueOf(isSaveNeeded())); - } - } - - /** - * Method adds or removes viewers that changed left or right side of this - * compare input. Any modification of any of the list of viewers may result - * in dirty state change. - * - * @param source - * the object that fired <code>PropertyChangeEvent</code> - * modifying the dirty state - * @param dirty - * value that describes if the changes were added or removed - */ - private void setDirty(Object source, boolean dirty) { - Assert.isNotNull(source); - boolean oldDirty = isSaveNeeded(); - ContentMergeViewer cmv = (ContentMergeViewer) source; - if (dirty) { - if (cmv.internalIsLeftDirty()) { - if (fLeftDirtyViewer == null) { - fLeftDirtyViewer = cmv; - } - } - if (cmv.internalIsRightDirty()) { - if (fRightDirtyViewer == null) { - fRightDirtyViewer = cmv; - } - } - } else { - if (!cmv.internalIsLeftDirty()) { - fLeftDirtyViewer = null; - } - if (!cmv.internalIsRightDirty()) { - fRightDirtyViewer = null; - } - } - boolean newDirty = isSaveNeeded(); - if (DEBUG) { - System.out.println("setDirty(" + source + ", " + dirty + "): " + newDirty); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - if (oldDirty != newDirty) { - Utilities.firePropertyChange(fListenerList, this, DIRTY_STATE, Boolean.valueOf(oldDirty), Boolean.valueOf(newDirty)); - } - } - - /* (non Javadoc) - * see IPropertyChangeNotifier.addListener - */ - public void addPropertyChangeListener(IPropertyChangeListener listener) { - if (listener != null) - fListenerList.add(listener); - } - - /* (non Javadoc) - * see IPropertyChangeNotifier.removeListener - */ - public void removePropertyChangeListener(IPropertyChangeListener listener) { - if (fListenerList != null) { - fListenerList.remove(listener); - } - } - - /** - * Save any unsaved changes. - * Empty implementation. - * Subclasses must override to save any changes. - * - * @param pm an <code>IProgressMonitor</code> that the implementation of save may use to show progress - * @deprecated Override method saveChanges instead. - */ - public void save(IProgressMonitor pm) { - // empty default implementation - } - - /** - * Save any unsaved changes. - * Subclasses must override to save any changes. - * This implementation tries to flush changes in all viewers by - * calling <code>ISavable.save</code> on them. - * - * @param monitor an <code>IProgressMonitor</code> that the implementation of save may use to show progress - * @throws CoreException - * @since 2.0 - */ - public void saveChanges(IProgressMonitor monitor) throws CoreException { - - flushViewers(monitor); - - save(monitor); - } - - /** - * Flush the viewer contents into the input. - * @param monitor a progress monitor - * @since 3.3 - */ - protected void flushViewers(IProgressMonitor monitor) { - // flush changes in any dirty viewer - flushViewer(fStructureInputPane, monitor); - flushViewer(fStructurePane1, monitor); - flushViewer(fStructurePane2, monitor); - flushViewer(fContentInputPane, monitor); - } - - /** - * @param monitor - * @noreference This method is not intended to be referenced by clients. - */ - protected void flushLeftViewers(IProgressMonitor monitor) { - // flush changes in left dirty viewer - flushViewer(fStructureInputPane, monitor); - flushViewer(fStructurePane1, monitor); - flushViewer(fStructurePane2, monitor); - flushLeftViewer(fContentInputPane, monitor); - } - - /** - * @param monitor - * @noreference This method is not intended to be referenced by clients. - */ - protected void flushRightViewers(IProgressMonitor monitor) { - // flush changes in right dirty viewer - flushViewer(fStructureInputPane, monitor); - flushViewer(fStructurePane1, monitor); - flushViewer(fStructurePane2, monitor); - flushRightViewer(fContentInputPane, monitor); - } - - private static void flushViewer(CompareViewerPane pane, IProgressMonitor pm) { - if (pane != null) { - IFlushable flushable = (IFlushable)Utilities.getAdapter(pane, IFlushable.class); - if (flushable != null) - flushable.flush(pm); - } - } - - private static void flushLeftViewer(CompareViewerPane pane, IProgressMonitor pm) { - if (pane != null) { - IFlushable2 flushable = (IFlushable2)Utilities.getAdapter(pane, IFlushable2.class); - if (flushable != null) - flushable.flushLeft(pm); - } - } - - private static void flushRightViewer(CompareViewerPane pane, IProgressMonitor pm) { - if (pane != null) { - IFlushable2 flushable = (IFlushable2)Utilities.getAdapter(pane, IFlushable2.class); - if (flushable != null) - flushable.flushRight(pm); - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#addCompareInputChangeListener(org.eclipse.compare.structuremergeviewer.ICompareInput, org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener) - */ - public void addCompareInputChangeListener(ICompareInput input, - ICompareInputChangeListener listener) { - if (fContainer == null) { - input.addCompareInputChangeListener(listener); - } else { - fContainer.addCompareInputChangeListener(input, listener); - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#removeCompareInputChangeListener(org.eclipse.compare.structuremergeviewer.ICompareInput, org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener) - */ - public void removeCompareInputChangeListener(ICompareInput input, - ICompareInputChangeListener listener) { - if (fContainer == null) { - input.removeCompareInputChangeListener(listener); - } else { - fContainer.removeCompareInputChangeListener(input, listener); - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#registerContextMenu(org.eclipse.jface.action.MenuManager, org.eclipse.jface.viewers.ISelectionProvider) - */ - public void registerContextMenu(MenuManager menu, ISelectionProvider selectionProvider) { - if (fContainer != null) - fContainer.registerContextMenu(menu, selectionProvider); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#setStatusMessage(java.lang.String) - */ - public void setStatusMessage(String message) { - if (!fContainerProvided) { - // Try the action bars directly - IActionBars actionBars= getActionBars(); - if (actionBars != null) { - IStatusLineManager slm= actionBars.getStatusLineManager(); - if (slm != null) { - slm.setMessage(message); - } - } - } else if (fContainer != null) { - fContainer.setStatusMessage(message); - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#getActionBars() - */ - public IActionBars getActionBars() { - if (fContainer != null) { - IActionBars actionBars = fContainer.getActionBars(); - if (actionBars == null && !fContainerProvided) { - // The old way to find the action bars - return Utilities.findActionBars(fComposite); - } - return actionBars; - } - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#getServiceLocator() - */ - public IServiceLocator getServiceLocator() { - IServiceLocator serviceLocator = fContainer.getServiceLocator(); - if (serviceLocator == null && !fContainerProvided) { - // The old way to find the service locator - return Utilities.findSite(fComposite); - } - return serviceLocator; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#getWorkbenchPart() - */ - public IWorkbenchPart getWorkbenchPart() { - if (fContainer != null) - return fContainer.getWorkbenchPart(); - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress) - */ - public void run(boolean fork, boolean cancelable, - IRunnableWithProgress runnable) throws InvocationTargetException, - InterruptedException { - if (fContainer != null) - fContainer.run(fork, cancelable, runnable); - } - - public void runAsynchronously(IRunnableWithProgress runnable) { - if (fContainer != null) - fContainer.runAsynchronously(runnable); - } - - /** - * Set the container of this input to the given container - * @param container the container - * @since 3.3 - */ - public void setContainer(ICompareContainer container) { - Assert.isNotNull(container); - this.fContainer = container; - fContainerProvided = true; - } - - /** - * Return the container of this input or <code>null</code> if there is no container - * set. - * @return the container of this input or <code>null</code> - * @since 3.3 - */ - public final ICompareContainer getContainer() { - return fContainer; - } - - /** - * Fire the given property change event to all listeners - * registered with this compare editor input. - * @param event the property change event - * @since 3.3 - */ - protected void firePropertyChange(PropertyChangeEvent event) { - Utilities.firePropertyChange(fListenerList, event); - } - - /** - * Return whether this compare editor input can be run as a job. - * By default, <code>false</code> is returned since traditionally inputs - * were prepared in the foreground (i.e the UI was blocked when the - * {@link #run(IProgressMonitor)} method (and indirectly the - * {@link #prepareInput(IProgressMonitor)} method) was invoked. Subclasses - * may override. - * @return whether this compare editor input can be run in the background - * @since 3.3 - */ - public boolean canRunAsJob() { - return false; - } - - /** - * Return whether this input belongs to the given family - * when it is run as a job. - * @see #canRunAsJob() - * @see Job#belongsTo(Object) - * @param family the job family - * @return whether this input belongs to the given family - * @since 3.3 - */ - public boolean belongsTo(Object family) { - return family == this; - } - - /** - * Return whether this input is intended to be used to select - * a particular edition of an element in a dialog. The result - * of this method is only consider if neither sides of the - * input are editable. By default, <code>false</code> is returned. - * @return whether this input is intended to be used to select - * a particular edition of an element in a dialog - * @see #getOKButtonLabel() - * @see #okPressed() - * @see #getSelectedEdition() - * @since 3.3 - */ - public boolean isEditionSelectionDialog() { - return false; - } - - /** - * Return the label to be used for the <code>OK</code> - * button when this input is displayed in a dialog. - * By default, different labels are used depending on - * whether the input is editable or is for edition selection - * (see {@link #isEditionSelectionDialog()}. - * @return the label to be used for the <code>OK</code> - * button when this input is displayed in a dialog - * @since 3.3 - */ - public String getOKButtonLabel() { - if (isEditable()) - return CompareMessages.CompareDialog_commit_button; - if (isEditionSelectionDialog()) - return CompareMessages.CompareEditorInput_0; - return IDialogConstants.OK_LABEL; - } - - /** - * Return the label used for the <code>CANCEL</code> - * button when this input is shown in a compare dialog - * using {@link CompareUI#openCompareDialog(CompareEditorInput)}. - * @return the label used for the <code>CANCEL</code> button - * @since 3.3 - */ - public String getCancelButtonLabel() { - return IDialogConstants.CANCEL_LABEL; - } - - private boolean isEditable() { - return getCompareConfiguration().isLeftEditable() - || getCompareConfiguration().isRightEditable(); - } - - /** - * The <code>OK</code> button was pressed in a dialog. If one or both of - * the sides of the input is editable then any changes will be saved. If the - * input is for edition selection (see {@link #isEditionSelectionDialog()}), - * it is up to subclasses to override this method in order to perform the - * appropriate operation on the selected edition. - * - * @return whether the dialog should be closed or not. - * @since 3.3 - */ - public boolean okPressed() { - if (isEditable()) { - if (!saveChanges()) - return false; - } - return true; - } - - /** - * The <code>CANCEL</code> button was pressed in a dialog. - * By default, nothing is done. Subclasses may override. - * @since 3.3 - */ - public void cancelPressed() { - // Do nothing - } - - private boolean saveChanges() { - try { - PlatformUI.getWorkbench().getProgressService().run(true, true, new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - try { - saveChanges(monitor); - } catch (CoreException e) { - throw new InvocationTargetException(e); - } - } - - }); - return true; - } catch (InterruptedException x) { - // Ignore - } catch (OperationCanceledException x) { - // Ignore - } catch (InvocationTargetException x) { - ErrorDialog.openError(fComposite.getShell(), CompareMessages.CompareDialog_error_title, null, - new Status(IStatus.ERROR, CompareUIPlugin.PLUGIN_ID, 0, - NLS.bind(CompareMessages.CompareDialog_error_message, x.getTargetException().getMessage()), x.getTargetException())); - } - return false; - } - - /** - * Return the selected edition or <code>null</code> if no edition is selected. - * The result of this method should only be considered if {@link #isEditionSelectionDialog()} - * returns <code>true</code>. - * @return the selected edition or <code>null</code> - * @since 3.3 - */ - public Object getSelectedEdition() { - if (fStructureInputPane != null) { - ISelection selection = fStructureInputPane.getSelection(); - if (selection instanceof IStructuredSelection) { - IStructuredSelection ss = (IStructuredSelection) selection; - if (!ss.isEmpty()) - return ss.getFirstElement(); - - } - } - return null; - } - - /** - * Set the help context id for this input. - * @param helpContextId the help context id. - * @since 3.3 - */ - public void setHelpContextId(String helpContextId) { - this.fHelpContextId = helpContextId; - } - -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareNavigator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareNavigator.java deleted file mode 100644 index 90ed8e2ea..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareNavigator.java +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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; - -import org.eclipse.compare.internal.Utilities; -import org.eclipse.core.runtime.IAdaptable; - -/** - * Supports cross-pane navigation through the differences of a compare container. - * <p> - * Clients may subclass this class. - * </p> - * @see INavigatable - * @since 3.3 - */ -public abstract class CompareNavigator implements ICompareNavigator { - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareNavigator#selectChange(boolean) - */ - public boolean selectChange(boolean next) { - // find most down stream CompareViewerPane - INavigatable[] navigators= getNavigatables(); - Object downStreamInput = null; - for (int i = navigators.length - 1; i >=0; i--) { - INavigatable navigatable = navigators[i]; - if (navigatable.getInput() == downStreamInput) { - // Skip to up stream pane if it has the same input - continue; - } - if (navigatable.selectChange(next ? INavigatable.NEXT_CHANGE : INavigatable.PREVIOUS_CHANGE)) { - // at end of this navigator - downStreamInput = navigatable.getInput(); - continue; - } - // not at end - if (i + 1 < navigators.length && navigators[i+1] != null && navigators[i+1].getInput() != downStreamInput) { - // The navigation has invoked a change in a downstream pane. - // Set the selected change depending on the direction we are navigating - navigators[i+1].selectChange(next ? INavigatable.FIRST_CHANGE : INavigatable.LAST_CHANGE); - } - return false; - } - - return true; - } - - protected abstract INavigatable[] getNavigatables(); - - /** - * Return the {@link INavigatable} for the given object. - * If the object implements {@link INavigatable}, then - * the object is returned. Otherwise, if the object - * implements {@link IAdaptable}, the object is - * adapted to {@link INavigatable}. - * @param object the object - * @return the {@link INavigatable} for the given object or <code>null</code> - */ - protected final INavigatable getNavigator(Object object) { - if (object == null) - return null; - Object data= Utilities.getAdapter(object, INavigatable.class); - if (data instanceof INavigatable) - return (INavigatable) data; - return null; - } - - /** - * Return whether a call to {@link ICompareNavigator#selectChange(boolean)} with the same parameter - * would succeed. - * @param next if <code>true</code> the next change is selected, otherwise the previous change - * @return whether a call to {@link ICompareNavigator#selectChange(boolean)} with the same parameter - * would succeed. - * @since 3.3 - */ - public boolean hasChange(boolean next) { - INavigatable[] navigators= getNavigatables(); - Object downStreamInput = null; - for (int i = navigators.length - 1; i >=0; i--) { - INavigatable navigatable = navigators[i]; - if (navigatable.getInput() == downStreamInput) { - // Skip to up stream pane if it has the same input - continue; - } - if (navigatable.hasChange(next ? INavigatable.NEXT_CHANGE : INavigatable.PREVIOUS_CHANGE)) { - return true; - } - // at end of this navigator - downStreamInput = navigatable.getInput(); - } - return false; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareUI.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareUI.java deleted file mode 100644 index 6d1c20941..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareUI.java +++ /dev/null @@ -1,436 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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; - -import java.util.ResourceBundle; - -import org.eclipse.compare.internal.*; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.compare.structuremergeviewer.IStructureCreator; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.content.IContentType; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.ui.IReusableEditor; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.plugin.AbstractUIPlugin; - - -/** - * The class <code>CompareUI</code> defines the entry point to initiate a configurable - * compare operation on arbitrary resources. The result of the compare - * is opened into a compare editor where the details can be browsed and - * edited in dynamically selected structure and content viewers. - * <p> - * The Compare UI provides a registry for content and structure compare viewers, - * which is initialized from extensions contributed to extension points - * declared by this plug-in. - * @noinstantiate This class is not intended to be instantiated by clients. - */ -public final class CompareUI { - - /** - * Compare Plug-in ID (value <code>"org.eclipse.compare"</code>). - * @since 2.0 - */ - public static final String PLUGIN_ID= "org.eclipse.compare"; //$NON-NLS-1$ - - /** - * The id of the Compare Preference Page - * (value <code>"org.eclipse.compare.internal.ComparePreferencePage"</code>). - * - * @since 3.1 - */ - public static final String PREFERENCE_PAGE_ID= "org.eclipse.compare.internal.ComparePreferencePage"; //$NON-NLS-1$ - - /** - * Image descriptor for the disabled icon of the 'Next' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_DTOOL_NEXT= CompareUIPlugin.getImageDescriptor(ICompareUIConstants.DTOOL_NEXT); - /** - * Image descriptor for the normal icon of the 'Next' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_CTOOL_NEXT= CompareUIPlugin.getImageDescriptor(ICompareUIConstants.CTOOL_NEXT); - /** - * Image descriptor for the roll-over icon of the 'Next' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_ETOOL_NEXT= CompareUIPlugin.getImageDescriptor(ICompareUIConstants.ETOOL_NEXT); - - /** - * Image descriptor for the disabled icon of the 'Previous' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_DTOOL_PREV= CompareUIPlugin.getImageDescriptor(ICompareUIConstants.DTOOL_PREV); - /** - * Image descriptor for the normal icon of the 'Previous' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_CTOOL_PREV= CompareUIPlugin.getImageDescriptor(ICompareUIConstants.CTOOL_PREV); - /** - * Image descriptor for the roll-over icon of the 'Previous' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_ETOOL_PREV= CompareUIPlugin.getImageDescriptor(ICompareUIConstants.ETOOL_PREV); - - /** - * Name of the title property of a compare viewer. - * If a property with this name is set - * on the top level SWT control of a viewer, it is used as a title in the pane's - * title bar. - */ - public static final String COMPARE_VIEWER_TITLE= "org.eclipse.compare.CompareUI.CompareViewerTitle"; //$NON-NLS-1$ - - private CompareUI() { - // empty implementation - } - - public static AbstractUIPlugin getPlugin() { - return CompareUIPlugin.getDefault(); - } - - /** - * Returns this plug-in's resource bundle. - * - * @return the plugin's resource bundle - */ - public static ResourceBundle getResourceBundle() { - return CompareUIPlugin.getDefault().getResourceBundle(); - } - - /** - * Performs the comparison described by the given input and opens a - * compare editor on the result in the currently active workbench page. - * - * @param input the input on which to open the compare editor - */ - public static void openCompareEditor(CompareEditorInput input) { - openCompareEditor(input, true); - } - - /** - * Performs the comparison described by the given input and opens a compare - * editor on the result in the currently active workbench page. - * - * @param input - * the input on which to open the compare editor - * @param activate - * if <code>true</code> the editor will be activated - * @see IWorkbenchPage#openEditor(org.eclipse.ui.IEditorInput, String, - * boolean) - * @since 3.5 - */ - public static void openCompareEditor(CompareEditorInput input, boolean activate) { - openCompareEditorOnPage(input, null, activate); - } - - /** - * Performs the comparison described by the given input and opens a - * compare editor on the result in the given workbench page. - * - * @param input the input on which to open the compare editor - * @param page the workbench page in which to open the compare editor - * @since 2.1 - */ - public static void openCompareEditorOnPage(CompareEditorInput input, IWorkbenchPage page) { - openCompareEditorOnPage(input, page, true); - } - - /** - * Performs the comparison described by the given input and opens a compare - * editor on the result in the given workbench page. - * - * @param input - * the input on which to open the compare editor - * @param page - * the workbench page in which to open the compare editor - * @param activate - * if <code>true</code> the editor will be activated - * @see IWorkbenchPage#openEditor(org.eclipse.ui.IEditorInput, String, - * boolean) - */ - private static void openCompareEditorOnPage(CompareEditorInput input, IWorkbenchPage page, boolean activate) { - CompareUIPlugin plugin= CompareUIPlugin.getDefault(); - if (plugin != null) - plugin.openCompareEditor(input, page, null, activate); - } - - /** - * Performs the comparison described by the given input and - * shows the result in the given editor. - * - * @param input the input on which to open the compare editor - * @param editor the compare editor to reuse or null to create a new one - * @since 3.0 - */ - public static void reuseCompareEditor(CompareEditorInput input, IReusableEditor editor) { - reuseCompareEditor(input, editor, true); - } - - /** - * Performs the comparison described by the given input and shows the result - * in the given editor. - * - * @param input - * the input on which to open the compare editor - * @param editor - * the compare editor to reuse or null to create a new one - * @param activate - * if <code>true</code> the editor will be activated - * @see IWorkbenchPage#openEditor(org.eclipse.ui.IEditorInput, String, - * boolean) - */ - private static void reuseCompareEditor(CompareEditorInput input, IReusableEditor editor, boolean activate) { - CompareUIPlugin plugin= CompareUIPlugin.getDefault(); - if (plugin != null) - plugin.openCompareEditor(input, null, editor, activate); - } - - /** - * Performs the comparison described by the given input and opens a - * modal compare dialog on the result. - * - * @param input the input on which to open the compare dialog - */ - public static void openCompareDialog(CompareEditorInput input) { - CompareUIPlugin plugin= CompareUIPlugin.getDefault(); - if (plugin != null) - plugin.openCompareDialog(input); - } - - /** - * Registers an image descriptor for the given type. - * - * @param type the type - * @param descriptor the image descriptor - */ - public static void registerImageDescriptor(String type, ImageDescriptor descriptor) { - CompareUIPlugin.registerImageDescriptor(type, descriptor); - } - - /** - * Returns a shared image for the given type, or a generic image if none - * has been registered for the given type. - * <p> - * Note: Images returned from this method will be automatically disposed - * of when this plug-in shuts down. Callers must not dispose of these - * images themselves. - * </p> - * - * @param type the type - * @return the image - */ - public static Image getImage(String type) { - return CompareUIPlugin.getImage(type); - } - - /** - * Registers the given image for being disposed when this plug-in is shutdown. - * - * @param image the image to register for disposal - */ - public static void disposeOnShutdown(Image image) { - CompareUIPlugin.disposeOnShutdown(image); - } - - /** - * Returns a shared image for the given adaptable. - * This convenience method queries the given adaptable - * for its <code>IWorkbenchAdapter.getImageDescriptor</code>, which it - * uses to create an image if it does not already have one. - * <p> - * Note: Images returned from this method will be automatically disposed - * of when this plug-in shuts down. Callers must not dispose of these - * images themselves. - * </p> - * - * @param adaptable the adaptable for which to find an image - * @return an image - */ - public static Image getImage(IAdaptable adaptable) { - return CompareUIPlugin.getImage(adaptable); - } - - - /** - * Creates a stream merger for the given content type. - * If no stream merger is registered for the given content type <code>null</code> is returned. - * - * @param type the type for which to find a stream merger - * @return a stream merger for the given type, or <code>null</code> if no - * stream merger has been registered - * @deprecated Clients should obtain an <code>org.eclipse.team.core.mapping.IStorageMerger</code> from the - * <code>org.eclipse.team.core.Team#createMerger(IContentType)</code> method. - */ - public static IStreamMerger createStreamMerger(IContentType type) { - return CompareUIPlugin.getDefault().createStreamMerger(type); - } - - /** - * Creates a stream merger for the given file extension. - * If no stream merger is registered for the file extension <code>null</code> is returned. - * - * @param type the type for which to find a stream merger - * @return a stream merger for the given type, or <code>null</code> if no - * stream merger has been registered - * @deprecated Clients should obtain an <code>org.eclipse.team.core.mapping.IStorageMerger</code> from the - * <code>org.eclipse.team.core.Team#createMerger(String)</code> method. - */ - public static IStreamMerger createStreamMerger(String type) { - return CompareUIPlugin.getDefault().createStreamMerger(type); - } - - /** - * Returns a structure compare viewer based on an old viewer and an input object. - * If the old viewer is suitable for showing the input, the old viewer - * is returned. Otherwise, the input's type is used to find a viewer descriptor in the registry - * which in turn is used to create a structure compare viewer under the given parent composite. - * If no viewer descriptor can be found <code>null</code> is returned. - * - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a structure viewer - * @param parent the SWT parent composite under which the new viewer is created - * @param configuration a configuration which is passed to a newly created viewer - * @return the compare viewer which is suitable for the given input object or <code>null</code> - */ - public static Viewer findStructureViewer(Viewer oldViewer, ICompareInput input, Composite parent, - CompareConfiguration configuration) { - - return CompareUIPlugin.getDefault().findStructureViewer(oldViewer, input, parent, configuration); - } - - /** - * Returns a content compare viewer based on an old viewer and an input object. - * If the old viewer is suitable for showing the input the old viewer - * is returned. Otherwise the input's type is used to find a viewer descriptor in the registry - * which in turn is used to create a content compare viewer under the given parent composite. - * If no viewer descriptor can be found <code>null</code> is returned. - * - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a content viewer - * @param parent the SWT parent composite under which the new viewer is created - * @param configuration a configuration which is passed to a newly created viewer - * @return the compare viewer which is suitable for the given input object or <code>null</code> - */ - public static Viewer findContentViewer(Viewer oldViewer, ICompareInput input, Composite parent, - CompareConfiguration configuration) { - return CompareUIPlugin.getDefault().findContentViewer(oldViewer, input, parent, configuration); - } - - /** - * Returns a content compare viewer based on an old viewer and an input - * object. If the old viewer is suitable for showing the input the old - * viewer is returned. Otherwise the input's type is used to find a viewer - * descriptor in the registry which in turn is used to create a content - * compare viewer under the given parent composite. In order to determine - * the input's type, the input must either implement IStreamContentAccessor - * and ITypedElement or ICompareInput. If no viewer descriptor can be found - * <code>null</code> is returned. - * - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a content viewer. Must - * implement either <code>IStreamContentAccessor</code> and<code> - * ITypedElement</code> or <code>ICompareInput</code>. - * @param parent the SWT parent composite under which the new viewer is created - * @param configuration a configuration which is passed to a newly created viewer - * @return the compare viewer which is suitable for the given input object or <code>null</code> - */ - public static Viewer findContentViewer(Viewer oldViewer, Object input, Composite parent, - CompareConfiguration configuration) { - - return CompareUIPlugin.getDefault().findContentViewer(oldViewer, input, parent, configuration); - } - - /** - * Adds an alias for the given type. Subsequent calls to - * <code>findStructureViewer</code> treat alias as a synonym for type and - * return the same viewer. - * - * @param type - * a type name for which a viewer has been registered - * @param alias - * a type name which should be treated as a synonym of type - * @since 2.0 - * @noreference This method is for internal use only. Clients should not - * call this method. - */ - public static void addStructureViewerAlias(String type, String alias) { - CompareUIPlugin.getDefault().addStructureViewerAlias(type, alias); - } - - /** - * Remove all aliases for the given type. This method does not affect the - * initial binding between type and viewer. If no aliases exist for the - * given type this method does nothing. - * - * @param type - * the type name for which all synonyms are removed. - * @since 2.0 - * @noreference This method is for internal use only. Clients should not - * call this method. - */ - public static void removeAllStructureViewerAliases(String type) { - CompareUIPlugin.getDefault().removeAllStructureViewerAliases(type); - } - - /** - * Retrieve a document for the given input or return <code>null</code> if - * no document has been registered for the input. - * @param input the object for which to retrieve a document - * @return a document or <code>null</code> if no document was registered for the input - * @since 3.1 - */ - public static IDocument getDocument(Object input) { - return DocumentManager.get(input); - } - - /** - * Register a document for the given input. - * @param input the object for which to register a document - * @param document the document to register - * @since 3.1 - */ - public static void registerDocument(Object input, IDocument document) { - DocumentManager.put(input, document); - } - - /** - * Unregister the given document. - * @param document the document to unregister - * @since 3.1 - */ - public static void unregisterDocument(IDocument document) { - DocumentManager.remove(document); - } - - /** - * Create and return a structure creator for the given typed element. - * Return <code>null</code> if an appropriate structure creator could - * not be obtained. - * @param element the typed element - * @return structure creator for the given typed element or <code>null</code> - * @since 3.4 - */ - public static IStructureCreator createStructureCreator(ITypedElement element) { - StructureCreatorDescriptor scd= CompareUIPlugin.getDefault().getStructureCreator(element.getType()); - if (scd != null) { - return scd.createStructureCreator(); - } - return null; - } - -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerPane.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerPane.java deleted file mode 100644 index cab95e2d0..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerPane.java +++ /dev/null @@ -1,334 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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; - -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.action.ToolBarManager; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.IOpenListener; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.jface.viewers.OpenEvent; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.swt.SWT; -import org.eclipse.swt.accessibility.ACC; -import org.eclipse.swt.accessibility.AccessibleAdapter; -import org.eclipse.swt.accessibility.AccessibleEvent; -import org.eclipse.swt.custom.CLabel; -import org.eclipse.swt.custom.ViewForm; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.ToolBar; -import org.eclipse.swt.widgets.ToolItem; - -/** - * A <code>CompareViewerPane</code> is a convenience class which installs a - * <code>CLabel</code> and a <code>Toolbar</code> in a <code>ViewForm</code>. - * <P> - * Double clicking onto the <code>CompareViewerPane</code>'s title bar maximizes - * the <code>CompareViewerPane</code> to the size of an enclosing <code>Splitter</code> - * (if there is one). - * If more <code>Splitters</code> are nested maximizing walks up and - * maximizes to the outermost <code>Splitter</code>. - * - * @since 2.0 - */ -public class CompareViewerPane extends ViewForm implements ISelectionProvider, - IDoubleClickListener, ISelectionChangedListener, IOpenListener, IAdaptable { - - private ToolBarManager fToolBarManager; - private Object fInput; - private ListenerList fSelectionListeners= new ListenerList(); - private ListenerList fDoubleClickListener= new ListenerList(); - private ListenerList fOpenListener= new ListenerList(); - - /** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - * - * @param container a widget which will be the container of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parent is null</li> - * </ul> - * @exception org.eclipse.swt.SWTException <ul> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li> - * </ul> - */ - public CompareViewerPane(Composite container, int style) { - super(container, style); - - marginWidth= 0; - marginHeight= 0; - - Control topLeft = createTopLeft(this); - setTopLeft(topLeft); - - MouseAdapter ml= new MouseAdapter() { - public void mouseDoubleClick(MouseEvent e) { - Control content= getContent(); - if (content != null && content.getBounds().contains(e.x, e.y)) - return; - Control parent= getParent(); - if (parent instanceof Splitter) - ((Splitter)parent).setMaximizedControl(CompareViewerPane.this); - } - }; - - addMouseListener(ml); - getTopLeft().addMouseListener(ml); - - addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fToolBarManager != null) { - fToolBarManager.removeAll(); - fToolBarManager.dispose(); - } - fInput= null; - fSelectionListeners= null; - setImage(null); - } - }); - } - - /** - * @param parent - * a widget which will be the parent of the control (cannot be - * null) - * @return the control to be placed in the top left corner of the pane - * @noreference This method is not intended to be referenced by clients. - * @nooverride This method is not intended to be re-implemented or extended - * by clients. - */ - protected Control createTopLeft(Composite parent) { - CLabel label = new CLabel(this, SWT.NONE) { - public Point computeSize(int wHint, int hHint, boolean changed) { - return super.computeSize(wHint, Math.max(24, hHint), changed); - } - }; - return label; - } - - /** - * Set the pane's title text. - * The value <code>null</code> clears it. - * - * @param label the text to be displayed in the pane or null - */ - public void setText(String label) { - CLabel cl= (CLabel) getTopLeft(); - if (cl != null && !cl.isDisposed()) - cl.setText(label); - } - - /** - * Set the pane's title Image. - * The value <code>null</code> clears it. - * - * @param image the image to be displayed in the pane or null - */ - public void setImage(Image image) { - CLabel cl= (CLabel) getTopLeft(); - if (cl != null) - cl.setImage(image); - } - - /** - * Returns a <code>ToolBarManager</code> if the given parent is a - * <code>CompareViewerPane</code> or <code>null</code> otherwise. - * - * @param parent a <code>Composite</code> or <code>null</code> - * @return a <code>ToolBarManager</code> if the given parent is a <code>CompareViewerPane</code> otherwise <code>null</code> - */ - public static ToolBarManager getToolBarManager(Composite parent) { - if (parent instanceof CompareViewerPane) { - CompareViewerPane pane= (CompareViewerPane) parent; - return pane.getToolBarManager(); - } - return null; - } - - /** - * Clears tool items in the <code>CompareViewerPane</code>'s control bar. - * - * @param parent a <code>Composite</code> or <code>null</code> - */ - public static void clearToolBar(Composite parent) { - ToolBarManager tbm= getToolBarManager(parent); - if (tbm != null) { - tbm.removeAll(); - tbm.update(true); - } - } - - //---- private stuff - - private ToolBarManager getToolBarManager() { - if (fToolBarManager != null && fToolBarManager.getControl() == null) - return null; - if (fToolBarManager == null) { - final ToolBar tb = new ToolBar(this, SWT.FLAT); - setTopCenter(tb); - fToolBarManager = new ToolBarManager(tb); - tb.getAccessible().addAccessibleListener(new AccessibleAdapter() { - public void getName(AccessibleEvent e) { - if (e.childID != ACC.CHILDID_SELF) { - ToolItem item = tb.getItem(e.childID); - if (item != null) { - String toolTip = item.getToolTipText(); - if (toolTip != null) { - e.result = toolTip; - } - } - } - } - }); - } - return fToolBarManager; - } - - /** - * Returns the current input of this pane or null if the pane has no input. - * - * @return an <code>Object</code> that is the input to this pane or null if the pane has no input. - * - * @since 3.3 - */ - public Object getInput() { - return fInput; - } - - /** - * Sets the input object of this pane. - * - * @param input the new input object or <code>null</code> - * @since 3.3 - */ - public void setInput(Object input) { - if (fInput != input) - fInput= input; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) - */ - public void addSelectionChangedListener(ISelectionChangedListener l) { - fSelectionListeners.add(l); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) - */ - public void removeSelectionChangedListener(ISelectionChangedListener l) { - fSelectionListeners.remove(l); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() - */ - public ISelection getSelection() { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection) - */ - public void setSelection(ISelection s) { - // Default is to do nothing - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) - */ - public void selectionChanged(SelectionChangedEvent ev) { - Object[] listeners= fSelectionListeners.getListeners(); - for (int i= 0; i < listeners.length; i++) - ((ISelectionChangedListener) listeners[i]).selectionChanged(ev); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent) - */ - public void doubleClick(DoubleClickEvent event) { - Object[] listeners= fDoubleClickListener.getListeners(); - for (int i= 0; i < listeners.length; i++) - ((IDoubleClickListener) listeners[i]).doubleClick(event); - } - - /** - * Add a double-click listener to the pane. The listener will get - * invoked when the contents of the pane are double-clicked. Adding - * a listener that is already registered has no effect. - * @param listener the listener - * @since 3.3 - */ - public void addDoubleClickListener(IDoubleClickListener listener) { - fDoubleClickListener.add(listener); - } - - /** - * Remove a double-click listener. Removing a listener that is not - * registered has no effect. - * @param listener the listener - * @since 3.3 - */ - public void removeDoubleClickListener(IDoubleClickListener listener) { - fDoubleClickListener.remove(listener); - } - - /** - * Add an open listener to the pane. The listener will get - * invoked when the contents of the pane are double-clicked. Adding - * a listener that is already registered has no effect. - * @param listener the listener - * @since 3.3 - */ - public void addOpenListener(IOpenListener listener) { - fOpenListener.add(listener); - } - - /** - * Remove an open listener. Removing a listener that is not - * registered has no effect. - * @param listener the listener - * @since 3.3 - */ - public void removeOpenListener(IOpenListener listener) { - fOpenListener.remove(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.IOpenListener#open(org.eclipse.jface.viewers.OpenEvent) - */ - public void open(OpenEvent event) { - Object[] listeners= fOpenListener.getListeners(); - for (int i= 0; i < listeners.length; i++) - ((IOpenListener) listeners[i]).open(event); - } - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) - */ - public Object getAdapter(Class adapter) { - return Platform.getAdapterManager().getAdapter(this, adapter); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerSwitchingPane.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerSwitchingPane.java deleted file mode 100644 index 47e6f5aac..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerSwitchingPane.java +++ /dev/null @@ -1,397 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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; - -import org.eclipse.compare.contentmergeviewer.IFlushable; -import org.eclipse.compare.internal.CompareMessages; -import org.eclipse.compare.internal.IFlushable2; -import org.eclipse.compare.internal.NullViewer; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.StructuredViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; - -import com.ibm.icu.text.MessageFormat; - - -/** - * A custom <code>CompareViewerPane</code> that supports dynamic viewer switching. - * - * <p> - * Clients must implement the viewer switching strategy by implementing - * the <code>getViewer(Viewer, Object)</code> method. - * <p> - * If a property with the name <code>CompareUI.COMPARE_VIEWER_TITLE</code> is set - * on the top level SWT control of a viewer, it is used as a title in the <code>CompareViewerPane</code>'s - * title bar. - * - * @since 2.0 - */ -public abstract class CompareViewerSwitchingPane extends CompareViewerPane { - - private Viewer fViewer; - private boolean fControlVisibility= false; - private String fTitle; - private String fTitleArgument; - - /** - * Creates a <code>CompareViewerSwitchingPane</code> as a child of the given parent and with the - * specified SWT style bits. - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parent is null</li> - * </ul> - * @exception org.eclipse.swt.SWTException <ul> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li> - * </ul> - */ - public CompareViewerSwitchingPane(Composite parent, int style) { - this(parent, style, false); - } - - /** - * Creates a <code>CompareViewerSwitchingPane</code> as a child of the given parent and with the - * specified SWT style bits. - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * @param visibility the initial visibility of the CompareViewerSwitchingPane - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parent is null</li> - * </ul> - * @exception org.eclipse.swt.SWTException <ul> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li> - * </ul> - */ - public CompareViewerSwitchingPane(Composite parent, int style, boolean visibility) { - super(parent, style); - - fControlVisibility= visibility; - - setViewer(new NullViewer(this)); - - addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fViewer != null) - fViewer.removeSelectionChangedListener(CompareViewerSwitchingPane.this); - if (fViewer instanceof StructuredViewer) { - StructuredViewer sv= (StructuredViewer) fViewer; - sv.removeDoubleClickListener(CompareViewerSwitchingPane.this); - sv.removeOpenListener(CompareViewerSwitchingPane.this); - } - fViewer= null; - } - } - ); - } - - /** - * Returns the current viewer. - * - * @return the current viewer - */ - public Viewer getViewer() { - return fViewer; - } - - private void setViewer(Viewer newViewer) { - - if (newViewer == fViewer) - return; - - boolean oldEmpty= isEmpty(); - - if (fViewer != null) { - - fViewer.removeSelectionChangedListener(this); - - if (fViewer instanceof StructuredViewer) { - StructuredViewer sv= (StructuredViewer) fViewer; - sv.removeDoubleClickListener(this); - sv.removeOpenListener(this); - } - - Control content= getContent(); - setContent(null); - - fViewer.setInput(null); - - if (content != null && !content.isDisposed()) - content.dispose(); - - } else { - oldEmpty= false; - } - - setContent(null); - - fViewer= newViewer; - - if (fViewer != null) { - // we have to remember and restore the old visibility of the CustomPane - // since setContent changes the visibility - boolean old= getVisible(); - setContent(fViewer.getControl()); - setVisible(old); // restore old visibility - - boolean newEmpty= isEmpty(); - - fViewer.addSelectionChangedListener(this); - - if (fViewer instanceof StructuredViewer) { - StructuredViewer sv= (StructuredViewer) fViewer; - sv.addDoubleClickListener(this); - sv.addOpenListener(this); - } - - if (oldEmpty != newEmpty) { // re-layout my container - Composite parent= getParent(); - if (parent instanceof Splitter) - ((Splitter)parent).setVisible(this, fControlVisibility ? !newEmpty : true); - } - - layout(true); - } - } - - /** - * Returns the optional title argument that has been set with - * <code>setTitelArgument</code> or <code>null</code> if no optional title - * argument has been set. - * - * @return the optional title argument or <code>null</code> - * @noreference This method is for internal use only. Clients should not - * call this method. - * @nooverride This method is not intended to be re-implemented or extended - * by clients. - */ - public String getTitleArgument() { - return fTitleArgument; - } - - /** - * Returns <code>true</code> if no viewer is installed or if the current viewer - * is a <code>NullViewer</code>. - * - * @return <code>true</code> if no viewer is installed or if the current viewer is a <code>NullViewer</code> - */ - public boolean isEmpty() { - return fViewer == null || fViewer instanceof NullViewer; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.CompareViewerPane#getSelection() - */ - public ISelection getSelection() { - if (fViewer != null) - return fViewer.getSelection(); - return super.getSelection(); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.CompareViewerPane#setSelection(org.eclipse.jface.viewers.ISelection) - */ - public void setSelection(ISelection s) { - if (fViewer != null) - fViewer.setSelection(s); - } - - private boolean hasFocus2() { - // do we have focus? - Display display= getDisplay(); - if (display != null) - for (Control focus= display.getFocusControl(); focus != null; focus= focus.getParent()) - if (focus == this) - return true; - return false; - } - - /** - * @param input the input - * @return true, if the input is considered as changed - * @noreference This method is not intended to be referenced by clients. - * @nooverride This method is not intended to be re-implemented or extended - * by clients. - */ - protected boolean inputChanged(Object input) { - return getInput() != input; - } - - /** - * Sets the input object of this pane. - * For this input object a suitable viewer is determined by calling the abstract - * method <code>getViewer(Viewer, Object)</code>. - * If the returned viewer differs from the current one, the old viewer - * is disposed and the new one installed. Then the input object is fed - * into the newly installed viewer by calling its <code>setInput(Object)</code> method. - * If new and old viewer don't differ no new viewer is installed but just - * <code>setInput(Object)</code> is called. - * If the input is <code>null</code> the pane is cleared, - * that is the current viewer is disposed. - * - * @param input the new input object or <code>null</code> - */ - public void setInput(Object input) { - - if (!inputChanged(input)) - return; - - boolean hadFocus = hasFocus2(); - - super.setInput(input); - - // viewer switching - Viewer newViewer= null; - if (input != null) - newViewer= getViewer(fViewer, input); - - if (newViewer == null) { - if (fViewer instanceof NullViewer) - return; - newViewer= new NullViewer(this); - } - - setViewer(newViewer); - - // set input - fViewer.setInput(input); - - if (getViewer() == null || !Utilities.okToUse(getViewer().getControl())) - return; - - Image image= null; - if (!(fViewer instanceof NullViewer) && input instanceof ICompareInput) - image= ((ICompareInput)input).getImage(); - setImage(image); - - String title= null; - if (fViewer != null) { - Control c= fViewer.getControl(); - if (c != null) { - Object data= c.getData(CompareUI.COMPARE_VIEWER_TITLE); - if (data instanceof String) - title= (String) data; - if (hadFocus) - c.setFocus(); - } - } - - fTitle= title; - updateTitle(); - } - - /** - * Sets an additional and optional argument for the pane's title. - * - * @param argument - * an optional argument for the pane's title - * @noreference This method is for internal use only. Clients should not - * call this method. - * @nooverride This method is not intended to be re-implemented or extended - * by clients. - */ - public void setTitleArgument(String argument) { - fTitleArgument= argument; - updateTitle(); - } - - private void updateTitle() { - if (fTitle != null) { - if (fTitleArgument != null) { - String format= CompareMessages.CompareViewerSwitchingPane_Titleformat; - String t= MessageFormat.format(format, new String[] { fTitle, fTitleArgument } ); - setText(t); - } else - setText(fTitle); - } else { - setText(""); //$NON-NLS-1$ - } - } - - /** - * {@inheritDoc} - * @since 3.3 - * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) - */ - public Object getAdapter(Class adapter) { - if (adapter == INavigatable.class) { - if (isEmpty()) - return null; - Viewer viewer= getViewer(); - if (viewer == null) - return null; - Control control= viewer.getControl(); - if (control == null) - return null; - Object data= control.getData(INavigatable.NAVIGATOR_PROPERTY); - if (data instanceof INavigatable) - return data; - } - if (adapter == IFlushable.class) { - Viewer v= getViewer(); - if (v != null) { - IFlushable flushable = (IFlushable)Utilities.getAdapter(v, IFlushable.class); - if (flushable != null) - return flushable; - } - } - if (adapter == IFlushable2.class) { - Viewer v= getViewer(); - if (v != null) { - IFlushable2 flushable = (IFlushable2)Utilities.getAdapter(v, IFlushable2.class); - if (flushable != null) - return flushable; - } - } - return super.getAdapter(adapter); - } - - /* (non-Javadoc) - * @see org.eclipse.swt.widgets.Composite#setFocus() - */ - public boolean setFocus() { - Viewer v= getViewer(); - if (v != null) { - Control c= v.getControl(); - if (c != null) { - if (c.setFocus()) - return true; - } - } - return super.setFocus(); - } - - /** - * Returns a viewer which is able to display the given input. - * If no viewer can be found, <code>null</code> is returned. - * The additional argument oldViewer represents the viewer currently installed - * in the pane (or <code>null</code> if no viewer is installed). - * It can be returned from this method if the current viewer can deal with the - * input (and no new viewer must be created). - * - * @param oldViewer the currently installed viewer or <code>null</code> - * @param input the input object for which a viewer must be determined or <code>null</code> - * @return a viewer for the given input, or <code>null</code> if no viewer can be determined - */ - abstract protected Viewer getViewer(Viewer oldViewer, Object input); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/EditionSelectionDialog.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/EditionSelectionDialog.java deleted file mode 100644 index ddb220aa4..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/EditionSelectionDialog.java +++ /dev/null @@ -1,1196 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.ResourceBundle; - -import com.ibm.icu.text.DateFormat; -import com.ibm.icu.text.MessageFormat; -import com.ibm.icu.util.Calendar; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Item; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableItem; -import org.eclipse.swt.widgets.Tree; -import org.eclipse.swt.widgets.TreeItem; -import org.eclipse.swt.widgets.Widget; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; - -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.compare.internal.CompareContainer; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.ResizableDialog; -import org.eclipse.compare.internal.StructureCreatorDescriptor; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.structuremergeviewer.DiffNode; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.compare.structuremergeviewer.IStructureComparator; -import org.eclipse.compare.structuremergeviewer.IStructureCreator; - - -/** - * A dialog where one input element can be compared against - * a list of historic variants (editions) of the same input element. - * The dialog can be used to implement functions like "Compare/Replace with Version" or - * "Compare/Replace from Local History" on workspace resources. - * <p> - * In addition it is possible to specify a subsection of the input element - * (e.g. a method in a Java source file) by means of a "path". - * In this case the dialog compares only the subsection (as specified by the path) - * with the corresponding subsection in the list of editions. - * Only those editions are shown where the subsection differs from the same subsection in - * another edition thereby minimizing the number of presented variants. - * This functionality can be used to implement "Replace from Local History" - * for the Java language. - * <p> - * Subsections of an input element are determined by first finding an - * <code>IStructureCreator</code> for the input's type. - * Then the method <code>locate</code> is used to extract the subsection. - * <p> - * Each edition (variant in the list of variants) must implement the <code>IModificationDate</code> interface - * so that the dialog can sort the editions and present them in a tree structure where every - * node corresponds one day. - * <p> - * The functionality is surfaced in a single function <code>selectEdition</code>. - * <p> - * Clients may instantiate this class; it is not intended to be subclassed. - * </p> - * - * @see IModificationDate - * @see ITypedElement - * - * @deprecated Use an <code>org.eclipse.team.ui.history.IHistoryPageSource</code> in conjunction with - * the <code>org.eclipse.team.ui.history.IHistoryView</code> or a <code>HistoryPageCompareEditorInput</code>. - * For sub-file elements, a <code>org.eclipse.team.ui.history.ElementLocalHistoryPageSource</code> can be used. - * @noextend This class is not intended to be subclassed by clients. - */ -public class EditionSelectionDialog extends ResizableDialog { - - /** - * An item in an underlying edition. - */ - private static class Pair { - - private ITypedElement fEdition; - private ITypedElement fItem; - private String fContent; - private IStructureCreator fStructureCreator; - private boolean fHasError= false; - - Pair(IStructureCreator structureCreator, ITypedElement edition, ITypedElement item) { - fStructureCreator= structureCreator; - fEdition= edition; - fItem= item; - } - - Pair(IStructureCreator structureCreator, ITypedElement edition) { - this(structureCreator, edition, edition); - } - - ITypedElement getEdition() { - return fEdition; - } - - ITypedElement getItem() { - return fItem; - } - - /* - * The content is lazily loaded - */ - private String getContent() { - if (fContent == null) { - if (fStructureCreator != null) - fContent= fStructureCreator.getContents(fItem, false); - else { - if (fItem instanceof IStreamContentAccessor) { - IStreamContentAccessor sca= (IStreamContentAccessor) fItem; - try { - fContent= Utilities.readString(sca); - } catch (CoreException ex) { - // NeedWork - CompareUIPlugin.log(ex); - } - } - } - if (fContent == null) - fContent= ""; //$NON-NLS-1$ - } - return fContent; - } - - public boolean equals(Object other) { - if (other != null && other.getClass() == getClass()) { - if (getContent().equals(((Pair)other).getContent())) - return true; - } - return super.equals(other); - } - - public int hashCode() { - return getContent().hashCode(); - } - } - - // Configuration options - private CompareConfiguration fCompareConfiguration; - private ArrayList fArrayList= new ArrayList(); - /** use a side-by-side compare viewer */ - private boolean fCompare= true; - /** show target on right hand side */ - private boolean fTargetIsRight= false; - /** hide entries which have identical content */ - private boolean fHideIdentical= true; - /** add mode if true, otherwise replace mode */ - private boolean fAddMode= false; - /** compare mode if true, otherwise replace/add mode */ - private boolean fCompareMode= false; - /** perform structure compare on editions */ - private boolean fStructureCompare= false; - /** allow for multiple selection */ - private boolean fMultiSelect= false; - - /** - * Maps from members to their corresponding editions. - * Has only a single entry if dialog is used in "Replace" (and not "Add") mode. - */ - private HashMap fMemberEditions; - /** - * Maps from members to their corresponding selected edition. - */ - private HashMap fMemberSelection; - /** The editions of the current selected member */ - private List fCurrentEditions; - private Thread fThread; - private Pair fTargetPair; - /** The selected edition in the edition viewer */ - private ITypedElement fSelectedItem; - private String fTitleArg; - private Image fTitleImage; - - // SWT controls - private CompareViewerSwitchingPane fContentPane; - private Button fCommitButton; - private Table fMemberTable; - private CompareViewerPane fMemberPane; - private Tree fEditionTree; - private CompareViewerPane fEditionPane; - private Image fDateImage; - private Image fTimeImage; - private CompareViewerSwitchingPane fStructuredComparePane; - private Label statusLabel; - - /** - * Creates a new modal, resizable dialog. - * Various titles, icons, and labels are configured from the given resource bundle. - * The following resource keys are used: - * <pre> - * key type description - * title String dialog title - * width Integer initial width of dialog - * height Integer initial height of dialog - * treeTitleFormat MessageFormat pane title for edition tree; arg 0 is the target - * dateIcon String icon for node in edition tree; path relative to plug-in - * timeIcon String icon for leaf in edition tree; path relative to plug-in - * todayFormat MessageFormat format string if date is todays date; arg 0 is date - * yesterdayFormat MessageFormat format string if date is yesterdays date; arg 0 is date - * dayFormat MessageFormat format string if date is any other date; arg 0 is date - * editionLabel String label for editions side of compare viewer; arg 0 is the date - * targetLabel String label for target side of compare viewer - * buttonLabel String label for OK button; default is IDialogConstants.OK_LABEL - * </pre> - * - * @param parent if not <code>null</code> the new dialog stays on top of this parent shell - * @param bundle <code>ResourceBundle</code> to configure the dialog - */ - public EditionSelectionDialog(Shell parent, ResourceBundle bundle) { - super(parent, bundle); - } - - private CompareConfiguration getCompareConfiguration() { - if (fCompareConfiguration == null) { - fCompareConfiguration= new CompareConfiguration(); - fCompareConfiguration.setLeftEditable(false); - fCompareConfiguration.setRightEditable(false); - fCompareConfiguration.setContainer(new CompareContainer() { - public void setStatusMessage(String message) { - if (statusLabel != null && !statusLabel.isDisposed()) { - if (message == null) { - statusLabel.setText(""); //$NON-NLS-1$ - } else { - statusLabel.setText(message); - } - } - } - }); - } - return fCompareConfiguration; - } - - /** - * Sets the help context for this dialog. - * - * @param contextId the help context id. - * @since 3.2 - */ - public void setHelpContextId(String contextId) { - super.setHelpContextId(contextId); - } - - /** - * Sets an additional and optional argument for the edition pane's title. - * - * @param titleArgument an optional argument for the edition pane's title - * @since 2.0 - */ - public void setEditionTitleArgument(String titleArgument) { - fTitleArg= titleArgument; - } - - /** - * Sets an optional image for the edition pane's title. - * - * @param titleImage an optional image for the edition pane's title - * @since 2.0 - */ - public void setEditionTitleImage(Image titleImage) { - fTitleImage= titleImage; - } - - /** - * Select the previous edition (presenting a UI). - * - * @param target the input object against which the editions are compared; must not be <code>null</code> - * @param inputEditions the list of editions (element type: <code>ITypedElement</code>s) - * @param ppath If <code>null</code> dialog shows full input; if non <code>null</code> it extracts a subsection - * @return returns the selected edition or <code>null</code> if error occurred. - * The returned <code>ITypedElement</code> is one of the original editions - * if <code>path</code> was <code>null</code>; otherwise - * it is an <code>ITypedElement</code> returned from <code>IStructureCreator.locate(path, item)</code> - * @since 2.0 - */ - public ITypedElement selectPreviousEdition(final ITypedElement target, ITypedElement[] inputEditions, Object ppath) { - Assert.isNotNull(target); - fTargetPair= new Pair(null, target); - - // sort input editions - final int count= inputEditions.length; - final IModificationDate[] editions= new IModificationDate[count]; - for (int i= 0; i < count; i++) - editions[i]= (IModificationDate) inputEditions[i]; - if (count > 1) - internalSort(editions); - - // find StructureCreator if ppath is not null - IStructureCreator structureCreator= null; - if (ppath != null) { - String type= target.getType(); - StructureCreatorDescriptor scd= CompareUIPlugin.getDefault().getStructureCreator(type); - if (scd != null) - structureCreator= scd.createStructureCreator(); - } - - if (fAddMode) { - // does not work in add mode - return null; - } - - if (structureCreator != null) { - Pair pair= createPair(structureCreator, ppath, target); - if (pair != null) - fTargetPair= pair; - else - ppath= null; // couldn't extract item because of error - } - - // from front (newest) to back (oldest) - for (int i= 0; i < count; i++) { - - ITypedElement edition= (ITypedElement) editions[i]; - Pair pair= null; - - if (structureCreator != null && ppath != null) { - // extract sub element from edition - pair= createPair(structureCreator, ppath, edition); - } else { - pair= new Pair(null, edition); - } - - if (pair != null && pair.fHasError) - return null; - - if (pair != null && !fTargetPair.equals(pair)) { - return pair.fItem; - } - } - - // nothing found - return null; - } - - /** - * Presents this modal dialog with the functionality described in the class comment above. - * - * @param target the input object against which the editions are compared; must not be <code>null</code> - * @param inputEditions the list of editions (element type: <code>ITypedElement</code>s) - * @param ppath If <code>null</code> dialog shows full input; if non <code>null</code> it extracts a subsection - * @return returns the selected edition or <code>null</code> if dialog was cancelled. - * The returned <code>ITypedElement</code> is one of the original editions - * if <code>path</code> was <code>null</code>; otherwise - * it is an <code>ITypedElement</code> returned from <code>IStructureCreator.locate(path, item)</code> - */ - public ITypedElement selectEdition(final ITypedElement target, ITypedElement[] inputEditions, Object ppath) { - - Assert.isNotNull(target); - fTargetPair= new Pair(null, target); - - // sort input editions - final int count= inputEditions.length; - final IModificationDate[] editions= new IModificationDate[count]; - for (int i= 0; i < count; i++) - editions[i]= (IModificationDate) inputEditions[i]; - if (count > 1) - internalSort(editions); - - // find StructureCreator if ppath is not null - IStructureCreator structureCreator= null; - if (ppath != null) { - String type= target.getType(); - StructureCreatorDescriptor scd= CompareUIPlugin.getDefault().getStructureCreator(type); - if (scd != null) - structureCreator= scd.createStructureCreator(); - } - - if (!fAddMode) { - // replace mode - - if (structureCreator != null) { - Pair pair= createPair(structureCreator, ppath, target); - if (pair != null) - fTargetPair= pair; - else - ppath= null; // couldn't extract item because of error - } - - // set the left and right labels for the compare viewer - String targetLabel= getTargetLabel(target, fTargetPair.getItem()); - if (fTargetIsRight) - getCompareConfiguration().setRightLabel(targetLabel); - else - getCompareConfiguration().setLeftLabel(targetLabel); - - if (structureCreator != null && ppath != null) { // extract sub element - - final IStructureCreator sc= structureCreator; - final Object path= ppath; - - // construct the comparer thread - // and perform the background extract - fThread= new Thread() { - public void run() { - - // from front (newest) to back (oldest) - for (int i= 0; i < count; i++) { - - if (fEditionTree == null || fEditionTree.isDisposed()) - break; - ITypedElement edition= (ITypedElement) editions[i]; - - // extract sub element from edition - Pair pair= createPair(sc, path, edition); - if (pair != null) - sendPair(pair); - } - sendPair(null); - } - }; - } else { - // create tree widget - create(); - - // from front (newest) to back (oldest) - for (int i= 0; i < count; i++) - addMemberEdition(new Pair(null, (ITypedElement) editions[i])); - } - - } else { - // add mode - final Object container= ppath; - Assert.isNotNull(container); - - if (structureCreator == null) - return null; // error - - // extract all elements of container - final HashSet current= new HashSet(); - IStructureComparator sco= structureCreator.locate(container, target); - if (sco != null) { - Object[] children= sco.getChildren(); - if (children != null) - for (int i= 0; i < children.length; i++) - current.add(children[i]); - } - - final IStructureCreator sc= structureCreator; - - // construct the comparer thread - // and perform the background extract - fThread= new Thread() { - public void run() { - - // from front (newest) to back (oldest) - for (int i= 0; i < count; i++) { - - if (fEditionTree == null || fEditionTree.isDisposed()) - break; - ITypedElement edition= (ITypedElement) editions[i]; - - IStructureComparator sco2= sc.locate(container, edition); - if (sco2 != null) { - Object[] children= sco2.getChildren(); - if (children != null) { - for (int i2= 0; i2 < children.length; i2++) { - ITypedElement child= (ITypedElement) children[i2]; - if (!current.contains(child)) - sendPair(new Pair(sc, edition, child)); - } - } - } - } - sendPair(null); - } - }; - } - - open(); - - if (getReturnCode() == OK) - return fSelectedItem; - return null; - } - - private Pair createPair(IStructureCreator sc, Object path, ITypedElement input) { - IStructureComparator scmp= sc.locate(path, input); - if (scmp == null && sc.getStructure(input) == null) { // parse error - Pair p= new Pair(sc, input); - p.fHasError= true; - return p; - } - if (scmp instanceof ITypedElement) - return new Pair(sc, input, (ITypedElement) scmp); - return null; - } - - /** - * Controls whether identical entries are shown or not (default). - * This method must be called before <code>selectEdition</code>. - * - * @param hide if true identical entries are hidden; otherwise they are shown. - * @since 2.0 - */ - public void setHideIdenticalEntries(boolean hide) { - fHideIdentical= hide; - } - - /** - * Controls whether workspace target is on the left (the default) or right hand side. - * - * @param isRight if true target is shown on right hand side. - * @since 2.0 - */ - public void setTargetIsRight(boolean isRight) { - fTargetIsRight= isRight; - } - - /** - * Controls whether the <code>EditionSelectionDialog</code> is in 'add' mode - * or 'replace' mode (the default). - * - * @param addMode if true dialog is in 'add' mode. - * @since 2.0 - */ - public void setAddMode(boolean addMode) { - fAddMode= addMode; - fMultiSelect= addMode; - } - - /** - * Controls whether the <code>EditionSelectionDialog</code> is in 'compare' mode - * or 'add/replace' (the default) mode. - * - * @param compareMode if true dialog is in 'add' mode. - * @since 2.0 - */ - public void setCompareMode(boolean compareMode) { - fCompareMode= compareMode; - fStructureCompare= fCompareMode && !fAddMode; - } - - /** - * Returns the input target that has been specified with the most recent call - * to <code>selectEdition</code>. If a not <code>null</code> path was specified this method - * returns a subsection of this target (<code>IStructureCreator.locate(path, target)</code>) - * instead of the input target. - * <p> - * For example if the <code>target</code> is a Java compilation unit and <code>path</code> specifies - * a method, the value returned from <code>getTarget</code> will be the method not the compilation unit. - * - * @return the last specified target or a subsection thereof. - */ - public ITypedElement getTarget() { - return fTargetPair.getItem(); - } - - /** - * Returns the editions that have been selected with the most - * recent call to <code>selectEdition</code>. - * - * @return the selected editions as an array. - * @since 2.1 - */ - public ITypedElement[] getSelection() { - ArrayList result= new ArrayList(); - if (fMemberSelection != null) { - Iterator iter= fArrayList.iterator(); - while (iter.hasNext()) { - Object edition= iter.next(); - Object item= fMemberSelection.get(edition); - if (item != null) - result.add(item); - } - } else if (fSelectedItem != null) - result.add(fSelectedItem); - return (ITypedElement[]) result.toArray(new ITypedElement[result.size()]); - } - - /** - * Returns a label for identifying the target side of a compare viewer. - * This implementation extracts the value for the key "targetLabel" from the resource bundle - * and passes it as the format argument to <code>MessageFormat.format</code>. - * The single format argument for <code>MessageFormat.format</code> ("{0}" in the format string) - * is the name of the given input element. - * <p> - * Subclasses may override to create their own label. - * </p> - * - * @param target the target element for which a label must be returned - * @param item if a path has been specified in <code>selectEdition</code> a sub element of the given target; otherwise the same as target - * @return a label the target side of a compare viewer - */ - protected String getTargetLabel(ITypedElement target, ITypedElement item) { - String format= null; - if (target instanceof ResourceNode) - format= Utilities.getString(fBundle, "workspaceTargetLabel", null); //$NON-NLS-1$ - if (format == null) - format= Utilities.getString(fBundle, "targetLabel"); //$NON-NLS-1$ - if (format == null) - format= "x{0}"; //$NON-NLS-1$ - - return formatString(format, target.getName()); - } - - private String formatString(String string, String variable) { - // Only process the string if it contains a variable or an escaped quote (see bug 190023) - if (hasVariable(string) || hasDoubleQuotes(string)) - return MessageFormat.format(string, new Object[] { variable }); - return string; - } - - private boolean hasDoubleQuotes(String string) { - return string.indexOf("''") != -1; //$NON-NLS-1$ - } - - private boolean hasVariable(String string) { - return string.indexOf("{0}") != -1; //$NON-NLS-1$ - } - - /** - * Returns a label for identifying the edition side of a compare viewer. - * This implementation extracts the value for the key "editionLabel" from the resource bundle - * and passes it as the format argument to <code>MessageFormat.format</code>. - * The single format argument for <code>MessageFormat.format</code> ("{0}" in the format string) - * is the formatted modification date of the given input element. - * <p> - * Subclasses may override to create their own label. - * </p> - * - * @param selectedEdition the selected edition for which a label must be returned - * @param item if a path has been specified in <code>selectEdition</code> a sub element of the given selectedEdition; otherwise the same as selectedEdition - * @return a label for the edition side of a compare viewer - */ - protected String getEditionLabel(ITypedElement selectedEdition, ITypedElement item) { - String format= null; - if (selectedEdition instanceof ResourceNode) - format= Utilities.getString(fBundle, "workspaceEditionLabel", null); //$NON-NLS-1$ - else if (selectedEdition instanceof HistoryItem) - format= Utilities.getString(fBundle, "historyEditionLabel", null); //$NON-NLS-1$ - if (format == null) - format= Utilities.getString(fBundle, "editionLabel"); //$NON-NLS-1$ - if (format == null) - format= "x{0}"; //$NON-NLS-1$ - - - String date= ""; //$NON-NLS-1$ - if (selectedEdition instanceof IModificationDate) { - long modDate= ((IModificationDate)selectedEdition).getModificationDate(); - date= DateFormat.getDateTimeInstance().format(new Date(modDate)); - } - - return formatString(format, date); - } - - /** - * Returns a label for identifying a node in the edition tree viewer. - * This implementation extracts the value for the key "workspaceTreeFormat" or - * "treeFormat" (in that order) from the resource bundle - * and passes it as the format argument to <code>MessageFormat.format</code>. - * The single format argument for <code>MessageFormat.format</code> ("{0}" in the format string) - * is the formatted modification date of the given input element. - * <p> - * Subclasses may override to create their own label. - * </p> - * - * @param edition the edition for which a label must be returned - * @param item if a path has been specified in <code>edition</code> a sub element of the given edition; otherwise the same as edition - * @param date this date will be returned as part of the formatted string - * @return a label of a node in the edition tree viewer - * @since 2.0 - */ - protected String getShortEditionLabel(ITypedElement edition, ITypedElement item, Date date) { - String format= null; - if (edition instanceof ResourceNode) - format= Utilities.getString(fBundle, "workspaceTreeFormat", null); //$NON-NLS-1$ - if (format == null) - format= Utilities.getString(fBundle, "treeFormat", null); //$NON-NLS-1$ - if (format == null) - format= "x{0}"; //$NON-NLS-1$ - - String ds= DateFormat.getTimeInstance().format(date); - return formatString(format, ds); - } - - /** - * Returns an image for identifying the edition side of a compare viewer. - * This implementation extracts the value for the key "editionLabel" from the resource bundle - * and passes it as the format argument to <code>MessageFormat.format</code>. - * The single format argument for <code>MessageFormat.format</code> ("{0}" in the format string) - * is the formatted modification date of the given input element. - * <p> - * Subclasses may override to create their own label. - * </p> - * - * @param selectedEdition the selected edition for which a label must be returned - * @param item if a path has been specified in <code>selectEdition</code> a sub element of the given selectedEdition; otherwise the same as selectedEdition - * @return a label the edition side of a compare viewer - * @since 2.0 - */ - protected Image getEditionImage(ITypedElement selectedEdition, ITypedElement item) { - if (selectedEdition instanceof ResourceNode) - return selectedEdition.getImage(); - if (selectedEdition instanceof HistoryItem) { - if (fTimeImage == null) { - String iconName= Utilities.getString(fBundle, "timeIcon", "obj16/resource_obj.gif"); //$NON-NLS-1$ //$NON-NLS-2$ - ImageDescriptor id= CompareUIPlugin.getImageDescriptor(iconName); - if (id != null) - fTimeImage= id.createImage(); - } - return fTimeImage; - } - return null; - } - - /* (non Javadoc) - * Creates SWT control tree. - */ - protected synchronized Control createDialogArea(Composite parent2) { - - Composite parent= (Composite) super.createDialogArea(parent2); - - getShell().setText(Utilities.getString(fBundle, "title")); //$NON-NLS-1$ - - Splitter vsplitter= new Splitter(parent, SWT.VERTICAL); - vsplitter.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL - | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL)); - - vsplitter.addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fCompareConfiguration != null) { - fCompareConfiguration.dispose(); - fCompareConfiguration= null; - } - if (fDateImage != null) { - fDateImage.dispose(); - fDateImage= null; - } - if (fTimeImage != null) { - fTimeImage.dispose(); - fTimeImage= null; - } - } - } - ); - - if (fAddMode) { - // we need two panes: the left for the elements, the right one for the editions - Splitter hsplitter= new Splitter(vsplitter, SWT.HORIZONTAL); - - fMemberPane= new CompareViewerPane(hsplitter, SWT.BORDER | SWT.FLAT); - fMemberPane.setText(Utilities.getString(fBundle, "memberPaneTitle")); //$NON-NLS-1$ - - int flags= SWT.H_SCROLL | SWT.V_SCROLL; - if (fMultiSelect) - flags|= SWT.CHECK; - fMemberTable= new Table(fMemberPane, flags); - fMemberTable.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (e.detail == SWT.CHECK) { - if (e.item instanceof TableItem) { - TableItem ti= (TableItem) e.item; - Object data= ti.getData(); - if (ti.getChecked()) - fArrayList.add(data); - else - fArrayList.remove(data); - - if (fCommitButton != null) - fCommitButton.setEnabled(fArrayList.size() > 0); - - fMemberTable.setSelection(new TableItem[] { ti }); - } - } - handleMemberSelect(e.item); - } - } - ); - fMemberPane.setContent(fMemberTable); - fMemberTable.setFocus(); - - fEditionPane= new CompareViewerPane(hsplitter, SWT.BORDER | SWT.FLAT); - } else { - if (fStructureCompare) { - // we need two panes: the left for the elements, the right one for the structured diff - Splitter hsplitter= new Splitter(vsplitter, SWT.HORIZONTAL); - - fEditionPane= new CompareViewerPane(hsplitter, SWT.BORDER | SWT.FLAT); - fStructuredComparePane= new CompareViewerSwitchingPane(hsplitter, SWT.BORDER | SWT.FLAT, true) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - if (input instanceof ICompareInput) - return CompareUI.findStructureViewer(oldViewer, (ICompareInput)input, this, getCompareConfiguration()); - return null; - } - }; - fStructuredComparePane.addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent e) { - feedInput2(e.getSelection()); - } - } - ); - } else { - // only a single pane showing the editions - fEditionPane= new CompareViewerPane(vsplitter, SWT.BORDER | SWT.FLAT); - } - if (fTitleArg == null) - fTitleArg= fTargetPair.getItem().getName(); - String titleFormat= Utilities.getString(fBundle, "treeTitleFormat"); //$NON-NLS-1$ - String title= MessageFormat.format(titleFormat, new String[] { fTitleArg }); - fEditionPane.setText(title); - if (fTitleImage != null) - fEditionPane.setImage(fTitleImage); - } - - fEditionTree= new Tree(fEditionPane, SWT.H_SCROLL | SWT.V_SCROLL); - fEditionTree.addSelectionListener( - new SelectionAdapter() { -// public void widgetDefaultSelected(SelectionEvent e) { -// handleDefaultSelected(); -// } - public void widgetSelected(SelectionEvent e) { - feedInput(e.item); - } - } - ); - fEditionPane.setContent(fEditionTree); - - // now start the thread (and forget about it) - if (fThread != null) { - fThread.start(); - fThread= null; - } - - fContentPane= new CompareViewerSwitchingPane(vsplitter, SWT.BORDER | SWT.FLAT) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - return CompareUI.findContentViewer(oldViewer, input, this, getCompareConfiguration()); - } - }; - vsplitter.setWeights(new int[] { 30, 70 }); - - statusLabel = new Label(parent, SWT.NONE); - statusLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - applyDialogFont(parent); - return parent; - } - - /* (non-Javadoc) - * Method declared on Dialog. - */ - protected void createButtonsForButtonBar(Composite parent) { - String buttonLabel= Utilities.getString(fBundle, "buttonLabel", IDialogConstants.OK_LABEL); //$NON-NLS-1$ - if (fCompareMode) { - // only a 'Done' button - createButton(parent, IDialogConstants.CANCEL_ID, buttonLabel, false); - } else { - // a 'Cancel' and a 'Add/Replace' button - fCommitButton= createButton(parent, IDialogConstants.OK_ID, buttonLabel, true); - fCommitButton.setEnabled(false); - createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); - } - } - - /** - * Overidden to disable dismiss on double click in compare mode. - * @since 2.0 - */ - protected void okPressed() { - if (fCompareMode) { - // don't dismiss dialog - } else - super.okPressed(); - } - - //---- private stuff ---------------------------------------------------------------------------------------- - - /* - * Asynchroneously sends a Pair (or null) to the UI thread. - */ - private void sendPair(final Pair pair) { - if (fEditionTree != null && !fEditionTree.isDisposed()) { - Display display= fEditionTree.getDisplay(); - display.asyncExec( - new Runnable() { - public void run() { - addMemberEdition(pair); - } - } - ); - } - } - - private static void internalSort(IModificationDate[] keys) { - Arrays.sort(keys, new Comparator() { - public int compare(Object o1, Object o2) { - IModificationDate d1= (IModificationDate) o1; - IModificationDate d2= (IModificationDate) o2; - long d= d2.getModificationDate() - d1.getModificationDate(); - if (d < 0) - return -1; - if (d > 0) - return 1; - return 0; - } - }); - } - - /* - * Adds the given Pair to the member editions. - * If HIDE_IDENTICAL is true the new Pair is only added if its contents - * is different from the preceeding Pair. - * If the argument is <code>null</code> the message "No Editions found" is shown - * in the member or edition viewer. - */ - private void addMemberEdition(Pair pair) { - - if (pair == null) { // end of list of pairs - if (fMemberTable != null) { - if (!fMemberTable.isDisposed() && fMemberTable.getItemCount() == 0) { - if (fMultiSelect) { - fMemberTable.dispose(); - fMemberTable= new Table(fMemberPane, SWT.NONE); - fMemberPane.setContent(fMemberTable); - } - TableItem ti= new TableItem(fMemberTable, SWT.NONE); - ti.setText(Utilities.getString(fBundle, "noAdditionalMembersMessage")); //$NON-NLS-1$ - } - return; - } - if (fEditionTree != null && !fEditionTree.isDisposed() && fEditionTree.getItemCount() == 0) { - TreeItem ti= new TreeItem(fEditionTree, SWT.NONE); - ti.setText(Utilities.getString(fBundle, "notFoundInLocalHistoryMessage")); //$NON-NLS-1$ - } - return; - } - - if (fMemberEditions == null) - fMemberEditions= new HashMap(); - if (fMultiSelect && fMemberSelection == null) - fMemberSelection= new HashMap(); - - ITypedElement item= pair.getItem(); - List editions= (List) fMemberEditions.get(item); - if (editions == null) { - editions= new ArrayList(); - fMemberEditions.put(item, editions); - if (fMemberTable != null && !fMemberTable.isDisposed()) { - ITypedElement te= item; - String name= te.getName(); - - // find position - TableItem[] items= fMemberTable.getItems(); - int where= items.length; - for (int i= 0; i < where; i++) { - String n= items[i].getText(); - if (n.compareTo(name) > 0) { - where= i; - break; - } - } - - TableItem ti= new TableItem(fMemberTable, where, SWT.NULL); - ti.setImage(te.getImage()); - ti.setText(name); - ti.setData(editions); - } - } - if (fHideIdentical) { - Pair last= fTargetPair; - int size= editions.size(); - if (size > 0) - last= (Pair) editions.get(size-1); - if (last != null && last.equals(pair)) - return; // don't add since the new one is equal to old - } - editions.add(pair); - - if (!fAddMode || editions == fCurrentEditions) - addEdition(pair); - } - - /* - * Returns the number of s since Jan 1st, 1970. - * The given date is converted to GMT and daylight saving is taken into account too. - */ - private long dayNumber(long date) { - int ONE_DAY_MS= 24*60*60 * 1000; // one day in milli seconds - - Calendar calendar= Calendar.getInstance(); - long localTimeOffset= calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET); - - return (date + localTimeOffset) / ONE_DAY_MS; - } - - /* - * Adds the given Pair to the edition tree. - * It takes care of creating tree nodes for different dates. - */ - private void addEdition(Pair pair) { - if (fEditionTree == null || fEditionTree.isDisposed()) - return; - - // find last day - TreeItem[] days= fEditionTree.getItems(); - TreeItem lastDay= null; - if (days.length > 0) - lastDay= days[days.length-1]; - - boolean first= lastDay == null; - - ITypedElement edition= pair.getEdition(); - ITypedElement item= pair.getItem(); - - long ldate= ((IModificationDate)edition).getModificationDate(); - long day= dayNumber(ldate); - Date date= new Date(ldate); - if (lastDay == null || day != dayNumber(((Date)lastDay.getData()).getTime())) { - lastDay= new TreeItem(fEditionTree, SWT.NONE); - if (fDateImage == null) { - String iconName= Utilities.getString(fBundle, "dateIcon", "obj16/day_obj.gif"); //$NON-NLS-2$ //$NON-NLS-1$ - ImageDescriptor id= CompareUIPlugin.getImageDescriptor(iconName); - if (id != null) - fDateImage= id.createImage(); - } - lastDay.setImage(fDateImage); - String df= DateFormat.getDateInstance().format(date); - long today= dayNumber(System.currentTimeMillis()); - - String formatKey; - if (day == today) - formatKey= "todayFormat"; //$NON-NLS-1$ - else if (day == today-1) - formatKey= "yesterdayFormat"; //$NON-NLS-1$ - else - formatKey= "dayFormat"; //$NON-NLS-1$ - String pattern= Utilities.getString(fBundle, formatKey); - if (pattern != null) - df= MessageFormat.format(pattern, new String[] { df }); - lastDay.setText(df); - lastDay.setData(date); - } - TreeItem ti= new TreeItem(lastDay, SWT.NONE); - ti.setImage(getEditionImage(edition, item)); - - String s= getShortEditionLabel(edition, item, date); - if (pair.fHasError) { - String pattern= Utilities.getString(fBundle, "parseErrorFormat"); //$NON-NLS-1$ - s= MessageFormat.format(pattern, new String[] { s } ); - } - ti.setText(s); - - ti.setData(pair); - - // determine selected TreeItem - TreeItem selection= first ? ti : null; - if (fMemberSelection != null) { - Object selected= fMemberSelection.get(fCurrentEditions); - if (selected != null) { - if (selected == pair.getItem()) - selection= ti; - else - selection= null; - } - } - if (selection != null) { - fEditionTree.setSelection(new TreeItem[] { selection }); - if (!fAddMode) - fEditionTree.setFocus(); - feedInput(selection); - } - - if (first) // expand first node - lastDay.setExpanded(true); - } - - /* - * Feeds selection from member viewer to edition viewer. - */ - private void handleMemberSelect(Widget w) { - Object data= w.getData(); - if (data instanceof List) { - List editions= (List) data; - if (editions != fCurrentEditions) { - fCurrentEditions= editions; - fEditionTree.removeAll(); - - String pattern= Utilities.getString(fBundle, "treeTitleFormat"); //$NON-NLS-1$ - String title= MessageFormat.format(pattern, new Object[] { ((Item)w).getText() }); - fEditionPane.setText(title); - - Iterator iter= editions.iterator(); - while (iter.hasNext()) { - Object item= iter.next(); - if (item instanceof Pair) - addEdition((Pair) item); - } - } - } - } - - private void setInput(Object input) { - if (!fCompare && input instanceof ICompareInput) { - ICompareInput ci= (ICompareInput) input; - if (fTargetIsRight) - input= ci.getLeft(); - else - input= ci.getRight(); - } - fContentPane.setInput(input); - if (fStructuredComparePane != null) - fStructuredComparePane.setInput(input); - } - - /* - * Feeds selection from edition viewer to content (and structure) viewer. - */ - private void feedInput(Widget w) { - Object input= w.getData(); - boolean isOK= false; - if (input instanceof Pair) { - Pair pair= (Pair) input; - fSelectedItem= pair.getItem(); - isOK= !pair.fHasError; - - ITypedElement edition= pair.getEdition(); - String editionLabel= getEditionLabel(edition, fSelectedItem); - Image editionImage= getEditionImage(edition, fSelectedItem); - - if (fAddMode) { - if (fMemberSelection != null) - fMemberSelection.put(fCurrentEditions, fSelectedItem); - setInput(fSelectedItem); - fContentPane.setText(editionLabel); - fContentPane.setImage(editionImage); - } else { - getCompareConfiguration(); - if (fTargetIsRight) { - fCompareConfiguration.setLeftLabel(editionLabel); - fCompareConfiguration.setLeftImage(editionImage); - setInput(new DiffNode(fSelectedItem, fTargetPair.getItem())); - } else { - fCompareConfiguration.setRightLabel(editionLabel); - fCompareConfiguration.setRightImage(editionImage); - setInput(new DiffNode(fTargetPair.getItem(), fSelectedItem)); - } - } - } else { - fSelectedItem= null; - setInput(null); - } - if (fCommitButton != null) { - if (fMultiSelect) - fCommitButton.setEnabled(isOK && fSelectedItem != null && fArrayList.size() > 0); - else - fCommitButton.setEnabled(isOK && fSelectedItem != null && fTargetPair.getItem() != fSelectedItem); - } - } - - /* - * Feeds selection from structure viewer to content viewer. - */ - private void feedInput2(ISelection sel) { - if (sel instanceof IStructuredSelection) { - IStructuredSelection ss= (IStructuredSelection) sel; - if (ss.size() == 1) - fContentPane.setInput(ss.getFirstElement()); - } - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/HistoryItem.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/HistoryItem.java deleted file mode 100644 index e35243516..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/HistoryItem.java +++ /dev/null @@ -1,110 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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; - -import java.io.InputStream; -import java.io.BufferedInputStream; - -import org.eclipse.swt.graphics.Image; - -import org.eclipse.compare.IResourceProvider; -import org.eclipse.core.resources.IEncodedStorage; -import org.eclipse.core.resources.IFileState; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; - -/** - * A combination <code>IFileState</code> and <code>ITypedElement</code> that can be used as - * an input to a compare viewer or other places where an <code>IStreamContentAccessor</code> - * is needed. - * <p> - * <p> - * Clients may instantiate this class; it is not intended to be subclassed. - * </p> - * @noextend This class is not intended to be subclassed by clients. - */ -public class HistoryItem implements IEncodedStreamContentAccessor, ITypedElement, IModificationDate, IResourceProvider { - - private ITypedElement fBase; - private IFileState fFileState; - - /** - * Creates a <code>HistoryItem</code> object which combines the given <code>IFileState</code> - * and <code>ITypedElement</code> into an object - * which is suitable as input for a compare viewer or <code>ReplaceWithEditionDialog</code>. - * - * @param base the implementation of the <code>ITypedElement</code> interface delegates to this base <code>ITypedElement</code> - * @param fileState the <code>IFileState</code> from which the streamable contents and the modification time is derived from - */ - public HistoryItem(ITypedElement base, IFileState fileState) { - fBase= base; - fFileState= fileState; - } - - /* (non-Javadoc) - * see ITypedElement.getName - */ - public String getName() { - return fBase.getName(); - } - - /* (non-Javadoc) - * see ITypedElement.getImage - */ - public Image getImage() { - return fBase.getImage(); - } - - /* (non-Javadoc) - * see ITypedElement.getType - */ - public String getType() { - return fBase.getType(); - } - - /* (non-Javadoc) - * see IModificationDate.getModificationDate - */ - public long getModificationDate() { - return fFileState.getModificationTime(); - } - - /* (non-Javadoc) - * see IStreamContentAccessor.getContents - */ - public InputStream getContents() throws CoreException { - return new BufferedInputStream(fFileState.getContents()); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IEncodedStreamContentAccessor#getCharset() - */ - public String getCharset() throws CoreException { - String charset= fFileState.getCharset(); - if (charset == null) { - IResource resource= getResource(); - if (resource instanceof IEncodedStorage) - charset= ((IEncodedStorage)resource).getCharset(); - } - return charset; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.internal.IResourceProvider#getResource() - */ - public IResource getResource() { - IPath fullPath= fFileState.getFullPath(); - return ResourcesPlugin.getWorkspace().getRoot().findMember(fullPath); - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ICompareContainer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ICompareContainer.java deleted file mode 100644 index d80262c0c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ICompareContainer.java +++ /dev/null @@ -1,111 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2007 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; - -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.operation.IRunnableContext; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.ui.*; -import org.eclipse.ui.services.IServiceLocator; - -/** - * A compare container is used to represent any UI that can contain compare viewers. - * <p> - * This interface is not intended to be implemented by clients. - * </p> - * @since 3.3 - */ -public interface ICompareContainer extends IRunnableContext{ - - /** - * Register for change events for the given compare input. Although clients can register - * with the compare input directly, registering through the container allows for - * deterministic and optimized behavior in some cases. Registering multiple times for the - * same compare input has no effect. - * @param input the compare input - * @param listener the compare input change listener - */ - public void addCompareInputChangeListener(ICompareInput input, ICompareInputChangeListener listener); - - /** - * Remove the change listener from the given compare input. Removing a listener that is not - * registered has no effect. - * @param input the compare input - * @param listener the compare input change listener - */ - public void removeCompareInputChangeListener(ICompareInput input, ICompareInputChangeListener listener); - - /** - * Register the content menu with the container to give the container a chance to - * add additional items to the context menu such as popup menu object contributions. - * The provided menu should have a {@link IWorkbenchActionConstants#MB_ADDITIONS} - * separator as this is where the container will add actions. - * @param menu the menu being registered - * @param selectionProvider the selection provider - */ - public void registerContextMenu(MenuManager menu, ISelectionProvider selectionProvider); - - /** - * Set the status message displayed by the container to the given message - * @param message the status message - */ - public void setStatusMessage(String message); - - /** - * Return the action bars for the container or <code>null</code> if the container - * does not have an action bars. - * @return the action bars for the container or <code>null</code> - */ - public IActionBars getActionBars(); - - /** - * Return the service locator for the container or <code>null</code> if the container - * does not have one. - * @return the service locator for the container or <code>null</code> - */ - public IServiceLocator getServiceLocator(); - - /** - * Return the {@link ICompareNavigator} associated with this container or <code>null</code> - * if the container does not have a global navigator. - * @return the {@link ICompareNavigator} associated with this container or <code>null</code> - */ - public ICompareNavigator getNavigator(); - - /** - * Queue the given task to be run asynchronously. If the given runnable was - * previously queued to run asynchronously and it has not yet run, the task - * position will be moved to the end of the queue. If the task that is being - * queued is currently running, the running task will be canceled and added - * to the end of the queue. - * <p> - * This method should be treated as a request to run the given task asynchronously. - * However, clients should not assume that the code will be run asynchronously. - * Depending on the container implementation, a call to this method may or may - * not block the caller until the task is completed. Also, the task may be executed - * in a modal or non-modal fashion. - * - * @param runnable the task to be performed - */ - public void runAsynchronously(IRunnableWithProgress runnable); - - /** - * Return the workbench part associated with this container or - * <code>null</code> if there is no part or it is not available. - * @return the workbench part associated with this container or - * <code>null</code> - */ - public IWorkbenchPart getWorkbenchPart(); - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ICompareInputLabelProvider.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ICompareInputLabelProvider.java deleted file mode 100644 index 4d74b744e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ICompareInputLabelProvider.java +++ /dev/null @@ -1,79 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006 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; - -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.swt.graphics.Image; - -/** - * A label provider that provides the label and image for the left, right and - * ancestor sides for a compare input being shown in compare/merge viewers. - * <p> - * This interface may be implemented by clients. - * - * @since 3.3 - */ -public interface ICompareInputLabelProvider extends ILabelProvider { - - /** - * Returns the label for the ancestor side of compare/merge viewers. - * This label is typically shown in the title of the ancestor area in a compare viewer. - * - * @param input the input object of a compare/merge viewer or <code>null</code> - * @return the label for the ancestor side or <code>null</code> - */ - String getAncestorLabel(Object input); - - /** - * Returns the image for the ancestor side of compare/merge viewers. - * This image is typically shown in the title of the ancestor area in a compare viewer. - * - * @param input the input object of a compare/merge viewer or <code>null</code> - * @return the image for the ancestor side or <code>null</code> - */ - Image getAncestorImage(Object input); - - /** - * Returns the label for the left hand side of compare/merge viewers. - * This label is typically shown in the title of the left side of a compare viewer. - * - * @param input the input object of a compare/merge viewer or <code>null</code> - * @return the label for the left hand side or <code>null</code> - */ - String getLeftLabel(Object input); - - /** - * Returns the image for the left hand side of compare/merge viewers. - * This image is typically shown in the title of the left side of a compare viewer. - * - * @param input the input object of a compare/merge viewer or <code>null</code> - * @return the image for the left hand side or <code>null</code> - */ - Image getLeftImage(Object input); - - /** - * Returns the label for the right hand side of compare/merge viewers. - * This label is typically shown in the title of the right side of a compare viewer. - * - * @param input the input object of a compare/merge viewer or <code>null</code> - * @return the label for the right hand side or <code>null</code> - */ - String getRightLabel(Object input); - - /** - * Returns the image for the right hand side of compare/merge viewers. - * This image is typically shown in the title of the right side of a compare viewer. - * - * @param input the input object of a compare/merge viewer or <code>null</code> - * @return the image for the right hand side or <code>null</code> - */ - Image getRightImage(Object input); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ICompareNavigator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ICompareNavigator.java deleted file mode 100644 index f0105f6e2..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ICompareNavigator.java +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2006 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; - -/** - * A <code>ICompareNavigator</code> is used to navigate through the individual - * differences of a <code>CompareEditorInput</code> or another type of Compare container. - * <p> - * You can retrieve an object implementing the <code>ICompareNavigator</code> from a - * <code>CompareEditorInput</code> by calling <code>getAdapter(ICompareNavigator)</code> - * on the <code>CompareEditorInput</code>. - * </p> - * <p> - * Although it is legal for clients to implement this interface, it is better - * to subclass {@link CompareNavigator}. - * - * @since 3.0 - */ -public interface ICompareNavigator { - - /** - * Starting from the current selection <code>selectChange</code> selects and reveals the next (previous) change. - * If the end (or beginning) is reached, the method returns <code>true</code>. - * - * @param next if <code>true</code> the next change is selected, otherwise the previous change - * @return returns <code>true</code> if end (beginning) is reached, <code>false</code> otherwise - */ - public boolean selectChange(boolean next); - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeListener.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeListener.java deleted file mode 100644 index 656eab5bc..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeListener.java +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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; - -/** - * An <code>IContentChangeListener</code> is informed about content changes of a - * <code>IContentChangeNotifier</code>. - * <p> - * Clients may implement this interface. - * </p> - * - * @see IContentChangeNotifier - */ -public interface IContentChangeListener { - - /** - * Called whenever the content of the given source has changed. - * - * @param source the source whose contents has changed - */ - void contentChanged(IContentChangeNotifier source); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeNotifier.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeNotifier.java deleted file mode 100644 index d460a1a3f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeNotifier.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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; - -/** - * Interface common to all objects that provide a means for registering - * for content change notification. - * <p> - * Clients may implement this interface. - * </p> - * - * @see IContentChangeListener - */ -public interface IContentChangeNotifier { - - /** - * Adds a content change listener to this notifier. - * Has no effect if an identical listener is already registered. - * - * @param listener a content changed listener - */ - void addContentChangeListener(IContentChangeListener listener); - - /** - * Removes the given content changed listener from this notifier. - * Has no effect if the listener is not registered. - * - * @param listener a content changed listener - */ - void removeContentChangeListener(IContentChangeListener listener); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IEditableContent.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IEditableContent.java deleted file mode 100644 index d8a88a75a..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IEditableContent.java +++ /dev/null @@ -1,70 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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; - -/** - * Common interface for objects with editable contents. - * Typically it is implemented by objects that also implement - * the <code>IStreamContentAccessor</code> interface. - * <p> - * Clients may implement this interface. - * <p> - * Note that implementing <code>IEditableContent</code> does not - * automatically mean that it is editable. An object is only editable if - * it implements <code>IEditableContent</code> and the <code>isEditable</code> method returns <code>true</code>. - * - * @see IStreamContentAccessor - */ -public interface IEditableContent { - - /** - * Returns <code>true</code> if this object can be modified. - * If it returns <code>false</code> the other methods of this API must not be called. - * - * @return <code>true</code> if this object can be modified - */ - boolean isEditable(); - - /** - * Replaces the current content with the given new bytes. - * - * @param newContent this new contents replaces the old contents - */ - void setContent(byte[] newContent); - - /** - * This method is called on a parent to add or remove a child, - * or to copy the contents of a child. - * - * What to do is encoded in the two arguments as follows: - * <TABLE> - * <TR> - * <TD>add:</TD> - * <TD>dest == null</TD> - * <TD>src != null</TD> - * </TR> - * <TR> - * <TD>remove:</TD> - * <TD>dest != null</TD> - * <TD>src == null</TD> - * </TR> - * <TR> - * <TD>copy:</TD> - * <TD>dest != null</TD> - * <TD>src != null</TD> - * </TR> - * </TABLE> - * @param dest the existing child of this object to be replaced; if <code>null</code> a new child can be added. - * @param src the new child to be added or replaced; if <code>null</code> an existing child can be removed. - * @return the argument <code>dest</code> - */ - ITypedElement replace(ITypedElement dest, ITypedElement src); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IEditableContentExtension.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IEditableContentExtension.java deleted file mode 100644 index a5c605f86..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IEditableContentExtension.java +++ /dev/null @@ -1,48 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006 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; - -import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.texteditor.IDocumentProviderExtension; - -/** - * Extends the {@link IEditableContent} interface to support validate edit. - * Clients should only use this interface if they obtained the content - * from an {@link IStreamContentAccessor}. If content was obtained through an - * {@link ISharedDocumentAdapter} then validation should be performed through - * the {@link IDocumentProviderExtension} interface. - * @see IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], Object) - * @since 3.3 - */ -public interface IEditableContentExtension { - - /** - * Return whether the typed element being displayed - * is read-only. a read-only element will require a - * call to validateEdit before the element can be modified on disk. - * @return whether the typed element is read-only - */ - boolean isReadOnly(); - - /** - * If the element is read-only, this method should be called - * to attempt to make it writable. - * @param shell a shell used to prompt the user if required. - * @return a status object that is <code>OK</code> if things are fine, - * otherwise a status describing reasons why modifying the given files is not - * reasonable. A status with a severity of <code>CANCEL</code> is returned - * if the validation was canceled, indicating the edit should not proceed. - */ - IStatus validateEdit(Shell shell); - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IEncodedStreamContentAccessor.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IEncodedStreamContentAccessor.java deleted file mode 100644 index 8ae157fba..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IEncodedStreamContentAccessor.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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; - -import org.eclipse.core.runtime.CoreException; - -/** - * Extension for <code>IStreamContentAccessor</code>. Extends the original - * concept of a <code>IStreamContentAccessor</code> to answer the Charset (encoding) used for the stream. - * - * @since 3.0 - */ -public interface IEncodedStreamContentAccessor extends IStreamContentAccessor { - - /** - * Returns the name of a charset encoding to be used when decoding this - * stream accessor's contents into characters. Returns <code>null</code> if a proper - * encoding cannot be determined. - * <p> - * <b>Note</b>: this method does not check whether the result is a supported - * charset name. Callers should be prepared to handle - * <code>UnsupportedEncodingException</code> where this charset is used. - * </p> - * @return the name of a charset, or <code>null</code> - * @exception CoreException if an error happens while determining - * the charset. See any refinements for more information. - * @see IStreamContentAccessor#getContents - * @since 3.0 - */ - String getCharset() throws CoreException; -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IModificationDate.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IModificationDate.java deleted file mode 100644 index f55c92374..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IModificationDate.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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; - -/** - * Common interface for objects with a modification date. The modification date - * can be used in the UI to give the user a general idea of how old an object is. - * <p> - * Clients may implement this interface. - * </p> - */ -public interface IModificationDate { - - /** - * Returns the modification time of this object. - * <p> - * Note that this value should only be used to give the user a general idea of how - * old the object is. - * - * @return the time of last modification, in milliseconds since January 1, 1970, 00:00:00 GMT - */ - long getModificationDate(); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/INavigatable.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/INavigatable.java deleted file mode 100644 index 8cfe6bd83..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/INavigatable.java +++ /dev/null @@ -1,89 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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; - -import org.eclipse.swt.widgets.Widget; - -/** - * Interface that allow clients to navigate through the changes shown in a compare pane. - * <p> - * This interface may be implemented by clients. - * </p> - * @since 3.3 - * @see ICompareNavigator - */ -public interface INavigatable { - - /** - * Property key that can be used to associate an instance of this interface with - * an SWT widget using {@link Widget#setData(String, Object)}. - */ - static final String NAVIGATOR_PROPERTY= "org.eclipse.compare.internal.Navigator"; //$NON-NLS-1$ - - /** - * Change flag used to navigate to the next change. - * @see #selectChange(int) - */ - static final int NEXT_CHANGE= 1; - - /** - * Change flag used to navigate to the previous change. - * @see #selectChange(int) - */ - static final int PREVIOUS_CHANGE= 2; - - /** - * Change flag used to navigate to the first change. - * @see #selectChange(int) - */ - static final int FIRST_CHANGE= 3; - - /** - * Change flag used to navigate to the last change. - * @see #selectChange(int) - */ - static final int LAST_CHANGE= 4; - - /** - * Return the input of the compare pane being navigated or <code>null</code> - * if the pane does not have an input. - * @return the input of the compare pane being navigated or <code>null</code> - */ - Object getInput(); - - /** - * Starting from the current selection <code>selectChange</code> selects and reveals the specified change. - * If the end (or beginning) is reached, the method returns <code>true</code>. - * - * @param changeFlag the change to be selected. One of <code>NEXT_CHANGE</code>, <code>PREVIOUS_CHANGE</code>, - * <code>FIRST_CHANGE</code> or <code>LAST_CHANGE</code>. - * @return returns <code>true</code> if end (beginning) is reached, <code>false</code> otherwise - */ - boolean selectChange(int changeFlag); - - /** - * Return whether a call to {@link #selectChange(int)} with the same parameter - * would succeed. - * @param changeFlag the change to be selected. One of <code>NEXT_CHANGE</code> or <code>PREVIOUS_CHANGE</code> - * @return whether a call to {@link #selectChange(int)} with the same parameter - * would succeed. - */ - boolean hasChange(int changeFlag); - - /** - * Request that the currently selected change be opened. Return <code>true</code> - * if the request resulted in the change being opened and <code>false</code> if the - * currently selected change could not be opened. - * @return whether the selected change was opened. - */ - boolean openSelectedChange(); - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IPropertyChangeNotifier.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IPropertyChangeNotifier.java deleted file mode 100644 index 52ad2d276..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IPropertyChangeNotifier.java +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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; - -import org.eclipse.jface.util.IPropertyChangeListener; - -/** - * Interface common to all objects that provide a means for registering - * for property change notification. - * <p> - * Clients may implement this interface. - * </p> - * - * @see org.eclipse.jface.util.IPropertyChangeListener - */ -public interface IPropertyChangeNotifier { - - /** - * Adds a listener for property changes to this notifier. - * Has no effect if an identical listener is already registered. - * - * @param listener a property change listener - */ - void addPropertyChangeListener(IPropertyChangeListener listener); - - /** - * Removes the given content change listener from this notifier. - * Has no effect if the identical listener is not registered. - * - * @param listener a property change listener - */ - void removePropertyChangeListener(IPropertyChangeListener listener); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IResourceProvider.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IResourceProvider.java deleted file mode 100644 index 87f801db2..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IResourceProvider.java +++ /dev/null @@ -1,26 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005 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; - -import org.eclipse.core.resources.IResource; - -/** - * @since 3.1 - */ -public interface IResourceProvider { - - /** - * Returns the corresponding resource for this object or <code>null</code>. - * - * @return the corresponding resource or <code>null</code> - */ - IResource getResource(); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ISharedDocumentAdapter.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ISharedDocumentAdapter.java deleted file mode 100644 index e1b10d930..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ISharedDocumentAdapter.java +++ /dev/null @@ -1,90 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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; - -import org.eclipse.compare.structuremergeviewer.SharedDocumentAdapterWrapper; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.text.IDocument; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.texteditor.IDocumentProvider; - -/** - * An <code>ISharedDocumentAdapter</code> is used to map an - * {@link ITypedElement} to a shared document for the purposes of editing. - * - * @noimplement Clients are not expected to implement this interface but instead - * should subclass {@link SharedDocumentAdapter} or - * {@link SharedDocumentAdapterWrapper}. - * @since 3.3 - */ -public interface ISharedDocumentAdapter { - - /** - * Return the object that is to be used as the key for retrieving the - * appropriate {@link IDocumentProvider} from the - * <code>DocumentProviderRegistry</code> and for obtaining the shared - * {@link IDocument} from the document provider. Returns <code>null</code> - * if the element does not have a shared document. - * - * @param element - * the element being queried for a shared document - * @return the object that acts as the key to obtain a document provider and - * document or <code>null</code> - */ - IEditorInput getDocumentKey(Object element); - - /** - * Connect the given element to its document provider. All connections must be performed - * through this adapter so that the adapter can track whether it is connected or not. - * @param provider the document provider - * @param documentKey the element's key returned from {@link #getDocumentKey(Object)} - * @throws CoreException if connection was not possible - * @see IDocumentProvider#connect(Object) - */ - void connect(IDocumentProvider provider, IEditorInput documentKey) throws CoreException; - - /** - * Disconnect the element from the document provider. All connects and - * disconnects must occur through the adapter so that the adapter can - * track whether it is connected or not. - * @param provider the document provider - * @param documentKey the element's key returned from {@link #getDocumentKey(Object)} - * @see IDocumentProvider#disconnect(Object) - */ - void disconnect(IDocumentProvider provider, IEditorInput documentKey); - - /** - * A helper disconnect method that looks up the appropriate key (using {@link #getDocumentKey(Object)} - * and the appropriate provider and calls {@link #disconnect(IDocumentProvider, IEditorInput)}. - * @param element the element that was used to previously connect to a document - * @see IDocumentProvider#disconnect(Object) - */ - void disconnect(Object element); - - /** - * Flush the contents of the given document into the typed element that provided the - * document. This method is invoked by the Compare framework classes - * when a request to flush the viewers has been made. It is up to the implementor to decide - * whether the changes in the buffer should be saved to disk at the time of the flush or - * buffered to be saved at a later time. - * - * @param provider the document provider - * @param documentKey the element's key returned from {@link #getDocumentKey(Object)} - * @param document the document - * @param overwrite indicates whether overwrite should be performed - * while saving the given element if necessary - * @exception CoreException if document could not be stored to the given element - * @see IDocumentProvider#saveDocument(IProgressMonitor, Object, IDocument, boolean) - */ - void flushDocument(IDocumentProvider provider, IEditorInput documentKey, IDocument document, boolean overwrite) throws CoreException; - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IStreamContentAccessor.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IStreamContentAccessor.java deleted file mode 100644 index 04f25e9db..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IStreamContentAccessor.java +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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; - -import java.io.InputStream; - -import org.eclipse.core.runtime.CoreException; - -/** - * An <code>IStreamContentAccessor</code> object represents a set of bytes which can be - * accessed by means of a stream. - * <p> - * Clients may implement this interface, or use the standard implementation, - * <code>BufferedContent</code>. - * - * @see BufferedContent - */ -public interface IStreamContentAccessor { - /** - * Returns an open <code>InputStream</code> for this object which can be used to retrieve the object's content. - * The client is responsible for closing the stream when finished. - * Returns <code>null</code> if this object has no streamable contents. - * - * @return an input stream containing the contents of this object - * @exception CoreException if the contents of this object could not be accessed - */ - InputStream getContents() throws CoreException; -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IStreamMerger.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IStreamMerger.java deleted file mode 100644 index f5b6abebd..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IStreamMerger.java +++ /dev/null @@ -1,69 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2007 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; - -import java.io.InputStream; -import java.io.OutputStream; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; - -/** - * This interface defines a single operation for performing a three-way merge on three - * input streams. The merged result is written to an output stream. - * <p> - * Clients must implement this interface when contributing new mergers to the - * <code>org.eclipse.compare.streamMergers</code> extension point. - * </p> - * @deprecated Clients should use <code>org.eclipse.team.core.mapping.IStorageMerger</code> instead. - * @since 3.0 - */ -public interface IStreamMerger { - - /** - * Indicates the successful completion of the merge operation (value <code>IStatus.OK</code>) - */ - public static final int OK= IStatus.OK; - - /** - * Indicates that a change conflict prevented the merge from successful completion (value <code>1</code>) - */ - public static final int CONFLICT= 1; - - /** - * Status code describing an internal error (value <code>2</code>) - */ - public static final int INTERNAL_ERROR= 2; - - /** - * Performs a merge operation on the given input streams and writes the merge result to the output stream. - * On success a status <code>IStatus.OK</code> is returned, on error a status <code>IStatus.ERROR</code>. - * If the merge operation cannot deal with conflicts, the code of the error status has the value <code>IStreamMerger.CONFLICT</code>. - * For text oriented mergers the encoding for the input and output streams is honored. - * It is the responsibility of callers to close input and output streams. - * - * @param output the byte stream to which the merge result is written; the merger will not close the stream - * @param outputEncoding the encoding to use when writing to the output stream - * @param ancestor the byte stream from which the common ancestor is read - * @param ancestorEncoding the encoding of the ancestor input byte stream - * @param target the byte stream containing the target of the merge - * @param targetEncoding the encoding of the target input byte stream - * @param other the byte stream containing the target of the merge - * @param otherEncoding the encoding of the other input byte stream - * @param monitor reports progress of the merge operation - * @return returns the completion status of the operation - */ - IStatus merge(OutputStream output, String outputEncoding, - InputStream ancestor, String ancestorEncoding, - InputStream target, String targetEncoding, - InputStream other, String otherEncoding, - IProgressMonitor monitor); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ITypedElement.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ITypedElement.java deleted file mode 100644 index 27c0b2752..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ITypedElement.java +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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; - -import org.eclipse.swt.graphics.Image; - -/** - * Interface for getting the name, image, and type for an object. - * <p> - * These methods are typically used to present an input object in the compare UI - * (<code>getName</code> and <code>getImage</code>) - * and for finding a viewer for a given input type (<code>getType</code>). - * <p> - * Clients may implement this interface. - */ -public interface ITypedElement { - - /** - * Type for a folder input (value <code>"FOLDER"</code>). - * Folders are comparison elements that have no contents, only a name and children. - */ - public static final String FOLDER_TYPE= "FOLDER"; //$NON-NLS-1$ - - /** - * Type for an element whose actual type is text (value <code>"txt"</code>). - */ - public static final String TEXT_TYPE= "txt"; //$NON-NLS-1$ - - /** - * Type for an element whose actual type could not - * be determined. (value <code>"???"</code>). - */ - public static final String UNKNOWN_TYPE= "???"; //$NON-NLS-1$ - - /** - * Returns the name of this object. - * The name is used when displaying this object in the UI. - * - * @return the name of this object - */ - String getName(); - - /** - * Returns an image for this object. - * This image is used when displaying this object in the UI. - * - * @return the image of this object or <code>null</code> if this type of input has no image - */ - Image getImage(); - - /** - * Returns the type of this object. For objects with a file name - * this is typically the file extension. For folders its the constant - * <code>FOLDER_TYPE</code>. - * The type is used for determining a suitable viewer for this object. - * - * @return the type of this object - */ - String getType(); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IViewerCreator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IViewerCreator.java deleted file mode 100644 index 2626ec85b..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IViewerCreator.java +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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; - -import org.eclipse.swt.widgets.Composite; - -import org.eclipse.jface.viewers.Viewer; - -/** - * A factory object for <code>Viewer</code>. - * <p> - * This interface is only required when creating a <code>Viewer</code> from a plugin.xml file. - * Since <code>Viewer</code>s have no default constructor they cannot be - * instantiated directly with <code>Class.forName</code>. - */ -public interface IViewerCreator { - - /** - * Creates a new viewer under the given SWT parent control. - * - * @param parent the SWT parent control under which to create the viewer's SWT control - * @param config a compare configuration the newly created viewer might want to use - * @return a new viewer - */ - Viewer createViewer(Composite parent, CompareConfiguration config); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/NavigationAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/NavigationAction.java deleted file mode 100644 index 81236f85f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/NavigationAction.java +++ /dev/null @@ -1,95 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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; - -import java.util.ResourceBundle; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -import org.eclipse.compare.internal.CompareMessages; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.Utilities; - - -/** - * A <code>NavigationAction</code> is used to navigate through the individual - * differences of a <code>CompareEditorInput</code>. - * <p> - * Clients may instantiate this class; it is not intended to be subclassed. - * </p> - * @since 2.0 - * @noextend This class is not intended to be subclassed by clients. - */ -public class NavigationAction extends Action { - - private boolean fNext; - private CompareEditorInput fCompareEditorInput; - - - /** - * Creates a <code>NavigationAction</code>. - * - * @param next if <code>true</code> action goes to the next difference; otherwise to the previous difference. - */ - public NavigationAction(boolean next) { - this(CompareUI.getResourceBundle(), next); - } - - /** - * Creates a <code>NavigationAction</code> that initializes its attributes - * from the given <code>ResourceBundle</code>. - * - * @param bundle is used to initialize the action - * @param next if <code>true</code> action goes to the next difference; otherwise to the previous difference. - */ - public NavigationAction(ResourceBundle bundle, boolean next) { - Utilities.initAction(this, bundle, next ? "action.Next." : "action.Previous."); //$NON-NLS-2$ //$NON-NLS-1$ - fNext= next; - } - - public void run() { - if (fCompareEditorInput != null) { - Object adapter= fCompareEditorInput.getAdapter(ICompareNavigator.class); - if (adapter instanceof ICompareNavigator) { - boolean atEnd= ((ICompareNavigator)adapter).selectChange(fNext); - Shell shell= CompareUIPlugin.getShell(); - if (atEnd && shell != null) { - - Display display= shell.getDisplay(); - if (display != null) - display.beep(); - - String title; - String message; - if (fNext) { - title= CompareMessages.CompareNavigator_atEnd_title; - message= CompareMessages.CompareNavigator_atEnd_message; - } else { - title= CompareMessages.CompareNavigator_atBeginning_title; - message= CompareMessages.CompareNavigator_atBeginning_message; - } - MessageDialog.openInformation(shell, title, message); - } - } - } - } - - /** - * Sets the <code>CompareEditorInput</code> on which this action operates. - * - * @param input the <code>CompareEditorInput</code> on which this action operates; if <code>null</code> action does nothing - */ - public void setCompareEditorInput(CompareEditorInput input) { - fCompareEditorInput= input; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ResourceNode.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ResourceNode.java deleted file mode 100644 index 864424807..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ResourceNode.java +++ /dev/null @@ -1,230 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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; - -import java.io.*; -import java.util.ArrayList; - -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.structuremergeviewer.IStructureComparator; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Shell; - -/** - * A <code>ResourceNode</code> wraps an <code>IResources</code> so that it can be used - * as input for the differencing engine (interfaces <code>IStructureComparator</code> and <code>ITypedElement</code>) - * and the <code>ReplaceWithEditionDialog</code> (interfaces <code>ITypedElement</code> and <code>IModificationDate</code>). - * <p> - * Clients may instantiate this class; it is not intended to be subclassed. - * </p> - * @noextend This class is not intended to be subclassed by clients. - */ -public class ResourceNode extends BufferedContent - implements IEncodedStreamContentAccessor, IStructureComparator, ITypedElement, - IEditableContent, IModificationDate, IResourceProvider, IEditableContentExtension { - - private IResource fResource; - private ArrayList fChildren; - - - /** - * Creates a <code>ResourceNode</code> for the given resource. - * - * @param resource the resource - */ - public ResourceNode(IResource resource) { - fResource= resource; - Assert.isNotNull(resource); - } - - /** - * Returns the corresponding resource for this object. - * - * @return the corresponding resource - */ - public IResource getResource() { - return fResource; - } - - /* (non Javadoc) - * see IStreamContentAccessor.getContents - */ - public InputStream getContents() throws CoreException { - if (fResource instanceof IStorage) - return super.getContents(); - return null; - } - - /* (non Javadoc) - * see IModificationDate.getModificationDate - */ - public long getModificationDate() { - return fResource.getLocalTimeStamp(); - } - - /* (non Javadoc) - * see ITypedElement.getName - */ - public String getName() { - if (fResource != null) - return fResource.getName(); - return null; - } - - /* (non Javadoc) - * see ITypedElement.getType - */ - public String getType() { - if (fResource instanceof IContainer) - return ITypedElement.FOLDER_TYPE; - if (fResource != null) { - String s= fResource.getFileExtension(); - if (s != null) - return s; - } - return ITypedElement.UNKNOWN_TYPE; - } - - /* (non Javadoc) - * see ITypedElement.getImage - */ - public Image getImage() { - return CompareUI.getImage(fResource); - } - - /* - * Returns <code>true</code> if the other object is of type <code>ITypedElement</code> - * and their names are identical. The content is not considered. - */ - public boolean equals(Object other) { - if (other instanceof ITypedElement) { - String otherName= ((ITypedElement)other).getName(); - return getName().equals(otherName); - } - return super.equals(other); - } - - /** - * Returns the hash code of the name. - * @return a hash code value for this object. - */ - public int hashCode() { - return getName().hashCode(); - } - - /* (non Javadoc) - * see IStructureComparator.getChildren - */ - public Object[] getChildren() { - if (fChildren == null) { - fChildren= new ArrayList(); - if (fResource instanceof IContainer) { - try { - IResource members[]= ((IContainer)fResource).members(); - for (int i= 0; i < members.length; i++) { - IStructureComparator child= createChild(members[i]); - if (child != null) - fChildren.add(child); - } - } catch (CoreException ex) { - // NeedWork - } - } - } - return fChildren.toArray(); - } - - /** - * This hook method is called from <code>getChildren</code> once for every - * member of a container resource. This implementation - * creates a new <code>ResourceNode</code> for the given child resource. - * Clients may override this method to create a different type of - * <code>IStructureComparator</code> or to filter children by returning <code>null</code>. - * - * @param child the child resource for which a <code>IStructureComparator</code> must be returned - * @return a <code>ResourceNode</code> for the given child or <code>null</code> - */ - protected IStructureComparator createChild(IResource child) { - return new ResourceNode(child); - } - - /** - * Returns an open stream if the corresponding resource implements the - * <code>IStorage</code> interface. Otherwise the value <code>null</code> is returned. - * - * @return a buffered input stream containing the contents of this storage - * @exception CoreException if the contents of this storage could not be accessed - */ - protected InputStream createStream() throws CoreException { - if (fResource instanceof IStorage) { - InputStream is= null; - IStorage storage= (IStorage) fResource; - try { - is= storage.getContents(); - } catch (CoreException e) { - if (e.getStatus().getCode() == IResourceStatus.OUT_OF_SYNC_LOCAL) { - fResource.refreshLocal(IResource.DEPTH_INFINITE, null); - is= storage.getContents(); - } else - throw e; - } - if (is != null) - return new BufferedInputStream(is); - } - return null; - } - - /* (non Javadoc) - * see IEditableContent.isEditable - */ - public boolean isEditable() { - return true; - } - - /* (non Javadoc) - * see IEditableContent.replace - */ - public ITypedElement replace(ITypedElement child, ITypedElement other) { - return child; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IEncodedStreamContentAccessor#getCharset() - */ - public String getCharset() { - return Utilities.getCharset(fResource); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IEditableContentExtension#isReadOnly() - */ - public boolean isReadOnly() { - if (fResource.getType() == IResource.FILE) { - ResourceAttributes attrs = fResource.getResourceAttributes(); - if (attrs != null) { - return attrs.isReadOnly(); - } - } - return false; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IEditableContentExtension#validateEdit(org.eclipse.swt.widgets.Shell) - */ - public IStatus validateEdit(Shell shell) { - if (isReadOnly()) - return ResourcesPlugin.getWorkspace().validateEdit(new IFile[] { (IFile)fResource}, shell); - return Status.OK_STATUS; - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/SharedDocumentAdapter.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/SharedDocumentAdapter.java deleted file mode 100644 index cfae7ec7c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/SharedDocumentAdapter.java +++ /dev/null @@ -1,125 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2007 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; - -import org.eclipse.compare.internal.Utilities; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.text.IDocument; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.part.FileEditorInput; -import org.eclipse.ui.texteditor.DocumentProviderRegistry; -import org.eclipse.ui.texteditor.IDocumentProvider; - -/** - * An implementation of {@link ISharedDocumentAdapter} that provides default behavior for the - * methods of that interface. - * <p> - * Clients may subclass this class. - * </p> - * @since 3.3 - */ -public abstract class SharedDocumentAdapter implements ISharedDocumentAdapter { - - /** - * Return the document provider for the given editor input. - * @param input the editor input - * @return the document provider for the given editor input - */ - public static IDocumentProvider getDocumentProvider(IEditorInput input) { - return DocumentProviderRegistry.getDefault().getDocumentProvider(input); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ISharedDocumentAdapter#connect(org.eclipse.ui.texteditor.IDocumentProvider, org.eclipse.ui.IEditorInput) - */ - public void connect(IDocumentProvider provider, IEditorInput documentKey) - throws CoreException { - provider.connect(documentKey); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ISharedDocumentAdapter#disconnect(org.eclipse.ui.texteditor.IDocumentProvider, org.eclipse.ui.IEditorInput) - */ - public void disconnect(IDocumentProvider provider, IEditorInput documentKey) { - provider.disconnect(documentKey); - } - - /** - * Default implementation of {@link #getDocumentKey(Object)} that returns a - * {@link FileEditorInput} for the element if the element adapts to {@link IFile}. - * @see org.eclipse.compare.ISharedDocumentAdapter#getDocumentKey(java.lang.Object) - */ - public IEditorInput getDocumentKey(Object element) { - IFile file = getFile(element); - if (file != null && file.exists()) { - return new FileEditorInput(file); - } - return null; - } - - private IFile getFile(Object element) { - if (element instanceof IResourceProvider) { - IResourceProvider rp = (IResourceProvider) element; - IResource resource = rp.getResource(); - if (resource instanceof IFile) { - return (IFile) resource; - } - } - IFile file = (IFile)Utilities.getAdapter(element, IFile.class); - if (file != null) { - return file; - } - IResource resource = (IResource)Utilities.getAdapter(element, IResource.class); - if (resource instanceof IFile) { - return (IFile) resource; - } - return null; - } - - /** - * A helper method to save a document. - * - * @param provider the document provider - * @param documentKey the document key - * @param document the document - * @param overwrite indicates whether overwrite should be performed - * while saving the given element if necessary - * @param monitor a progress monitor - * @throws CoreException - */ - protected void saveDocument(IDocumentProvider provider, - IEditorInput documentKey, IDocument document, boolean overwrite, - IProgressMonitor monitor) throws CoreException { - try { - provider.aboutToChange(documentKey); - provider.saveDocument(monitor, documentKey, document, overwrite); - } finally { - provider.changed(documentKey); - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ISharedDocumentAdapter#disconnect(java.lang.Object) - */ - public void disconnect(Object element) { - IEditorInput input = getDocumentKey(element); - if (input == null) - return; - IDocumentProvider provider = SharedDocumentAdapter.getDocumentProvider(input); - if (provider == null) - return; - disconnect(provider, input); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/Splitter.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/Splitter.java deleted file mode 100644 index 6ee909416..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/Splitter.java +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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; - -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.custom.SashForm; - -/** - * The Splitter adds support for nesting to a SashForm. - * <P> - * If Splitters are nested directly: - * <UL> - * <LI>changing the visibility of a child may propagate upward to the parent Splitter if the child - * is the last child to become invisible or the first to become visible.</LI> - * <LI>maximizing a child makes it as large as the topmost enclosing Splitter</LI> - * </UL> - * - * @since 2.1 - */ -public class Splitter extends SashForm { - - private static final String VISIBILITY= "org.eclipse.compare.internal.visibility"; //$NON-NLS-1$ - - /** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - * <p> - * The style value is either one of the style constants defined in - * class <code>SWT</code> which is applicable to instances of this - * class, or must be built by <em>bitwise OR</em>'ing together - * (that is, using the <code>int</code> "|" operator) two or more - * of those <code>SWT</code> style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - * </p> - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parent is null</li> - * </ul> - * @exception org.eclipse.swt.SWTException <ul> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li> - * </ul> - */ - public Splitter(Composite parent, int style) { - super(parent, style); - } - - /** - * Sets the visibility of the given child in this Splitter. If this change - * affects the visibility state of the whole Splitter, and if the Splitter - * is directly nested in one or more Splitters, this method recursively - * propagates the new state upward. - * - * @param child the child control for which the visibility is changed - * @param visible the new visibility state - */ - public void setVisible(Control child, boolean visible) { - - boolean wasEmpty= isEmpty(); - - child.setVisible(visible); - child.setData(VISIBILITY, new Boolean(visible)); - - if (wasEmpty != isEmpty()) { - // recursively walk up - Composite parent= getParent(); - if (parent instanceof Splitter) { - Splitter sp= (Splitter) parent; - sp.setVisible(this, visible); - sp.layout(); - } - } else { - layout(); - } - } - - /* (non-Javadoc) - * Recursively calls setMaximizedControl for all direct parents that are - * itself Splitters. - */ - public void setMaximizedControl(Control control) { - if (control == null || control == getMaximizedControl()) - super.setMaximizedControl(null); - else - super.setMaximizedControl(control); - - // recursively walk upward - Composite parent= getParent(); - if (parent instanceof Splitter) - ((Splitter) parent).setMaximizedControl(this); - else - layout(true); - } - - /* (non-Javadoc) - * Returns true if Splitter has no children or if all children are invisible. - */ - private boolean isEmpty() { - Control[] controls= getChildren(); - for (int i= 0; i < controls.length; i++) - if (isVisible(controls[i])) - return false; - return true; - } - - /* (non-Javadoc) - * Returns the visibility state of the given child control. If the - * control is a Sash, this method always returns false. - */ - private boolean isVisible(Control child) { - if (child instanceof Sash) - return false; - Object data= child.getData(VISIBILITY); - if (data instanceof Boolean) - return ((Boolean)data).booleanValue(); - return true; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ZipFileStructureCreator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ZipFileStructureCreator.java deleted file mode 100644 index 573fc4e24..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ZipFileStructureCreator.java +++ /dev/null @@ -1,326 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Iterator; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.structuremergeviewer.Differencer; -import org.eclipse.compare.structuremergeviewer.IDiffContainer; -import org.eclipse.compare.structuremergeviewer.IStructureComparator; -import org.eclipse.compare.structuremergeviewer.IStructureCreator; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.swt.graphics.Image; - -/** - * This implementation of the <code>IStructureCreator</code> interface - * makes the contents of a zip archive available as a - * hierarchical structure of <code>IStructureComparator</code>s. - * <p> - * It is used when comparing the internal structure of a zip archive. - * - * @since 2.0 - */ -public class ZipFileStructureCreator implements IStructureCreator { - - /** - * Common base class for ZipFolder and ZipFile - */ - static abstract class ZipResource implements IStructureComparator, ITypedElement { - - private String fName; - - ZipResource(String name) { - fName= name; - } - - public String getName() { - return fName; - } - - public Image getImage() { - return CompareUI.getImage(getType()); - } - - /* - * Returns true if other is ITypedElement and names are equal. - * @see IComparator#equals - */ - public boolean equals(Object other) { - if (other instanceof ITypedElement) - return fName.equals(((ITypedElement) other).getName()); - return super.equals(other); - } - - public int hashCode() { - return fName.hashCode(); - } - } - - static class ZipFolder extends ZipResource { - - private HashMap fChildren= new HashMap(10); - - ZipFolder(String name) { - super(name); - } - - public String getType() { - return ITypedElement.FOLDER_TYPE; - } - - public Object[] getChildren() { - Object[] children= new Object[fChildren.size()]; - Iterator iter= fChildren.values().iterator(); - for (int i= 0; iter.hasNext(); i++) - children[i]= iter.next(); - return children; - } - - ZipFile createContainer(String path) { - String entry= path; - int pos= path.indexOf('/'); - if (pos < 0) - pos= path.indexOf('\\'); - if (pos >= 0) { - entry= path.substring(0, pos); - path= path.substring(pos + 1); - } else if (entry.length() > 0) { - if (CompareUIPlugin.getDefault().filter(path, false, true)) - return null; - ZipFile ze= new ZipFile(entry); - fChildren.put(entry, ze); - return ze; - } else - return null; - - ZipFolder folder= null; - if (fChildren != null) { - Object o= fChildren.get(entry); - if (o instanceof ZipFolder) - folder= (ZipFolder) o; - } - - if (folder == null) { - if (path.length() > 0 && CompareUIPlugin.getDefault().filter(path, true, true)) - return null; - folder= new ZipFolder(entry); - fChildren.put(entry, folder); - } - - return folder.createContainer(path); - } - } - - static class ZipFile extends ZipResource implements IStreamContentAccessor { - - private byte[] fContents; - - ZipFile(String name) { - super(name); - } - - public String getType() { - String s= this.getName(); - int pos= s.lastIndexOf('.'); - if (pos >= 0) - return s.substring(pos + 1); - return ITypedElement.UNKNOWN_TYPE; - } - - public Object[] getChildren() { - return null; - } - - public InputStream getContents() { - if (fContents == null) - fContents= new byte[0]; - return new ByteArrayInputStream(fContents); - } - - byte[] getBytes() { - return fContents; - } - - void setBytes(byte[] buffer) { - fContents= buffer; - } - - void appendBytes(byte[] buffer, int length) { - if (length > 0) { - int oldLen= 0; - if (fContents != null) - oldLen= fContents.length; - byte[] newBuf= new byte[oldLen + length]; - if (oldLen > 0) - System.arraycopy(fContents, 0, newBuf, 0, oldLen); - System.arraycopy(buffer, 0, newBuf, oldLen, length); - fContents= newBuf; - } - } - } - - private String fTitle; - - /** - * Create a new ZipFileStructureCreator. - */ - public ZipFileStructureCreator() { - this(Utilities.getString("ZipStructureCreator.name")); //$NON-NLS-1$ - } - - /** - * Create a new ZipFileStructureCreator with the given title. - * The title is returned by the method <code>getName()</code>. - * @param title the title of this structure creator - */ - public ZipFileStructureCreator(String title) { - fTitle= title; - } - - public String getName() { - return fTitle; - } - - public IStructureComparator getStructure(Object input) { - - InputStream is= null; - - if (input instanceof IStreamContentAccessor) { - IStreamContentAccessor sca= (IStreamContentAccessor) input; - try { - is= sca.getContents(); - } catch (CoreException ex) { - // NeedWork - } - } - - if (is == null) - return null; - - ZipInputStream zip= new ZipInputStream(is); - ZipFolder root= new ZipFolder(""); //$NON-NLS-1$ - try { - for (;;) { - ZipEntry entry= zip.getNextEntry(); - if (entry == null) - break; - - ZipFile ze= root.createContainer(entry.getName()); - if (ze != null) { - int length= (int) entry.getSize(); - if (length >= 0) { - byte[] buffer= new byte[length]; - int offset= 0; - - do { - int n= zip.read(buffer, offset, length); - offset += n; - length -= n; - } while (length > 0); - - ze.setBytes(buffer); - } else { - byte[] buffer= new byte[1024]; - int n; - do { - n= zip.read(buffer, 0, 1024); - ze.appendBytes(buffer, n); - } while (n >= 0); - } - } - zip.closeEntry(); - } - } catch (IOException ex) { - return null; - } finally { - try { - zip.close(); - } catch (IOException ex) { - // silently ignored - } - } - - if (root.fChildren.size() == 1) { - Iterator iter= root.fChildren.values().iterator(); - return (IStructureComparator) iter.next(); - } - return root; - } - - public String getContents(Object o, boolean ignoreWhitespace) { - if (o instanceof ZipFile) { - byte[] bytes= ((ZipFile)o).getBytes(); - if (bytes != null) - return new String(bytes); - return ""; //$NON-NLS-1$ - } - return null; - } - - /** - * Returns <code>false</code> since we cannot update a zip archive. - * @return <code>false</code> - */ - public boolean canSave() { - return false; - } - - /** - * Called whenever a copy operation has been performed on a tree node. - * This implementation throws an <code>AssertionFailedException</code> - * since we cannot update a zip archive. - * - * @param structure the node for which to save the new content - * @param input the object from which the structure tree was created in <code>getStructure</code> - */ - public void save(IStructureComparator structure, Object input) { - Assert.isTrue(false); // Cannot update zip archive - } - - public IStructureComparator locate(Object path, Object source) { - return null; - } - - /** - * Returns <code>false</code> since this <code>IStructureCreator</code> - * cannot rewrite the diff tree in order to fold certain combinations of - * additions and deletions. - * <p> - * Note: this method is for internal use only. Clients should not call this method. - * @return <code>false</code> - */ - public boolean canRewriteTree() { - return false; - } - - /** - * Empty implementation since this <code>IStructureCreator</code> - * cannot rewrite the diff tree in order to fold certain combinations of - * additions and deletions. - * <p> - * Note: this method is for internal use only. Clients should not call this method. - * @param differencer - * @param root - */ - public void rewriteTree(Differencer differencer, IDiffContainer root) { - // empty default implementation - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java deleted file mode 100644 index b47931690..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java +++ /dev/null @@ -1,1343 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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.contentmergeviewer; - -import java.util.ResourceBundle; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.compare.CompareUI; -import org.eclipse.compare.CompareViewerPane; -import org.eclipse.compare.ICompareContainer; -import org.eclipse.compare.ICompareInputLabelProvider; -import org.eclipse.compare.IPropertyChangeNotifier; -import org.eclipse.compare.internal.ChangePropertyAction; -import org.eclipse.compare.internal.CompareEditor; -import org.eclipse.compare.internal.CompareHandlerService; -import org.eclipse.compare.internal.CompareMessages; -import org.eclipse.compare.internal.ICompareUIConstants; -import org.eclipse.compare.internal.IFlushable2; -import org.eclipse.compare.internal.ISavingSaveable; -import org.eclipse.compare.internal.MergeViewerContentProvider; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.internal.ViewerSwitchingCancelled; -import org.eclipse.compare.structuremergeviewer.Differencer; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.ActionContributionItem; -import org.eclipse.jface.action.IToolBarManager; -import org.eclipse.jface.action.LegacyActionTools; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.action.ToolBarManager; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.ContentViewer; -import org.eclipse.jface.viewers.IContentProvider; -import org.eclipse.jface.viewers.ILabelProviderListener; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.LabelProviderChangedEvent; -import org.eclipse.jface.window.Window; -import org.eclipse.osgi.util.TextProcessor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CLabel; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseMoveListener; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Layout; -import org.eclipse.swt.widgets.Sash; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.ISaveablesSource; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.Saveable; - -/** - * An abstract compare and merge viewer with two side-by-side content areas - * and an optional content area for the ancestor. The implementation makes no - * assumptions about the content type. - * <p> - * <code>ContentMergeViewer</code> - * <ul> - * <li>implements the overall layout and defines hooks so that subclasses - * can easily provide an implementation for a specific content type, - * <li>implements the UI for making the areas resizable, - * <li>has an action for controlling whether the ancestor area is visible or not, - * <li>has actions for copying one side of the input to the other side, - * <li>tracks the dirty state of the left and right sides and send out notification - * on state changes. - * </ul> - * A <code>ContentMergeViewer</code> accesses its - * model by means of a content provider which must implement the - * <code>IMergeViewerContentProvider</code> interface. - * </p> - * <p> - * Clients may wish to use the standard concrete subclass <code>TextMergeViewer</code>, - * or define their own subclass. - * - * @see IMergeViewerContentProvider - * @see TextMergeViewer - */ -public abstract class ContentMergeViewer extends ContentViewer - implements IPropertyChangeNotifier, IFlushable, IFlushable2 { - - /* package */ static final int HORIZONTAL= 1; - /* package */ static final int VERTICAL= 2; - - static final double HSPLIT= 0.5; - static final double VSPLIT= 0.3; - - private class ContentMergeViewerLayout extends Layout { - - public Point computeSize(Composite c, int w, int h, boolean force) { - return new Point(100, 100); - } - - public void layout(Composite composite, boolean force) { - - // determine some derived sizes - int headerHeight= fLeftLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).y; - Rectangle r= composite.getClientArea(); - - int centerWidth= getCenterWidth(); - int width1= (int)((r.width-centerWidth)*getHorizontalSplitRatio()); - int width2= r.width-width1-centerWidth; - - int height1= 0; - int height2= 0; - if (fIsThreeWay && fAncestorVisible) { - height1= (int)((r.height-(2*headerHeight))*fVSplit); - height2= r.height-(2*headerHeight)-height1; - } else { - height1= 0; - height2= r.height-headerHeight; - } - - int y= 0; - - if (fIsThreeWay && fAncestorVisible) { - fAncestorLabel.setBounds(0, y, r.width, headerHeight); - fAncestorLabel.setVisible(true); - y+= headerHeight; - handleResizeAncestor(0, y, r.width, height1); - y+= height1; - } else { - fAncestorLabel.setVisible(false); - handleResizeAncestor(0, 0, 0, 0); - } - - fLeftLabel.getSize(); // without this resizing would not always work - - if (centerWidth > 3) { - fLeftLabel.setBounds(0, y, width1+1, headerHeight); - fDirectionLabel.setVisible(true); - fDirectionLabel.setBounds(width1+1, y, centerWidth-1, headerHeight); - fRightLabel.setBounds(width1+centerWidth, y, width2, headerHeight); - } else { - fLeftLabel.setBounds(0, y, width1, headerHeight); - fDirectionLabel.setVisible(false); - fRightLabel.setBounds(width1, y, r.width-width1, headerHeight); - } - - y+= headerHeight; - - if (fCenter != null && !fCenter.isDisposed()) - fCenter.setBounds(width1, y, centerWidth, height2); - - handleResizeLeftRight(0, y, width1, centerWidth, width2, height2); - } - - private double getHorizontalSplitRatio() { - if (fHSplit < 0) { - Object input = getInput(); - if (input instanceof ICompareInput) { - ICompareInput ci = (ICompareInput) input; - if (ci.getLeft() == null) - return 0.1; - if (ci.getRight() == null) - return 0.9; - } - return HSPLIT; - } - return fHSplit; - } - } - - class Resizer extends MouseAdapter implements MouseMoveListener { - - Control fControl; - int fX, fY; - int fWidth1, fWidth2; - int fHeight1, fHeight2; - int fDirection; - boolean fLiveResize; - boolean fIsDown; - - public Resizer(Control c, int dir) { - fDirection= dir; - fControl= c; - fLiveResize= !(fControl instanceof Sash); - updateCursor(c, dir); - fControl.addMouseListener(this); - fControl.addMouseMoveListener(this); - fControl.addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - fControl= null; - } - } - ); - } - - public void mouseDoubleClick(MouseEvent e) { - if ((fDirection & HORIZONTAL) != 0) - fHSplit= -1; - if ((fDirection & VERTICAL) != 0) - fVSplit= VSPLIT; - fComposite.layout(true); - } - - public void mouseDown(MouseEvent e) { - Composite parent= fControl.getParent(); - - Point s= parent.getSize(); - Point as= fAncestorLabel.getSize(); - Point ys= fLeftLabel.getSize(); - Point ms= fRightLabel.getSize(); - - fWidth1= ys.x; - fWidth2= ms.x; - fHeight1= fLeftLabel.getLocation().y-as.y; - fHeight2= s.y-(fLeftLabel.getLocation().y+ys.y); - - fX= e.x; - fY= e.y; - fIsDown= true; - } - - public void mouseUp(MouseEvent e) { - fIsDown= false; - if (!fLiveResize) - resize(e); - } - - public void mouseMove(MouseEvent e) { - if (fIsDown && fLiveResize) - resize(e); - } - - private void resize(MouseEvent e) { - int dx= e.x-fX; - int dy= e.y-fY; - - int centerWidth= fCenter.getSize().x; - - if (fWidth1 + dx > centerWidth && fWidth2 - dx > centerWidth) { - fWidth1+= dx; - fWidth2-= dx; - if ((fDirection & HORIZONTAL) != 0) - fHSplit= (double)fWidth1/(double)(fWidth1+fWidth2); - } - if (fHeight1 + dy > centerWidth && fHeight2 - dy > centerWidth) { - fHeight1+= dy; - fHeight2-= dy; - if ((fDirection & VERTICAL) != 0) - fVSplit= (double)fHeight1/(double)(fHeight1+fHeight2); - } - - fComposite.layout(true); - fControl.getDisplay().update(); - } - } - - /** Style bits for top level composite */ - private int fStyles; - private ResourceBundle fBundle; - private final CompareConfiguration fCompareConfiguration; - private IPropertyChangeListener fPropertyChangeListener; - private ICompareInputChangeListener fCompareInputChangeListener; - private ListenerList fListenerList; - boolean fConfirmSave= true; - - private double fHSplit= -1; // width ratio of left and right panes - private double fVSplit= VSPLIT; // height ratio of ancestor and bottom panes - - private boolean fIsThreeWay; // whether their is an ancestor - private boolean fAncestorVisible; // whether the ancestor pane is visible - private ActionContributionItem fAncestorItem; - - private Action fCopyLeftToRightAction; // copy from left to right - private Action fCopyRightToLeftAction; // copy from right to left - - private boolean fIsLeftDirty; - private boolean fIsRightDirty; - - private CompareHandlerService fHandlerService; - - // SWT widgets - /* package */ Composite fComposite; - private CLabel fAncestorLabel; - private CLabel fLeftLabel; - private CLabel fRightLabel; - /* package */ CLabel fDirectionLabel; - /* package */ Control fCenter; - - //---- SWT resources to be disposed - private Image fRightArrow; - private Image fLeftArrow; - private Image fBothArrow; - Cursor fNormalCursor; - private Cursor fHSashCursor; - private Cursor fVSashCursor; - private Cursor fHVSashCursor; - - private ILabelProviderListener labelChangeListener = new ILabelProviderListener() { - public void labelProviderChanged(LabelProviderChangedEvent event) { - Object[] elements = event.getElements(); - for (int i = 0; i < elements.length; i++) { - Object object = elements[i]; - if (object == getInput()) - updateHeader(); - } - } - }; - - //---- end - - /** - * Creates a new content merge viewer and initializes with a resource bundle and a - * configuration. - * - * @param style SWT style bits - * @param bundle the resource bundle - * @param cc the configuration object - */ - protected ContentMergeViewer(int style, ResourceBundle bundle, CompareConfiguration cc) { - - fStyles= style & ~(SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT); // remove BIDI direction bits - fBundle= bundle; - - fAncestorVisible= Utilities.getBoolean(cc, ICompareUIConstants.PROP_ANCESTOR_VISIBLE, fAncestorVisible); - fConfirmSave= Utilities.getBoolean(cc, CompareEditor.CONFIRM_SAVE_PROPERTY, fConfirmSave); - - setContentProvider(new MergeViewerContentProvider(cc)); - - fCompareInputChangeListener= new ICompareInputChangeListener() { - public void compareInputChanged(ICompareInput input) { - if (input == getInput()) { - handleCompareInputChange(); - } - } - }; - - // Make sure the compare configuration is not null - if (cc == null) - fCompareConfiguration = new CompareConfiguration(); - else - fCompareConfiguration= cc; - fPropertyChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - ContentMergeViewer.this.handlePropertyChangeEvent(event); - } - }; - fCompareConfiguration.addPropertyChangeListener(fPropertyChangeListener); - - fIsLeftDirty = false; - fIsRightDirty = false; - } - - //---- hooks --------------------- - - /** - * Returns the viewer's name. - * - * @return the viewer's name - */ - public String getTitle() { - return Utilities.getString(getResourceBundle(), "title"); //$NON-NLS-1$ - } - - /** - * Creates the SWT controls for the ancestor, left, and right - * content areas of this compare viewer. - * Implementations typically hold onto the controls - * so that they can be initialized with the input objects in method - * <code>updateContent</code>. - * - * @param composite the container for the three areas - */ - abstract protected void createControls(Composite composite); - - /** - * Lays out the ancestor area of the compare viewer. - * It is called whenever the viewer is resized or when the sashes between - * the areas are moved to adjust the size of the areas. - * - * @param x the horizontal position of the ancestor area within its container - * @param y the vertical position of the ancestor area within its container - * @param width the width of the ancestor area - * @param height the height of the ancestor area - */ - abstract protected void handleResizeAncestor(int x, int y, int width, int height); - - /** - * Lays out the left and right areas of the compare viewer. - * It is called whenever the viewer is resized or when the sashes between - * the areas are moved to adjust the size of the areas. - * - * @param x the horizontal position of the left area within its container - * @param y the vertical position of the left and right area within its container - * @param leftWidth the width of the left area - * @param centerWidth the width of the gap between the left and right areas - * @param rightWidth the width of the right area - * @param height the height of the left and right areas - */ - abstract protected void handleResizeLeftRight(int x, int y, int leftWidth, int centerWidth, - int rightWidth, int height); - - /** - * Contributes items to the given <code>ToolBarManager</code>. - * It is called when this viewer is installed in its container and if the container - * has a <code>ToolBarManager</code>. - * The <code>ContentMergeViewer</code> implementation of this method does nothing. - * Subclasses may reimplement. - * - * @param toolBarManager the toolbar manager to contribute to - */ - protected void createToolItems(ToolBarManager toolBarManager) { - // empty implementation - } - - /** - * Initializes the controls of the three content areas with the given input objects. - * - * @param ancestor the input for the ancestor area - * @param left the input for the left area - * @param right the input for the right area - */ - abstract protected void updateContent(Object ancestor, Object left, Object right); - - /** - * Copies the content of one side to the other side. - * Called from the (internal) actions for copying the sides of the viewer's input object. - * - * @param leftToRight if <code>true</code>, the left side is copied to the right side; - * if <code>false</code>, the right side is copied to the left side - */ - abstract protected void copy(boolean leftToRight); - - /** - * Returns the byte contents of the left or right side. If the viewer - * has no editable content <code>null</code> can be returned. - * - * @param left if <code>true</code>, the byte contents of the left area is returned; - * if <code>false</code>, the byte contents of the right area - * @return the content as an array of bytes, or <code>null</code> - */ - abstract protected byte[] getContents(boolean left); - - //---------------------------- - - /** - * Returns the resource bundle of this viewer. - * - * @return the resource bundle - */ - protected ResourceBundle getResourceBundle() { - return fBundle; - } - - /** - * Returns the compare configuration of this viewer, - * or <code>null</code> if this viewer does not yet have a configuration. - * - * @return the compare configuration, or <code>null</code> if none - */ - protected CompareConfiguration getCompareConfiguration() { - return fCompareConfiguration; - } - - /** - * The <code>ContentMergeViewer</code> implementation of this - * <code>ContentViewer</code> method - * checks to ensure that the content provider is an <code>IMergeViewerContentProvider</code>. - * @param contentProvider the content provider to set. Must implement IMergeViewerContentProvider. - */ - public void setContentProvider(IContentProvider contentProvider) { - Assert.isTrue(contentProvider instanceof IMergeViewerContentProvider); - super.setContentProvider(contentProvider); - } - - /* package */ IMergeViewerContentProvider getMergeContentProvider() { - return (IMergeViewerContentProvider) getContentProvider(); - } - - /** - * The <code>ContentMergeViewer</code> implementation of this - * <code>Viewer</code> method returns the empty selection. Subclasses may override. - * @return empty selection. - */ - public ISelection getSelection() { - return new ISelection() { - public boolean isEmpty() { - return true; - } - }; - } - - /** - * The <code>ContentMergeViewer</code> implementation of this - * <code>Viewer</code> method does nothing. Subclasses may reimplement. - * @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean) - */ - public void setSelection(ISelection selection, boolean reveal) { - // empty implementation - } - - /** - * Callback that is invoked when a property in the compare configuration - * ({@link #getCompareConfiguration()} changes. - * @param event the property change event - * @since 3.3 - */ - protected void handlePropertyChangeEvent(PropertyChangeEvent event) { - - String key= event.getProperty(); - - if (key.equals(ICompareUIConstants.PROP_ANCESTOR_VISIBLE)) { - fAncestorVisible= Utilities.getBoolean(getCompareConfiguration(), ICompareUIConstants.PROP_ANCESTOR_VISIBLE, fAncestorVisible); - fComposite.layout(true); - - updateCursor(fLeftLabel, VERTICAL); - updateCursor(fDirectionLabel, HORIZONTAL | VERTICAL); - updateCursor(fRightLabel, VERTICAL); - - return; - } - - if (key.equals(ICompareUIConstants.PROP_IGNORE_ANCESTOR)) { - setAncestorVisibility(false, !Utilities.getBoolean(getCompareConfiguration(), ICompareUIConstants.PROP_IGNORE_ANCESTOR, false)); - return; - } - } - - void updateCursor(Control c, int dir) { - if (!(c instanceof Sash)) { - Cursor cursor= null; - switch (dir) { - case VERTICAL: - if (fAncestorVisible) { - if (fVSashCursor == null) fVSashCursor= new Cursor(c.getDisplay(), SWT.CURSOR_SIZENS); - cursor= fVSashCursor; - } else { - if (fNormalCursor == null) fNormalCursor= new Cursor(c.getDisplay(), SWT.CURSOR_ARROW); - cursor= fNormalCursor; - } - break; - case HORIZONTAL: - if (fHSashCursor == null) fHSashCursor= new Cursor(c.getDisplay(), SWT.CURSOR_SIZEWE); - cursor= fHSashCursor; - break; - case VERTICAL + HORIZONTAL: - if (fAncestorVisible) { - if (fHVSashCursor == null) fHVSashCursor= new Cursor(c.getDisplay(), SWT.CURSOR_SIZEALL); - cursor= fHVSashCursor; - } else { - if (fHSashCursor == null) fHSashCursor= new Cursor(c.getDisplay(), SWT.CURSOR_SIZEWE); - cursor= fHSashCursor; - } - break; - } - if (cursor != null) - c.setCursor(cursor); - } - } - - private void setAncestorVisibility(boolean visible, boolean enabled) { - if (fAncestorItem != null) { - Action action= (Action) fAncestorItem.getAction(); - if (action != null) { - action.setChecked(visible); - action.setEnabled(enabled); - } - } - getCompareConfiguration().setProperty(ICompareUIConstants.PROP_ANCESTOR_VISIBLE, new Boolean(visible)); - } - - //---- input - - /** - * Return whether the input is a three-way comparison. - * @return whether the input is a three-way comparison - * @since 3.3 - */ - protected boolean isThreeWay() { - return fIsThreeWay; - } - - /** - * Internal hook method called when the input to this viewer is - * initially set or subsequently changed. - * <p> - * The <code>ContentMergeViewer</code> implementation of this <code>Viewer</code> - * method tries to save the old input by calling <code>doSave(...)</code> and - * then calls <code>internalRefresh(...)</code>. - * - * @param input the new input of this viewer, or <code>null</code> if there is no new input - * @param oldInput the old input element, or <code>null</code> if there was previously no input - */ - protected final void inputChanged(Object input, Object oldInput) { - - if (input != oldInput && oldInput != null) { - ICompareInputLabelProvider lp = getCompareConfiguration().getLabelProvider(); - if (lp != null) - lp.removeListener(labelChangeListener); - } - - if (input != oldInput && oldInput instanceof ICompareInput) { - ICompareContainer container = getCompareConfiguration().getContainer(); - container.removeCompareInputChangeListener((ICompareInput)oldInput, fCompareInputChangeListener); - } - - boolean success= doSave(input, oldInput); - - if (input != oldInput && input instanceof ICompareInput) { - ICompareContainer container = getCompareConfiguration().getContainer(); - container.addCompareInputChangeListener((ICompareInput)input, fCompareInputChangeListener); - } - - if (input != oldInput && input != null) { - ICompareInputLabelProvider lp = getCompareConfiguration().getLabelProvider(); - if (lp != null) - lp.addListener(labelChangeListener); - } - - if (success) { - setLeftDirty(false); - setRightDirty(false); - } - - if (input != oldInput) - internalRefresh(input); - } - - /** - * This method is called from the <code>Viewer</code> method <code>inputChanged</code> - * to save any unsaved changes of the old input. - * <p> - * The <code>ContentMergeViewer</code> implementation of this - * method calls <code>saveContent(...)</code>. If confirmation has been turned on - * with <code>setConfirmSave(true)</code>, a confirmation alert is posted before saving. - * </p> - * Clients can override this method and are free to decide whether - * they want to call the inherited method. - * @param newInput the new input of this viewer, or <code>null</code> if there is no new input - * @param oldInput the old input element, or <code>null</code> if there was previously no input - * @return <code>true</code> if saving was successful, or if the user didn't want to save (by pressing 'NO' in the confirmation dialog). - * @since 2.0 - */ - protected boolean doSave(Object newInput, Object oldInput) { - - // before setting the new input we have to save the old - if (isLeftDirty() || isRightDirty()) { - - - if (Utilities.RUNNING_TESTS) { - if (Utilities.TESTING_FLUSH_ON_COMPARE_INPUT_CHANGE) { - flushContent(oldInput, null); - } - } else if (fConfirmSave) { - // post alert - Shell shell= fComposite.getShell(); - - MessageDialog dialog= new MessageDialog(shell, - Utilities.getString(getResourceBundle(), "saveDialog.title"), //$NON-NLS-1$ - null, // accept the default window icon - Utilities.getString(getResourceBundle(), "saveDialog.message"), //$NON-NLS-1$ - MessageDialog.QUESTION, - new String[] { - IDialogConstants.YES_LABEL, - IDialogConstants.NO_LABEL, - }, - 0); // default button index - - switch (dialog.open()) { // open returns index of pressed button - case 0: - flushContent(oldInput, null); - break; - case 1: - setLeftDirty(false); - setRightDirty(false); - break; - case 2: - throw new ViewerSwitchingCancelled(); - } - } else - flushContent(oldInput, null); - return true; - } - return false; - } - - /** - * Controls whether <code>doSave(Object, Object)</code> asks for confirmation before saving - * the old input with <code>saveContent(Object)</code>. - * @param enable a value of <code>true</code> enables confirmation - * @since 2.0 - */ - public void setConfirmSave(boolean enable) { - fConfirmSave= enable; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.Viewer#refresh() - */ - public void refresh() { - internalRefresh(getInput()); - } - - private void internalRefresh(Object input) { - - IMergeViewerContentProvider content= getMergeContentProvider(); - if (content != null) { - Object ancestor= content.getAncestorContent(input); - boolean oldFlag = fIsThreeWay; - if (Utilities.isHunk(input)) { - fIsThreeWay = true; - } else if (input instanceof ICompareInput) - fIsThreeWay= (((ICompareInput)input).getKind() & Differencer.DIRECTION_MASK) != 0; - else - fIsThreeWay= ancestor != null; - - if (fAncestorItem != null) - fAncestorItem.setVisible(fIsThreeWay); - - if (fAncestorVisible && oldFlag != fIsThreeWay) - fComposite.layout(true); - - - Object left= content.getLeftContent(input); - Object right= content.getRightContent(input); - updateContent(ancestor, left, right); - - updateHeader(); - if (Utilities.okToUse(fComposite) && Utilities.okToUse(fComposite.getParent())) { - ToolBarManager tbm = (ToolBarManager) getToolBarManager(fComposite.getParent()); - if (tbm != null ) { - updateToolItems(); - tbm.update(true); - tbm.getControl().getParent().layout(true); - } - } - } - } - - //---- layout & SWT control creation - - /** - * Builds the SWT controls for the three areas of a compare/merge viewer. - * <p> - * Calls the hooks <code>createControls</code> and <code>createToolItems</code> - * to let subclasses build the specific content areas and to add items to - * an enclosing toolbar. - * <p> - * This method must only be called in the constructor of subclasses. - * - * @param parent the parent control - * @return the new control - */ - protected final Control buildControl(Composite parent) { - - fComposite= new Composite(parent, fStyles | SWT.LEFT_TO_RIGHT) { // we force a specific direction - public boolean setFocus() { - return ContentMergeViewer.this.handleSetFocus(); - } - }; - fComposite.setData(CompareUI.COMPARE_VIEWER_TITLE, getTitle()); - - hookControl(fComposite); // hook help & dispose listener - - fComposite.setLayout(new ContentMergeViewerLayout()); - - int style= SWT.SHADOW_OUT; - fAncestorLabel= new CLabel(fComposite, style | Window.getDefaultOrientation()); - - fLeftLabel= new CLabel(fComposite, style | Window.getDefaultOrientation()); - new Resizer(fLeftLabel, VERTICAL); - - fDirectionLabel= new CLabel(fComposite, style); - fDirectionLabel.setAlignment(SWT.CENTER); - new Resizer(fDirectionLabel, HORIZONTAL | VERTICAL); - - fRightLabel= new CLabel(fComposite, style | Window.getDefaultOrientation()); - new Resizer(fRightLabel, VERTICAL); - - if (fCenter == null || fCenter.isDisposed()) - fCenter= createCenterControl(fComposite); - - createControls(fComposite); - - fHandlerService= CompareHandlerService.createFor(getCompareConfiguration().getContainer(), fComposite.getShell()); - - initializeToolbars(parent); - - return fComposite; - } - - /** - * Returns the toolbar manager for this viewer. - * - * Subclasses may extend this method and use either the toolbar manager - * provided by the inherited method by calling - * super.getToolBarManager(parent) or provide an alternate toolbar manager. - * - * @param parent - * a <code>Composite</code> or <code>null</code> - * @return a <code>IToolBarManager</code> - * @since 3.4 - */ - protected IToolBarManager getToolBarManager(Composite parent) { - return CompareViewerPane.getToolBarManager(parent); - } - - private void initializeToolbars(Composite parent) { - ToolBarManager tbm = (ToolBarManager) getToolBarManager(parent); - if (tbm != null) { - tbm.removeAll(); - - // define groups - tbm.add(new Separator("modes")); //$NON-NLS-1$ - tbm.add(new Separator("merge")); //$NON-NLS-1$ - tbm.add(new Separator("navigation")); //$NON-NLS-1$ - - CompareConfiguration cc= getCompareConfiguration(); - - if (cc.isRightEditable()) { - fCopyLeftToRightAction= - new Action() { - public void run() { - copy(true); - } - }; - Utilities.initAction(fCopyLeftToRightAction, getResourceBundle(), "action.CopyLeftToRight."); //$NON-NLS-1$ - tbm.appendToGroup("merge", fCopyLeftToRightAction); //$NON-NLS-1$ - fHandlerService.registerAction(fCopyLeftToRightAction, "org.eclipse.compare.copyAllLeftToRight"); //$NON-NLS-1$ - } - - if (cc.isLeftEditable()) { - fCopyRightToLeftAction= - new Action() { - public void run() { - copy(false); - } - }; - Utilities.initAction(fCopyRightToLeftAction, getResourceBundle(), "action.CopyRightToLeft."); //$NON-NLS-1$ - tbm.appendToGroup("merge", fCopyRightToLeftAction); //$NON-NLS-1$ - fHandlerService.registerAction(fCopyRightToLeftAction, "org.eclipse.compare.copyAllRightToLeft"); //$NON-NLS-1$ - } - - final ChangePropertyAction a= new ChangePropertyAction(fBundle, getCompareConfiguration(), "action.EnableAncestor.", ICompareUIConstants.PROP_ANCESTOR_VISIBLE); //$NON-NLS-1$ - a.setChecked(fAncestorVisible); - fAncestorItem= new ActionContributionItem(a); - fAncestorItem.setVisible(false); - tbm.appendToGroup("modes", fAncestorItem); //$NON-NLS-1$ - tbm.getControl().addDisposeListener(a); - - createToolItems(tbm); - updateToolItems(); - - tbm.update(true); - } - } - - /** - * Callback that is invoked when the control of this merge viewer is given focus. - * This method should return <code>true</code> if a particular widget was given focus - * and false otherwise. By default, <code>false</code> is returned. Subclasses may override. - * @return whether particular widget was given focus - * @since 3.3 - */ - protected boolean handleSetFocus() { - return false; - } - - /** - * Return the desired width of the center control. This width is used - * to calculate the values used to layout the ancestor, left and right sides. - * @return the desired width of the center control - * @see #handleResizeLeftRight(int, int, int, int, int, int) - * @see #handleResizeAncestor(int, int, int, int) - * @since 3.3 - */ - protected int getCenterWidth() { - return 3; - } - - /** - * Return whether the ancestor pane is visible or not. - * @return whether the ancestor pane is visible or not - * @since 3.3 - */ - protected boolean isAncestorVisible() { - return fAncestorVisible; - } - - /** - * Create the control that divides the left and right sides of the merge viewer. - * @param parent the parent composite - * @return the center control - * @since 3.3 - */ - protected Control createCenterControl(Composite parent) { - Sash sash= new Sash(parent, SWT.VERTICAL); - new Resizer(sash, HORIZONTAL); - return sash; - } - - /** - * Return the center control that divides the left and right sides of the merge viewer. - * This method returns the control that was created by calling {@link #createCenterControl(Composite)}. - * @see #createCenterControl(Composite) - * @return the center control - * @since 3.3 - */ - protected Control getCenterControl() { - return fCenter; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.Viewer#getControl() - */ - public Control getControl() { - return fComposite; - } - - /** - * Called on the viewer disposal. - * Unregisters from the compare configuration. - * Clients may extend if they have to do additional cleanup. - * @see org.eclipse.jface.viewers.ContentViewer#handleDispose(org.eclipse.swt.events.DisposeEvent) - */ - protected void handleDispose(DisposeEvent event) { - - if (fHandlerService != null) - fHandlerService.dispose(); - - Object input= getInput(); - if (input instanceof ICompareInput) { - ICompareContainer container = getCompareConfiguration().getContainer(); - container.removeCompareInputChangeListener((ICompareInput)input, fCompareInputChangeListener); - } - if (input != null) { - ICompareInputLabelProvider lp = getCompareConfiguration().getLabelProvider(); - if (lp != null) - lp.removeListener(labelChangeListener); - } - - if (fPropertyChangeListener != null) { - fCompareConfiguration.removePropertyChangeListener(fPropertyChangeListener); - fPropertyChangeListener= null; - } - - fAncestorLabel= null; - fLeftLabel= null; - fDirectionLabel= null; - fRightLabel= null; - fCenter= null; - - if (fRightArrow != null) { - fRightArrow.dispose(); - fRightArrow= null; - } - if (fLeftArrow != null) { - fLeftArrow.dispose(); - fLeftArrow= null; - } - if (fBothArrow != null) { - fBothArrow.dispose(); - fBothArrow= null; - } - - if (fNormalCursor != null) { - fNormalCursor.dispose(); - fNormalCursor= null; - } - if (fHSashCursor != null) { - fHSashCursor.dispose(); - fHSashCursor= null; - } - if (fVSashCursor != null) { - fVSashCursor.dispose(); - fVSashCursor= null; - } - if (fHVSashCursor != null) { - fHVSashCursor.dispose(); - fHVSashCursor= null; - } - - super.handleDispose(event); - } - - /** - * Updates the enabled state of the toolbar items. - * <p> - * This method is called whenever the state of the items needs updating. - * <p> - * Subclasses may extend this method, although this is generally not required. - */ - protected void updateToolItems() { - - IMergeViewerContentProvider content= getMergeContentProvider(); - - Object input= getInput(); - - if (fCopyLeftToRightAction != null) { - boolean enable= content.isRightEditable(input); -// if (enable && input instanceof ICompareInput) { -// ITypedElement e= ((ICompareInput) input).getLeft(); -// if (e == null) -// enable= false; -// } - fCopyLeftToRightAction.setEnabled(enable); - } - - if (fCopyRightToLeftAction != null) { - boolean enable= content.isLeftEditable(input); -// if (enable && input instanceof ICompareInput) { -// ITypedElement e= ((ICompareInput) input).getRight(); -// if (e == null) -// enable= false; -// } - fCopyRightToLeftAction.setEnabled(enable); - } - } - - /** - * Updates the headers of the three areas - * by querying the content provider for a name and image for - * the three sides of the input object. - * <p> - * This method is called whenever the header must be updated. - * <p> - * Subclasses may extend this method, although this is generally not required. - */ - protected void updateHeader() { - - IMergeViewerContentProvider content= getMergeContentProvider(); - Object input= getInput(); - - // Only change a label if there is a new label available - if (fAncestorLabel != null) { - Image ancestorImage = content.getAncestorImage(input); - if (ancestorImage != null) - fAncestorLabel.setImage(ancestorImage); - String ancestorLabel = content.getAncestorLabel(input); - if (ancestorLabel != null) - fAncestorLabel.setText(LegacyActionTools.escapeMnemonics(TextProcessor.process(ancestorLabel))); - } - if (fLeftLabel != null) { - Image leftImage = content.getLeftImage(input); - if (leftImage != null) - fLeftLabel.setImage(leftImage); - String leftLabel = content.getLeftLabel(input); - if (leftLabel != null) - fLeftLabel.setText(LegacyActionTools.escapeMnemonics(leftLabel)); - } - if (fRightLabel != null) { - Image rightImage = content.getRightImage(input); - if (rightImage != null) - fRightLabel.setImage(rightImage); - String rightLabel = content.getRightLabel(input); - if (rightLabel != null) - fRightLabel.setText(LegacyActionTools.escapeMnemonics(rightLabel)); - } - } - - /* - * Calculates the height of the header. - */ - /* package */ int getHeaderHeight() { - int headerHeight= fLeftLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).y; - headerHeight= Math.max(headerHeight, fDirectionLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).y); - return headerHeight; - } - - //---- dirty state & saving state - - /* (non-Javadoc) - * @see org.eclipse.compare.IPropertyChangeNotifier#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener) - */ - public void addPropertyChangeListener(IPropertyChangeListener listener) { - if (fListenerList == null) - fListenerList= new ListenerList(); - fListenerList.add(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IPropertyChangeNotifier#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener) - */ - public void removePropertyChangeListener(IPropertyChangeListener listener) { - if (fListenerList != null) { - fListenerList.remove(listener); - if (fListenerList.isEmpty()) - fListenerList= null; - } - } - - private void fireDirtyState(boolean state) { - Utilities.firePropertyChange(fListenerList, this, CompareEditorInput.DIRTY_STATE, null, new Boolean(state)); - } - - /** - * Sets the dirty state of the left side of this viewer. - * If the new value differs from the old - * all registered listener are notified with - * a <code>PropertyChangeEvent</code> with the - * property name <code>CompareEditorInput.DIRTY_STATE</code>. - * - * @param dirty the state of the left side dirty flag - */ - protected void setLeftDirty(boolean dirty) { - if (isLeftDirty() != dirty) { - fIsLeftDirty = dirty; - // Always fire the event if the dirty state has changed - fireDirtyState(dirty); - } - } - - /** - * Sets the dirty state of the right side of this viewer. - * If the new value differs from the old - * all registered listener are notified with - * a <code>PropertyChangeEvent</code> with the - * property name <code>CompareEditorInput.DIRTY_STATE</code>. - * - * @param dirty the state of the right side dirty flag - */ - protected void setRightDirty(boolean dirty) { - if (isRightDirty() != dirty) { - fIsRightDirty = dirty; - // Always fire the event if the dirty state has changed - fireDirtyState(dirty); - } - } - - /** - * Method from the old internal <code>ISavable</code> interface - * Save the viewers's content. - * Note: this method is for internal use only. Clients should not call this method. - * @param monitor a progress monitor - * @throws CoreException - * @deprecated use {@link IFlushable#flush(IProgressMonitor)}. - */ - public void save(IProgressMonitor monitor) throws CoreException { - flush(monitor); - } - - /** - * Flush any modifications made in the viewer into the compare input. This method - * calls {@link #flushContent(Object, IProgressMonitor)} with the compare input - * of the viewer as the first parameter. - * @param monitor a progress monitor - * @see org.eclipse.compare.contentmergeviewer.IFlushable#flush(org.eclipse.core.runtime.IProgressMonitor) - * @since 3.3 - */ - public final void flush(IProgressMonitor monitor) { - flushContent(getInput(), monitor); - } - - /** - * Flush the modified content back to input elements via the content provider. - * The provided input may be the current input of the viewer or it may be - * the previous input (i.e. this method may be called to flush modified content - * during an input change). - * @param input the compare input - * @param monitor a progress monitor or <code>null</code> if the method - * was call from a place where a progress monitor was not available. - * @since 3.3 - */ - protected void flushContent(Object input, IProgressMonitor monitor) { - flushLeftSide(input, monitor); - flushRightSide(input, monitor); - } - - - void flushLeftSide(Object input, IProgressMonitor monitor) { - IMergeViewerContentProvider content = (IMergeViewerContentProvider) getContentProvider(); - - boolean rightEmpty = content.getRightContent(input) == null; - - if (getCompareConfiguration().isLeftEditable() && isLeftDirty()) { - byte[] bytes = getContents(true); - if (rightEmpty && bytes != null && bytes.length == 0) - bytes = null; - setLeftDirty(false); - content.saveLeftContent(input, bytes); - } - } - - void flushRightSide(Object input, IProgressMonitor monitor) { - IMergeViewerContentProvider content = (IMergeViewerContentProvider) getContentProvider(); - - boolean leftEmpty = content.getLeftContent(input) == null; - - if (getCompareConfiguration().isRightEditable() && isRightDirty()) { - byte[] bytes = getContents(false); - if (leftEmpty && bytes != null && bytes.length == 0) - bytes = null; - setRightDirty(false); - content.saveRightContent(input, bytes); - } - } - - /** - * @param monitor - * @noreference This method is not intended to be referenced by clients. - */ - public void flushLeft(IProgressMonitor monitor) { - flushLeftSide(getInput(), monitor); - } - - /** - * @param monitor - * @noreference This method is not intended to be referenced by clients. - */ - public void flushRight(IProgressMonitor monitor) { - flushRightSide(getInput(), monitor); - } - - /** - * Return the dirty state of the right side of this viewer. - * @return the dirty state of the right side of this viewer - * @since 3.3 - */ - protected boolean isRightDirty() { - return fIsRightDirty; - } - - /** - * @return the dirty state of the right side of this viewer - * @since 3.7 - * @noreference This method is not intended to be referenced by clients. - */ - public boolean internalIsRightDirty() { - return isRightDirty(); - } - - /** - * Return the dirty state of the left side of this viewer. - * @return the dirty state of the left side of this viewer - * @since 3.3 - */ - protected boolean isLeftDirty() { - return fIsLeftDirty; - } - - /** - * @return the dirty state of the left side of this viewer - * @since 3.7 - * @noreference This method is not intended to be referenced by clients. - */ - public boolean internalIsLeftDirty() { - return isLeftDirty(); - } - - /** - * Handle a change to the given input reported from an {@link org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener}. - * This class registers a listener with its input and reports any change events through - * this method. By default, this method prompts for any unsaved changes and then refreshes - * the viewer. Subclasses may override. - * @since 3.3 - */ - protected void handleCompareInputChange() { - // before setting the new input we have to save the old - Object input = getInput(); - if (!isSaving() && (isLeftDirty() || isRightDirty())) { - - if (Utilities.RUNNING_TESTS) { - if (Utilities.TESTING_FLUSH_ON_COMPARE_INPUT_CHANGE) { - flushContent(input, null); - } - } else { - // post alert - Shell shell= fComposite.getShell(); - - MessageDialog dialog= new MessageDialog(shell, - CompareMessages.ContentMergeViewer_resource_changed_title, - null, // accept the default window icon - CompareMessages.ContentMergeViewer_resource_changed_description, - MessageDialog.QUESTION, - new String[] { - IDialogConstants.YES_LABEL, // 0 - IDialogConstants.NO_LABEL, // 1 - }, - 0); // default button index - - switch (dialog.open()) { // open returns index of pressed button - case 0: - flushContent(input, null); - break; - case 1: - setLeftDirty(false); - setRightDirty(false); - break; - } - } - } - refresh(); - } - - CompareHandlerService getCompareHandlerService() { - return fHandlerService; - } - - /** - * @return true if any of the Saveables is being saved - */ - private boolean isSaving() { - ICompareContainer container = fCompareConfiguration.getContainer(); - ISaveablesSource source = null; - if (container instanceof ISaveablesSource) { - source = (ISaveablesSource) container; - } else { - IWorkbenchPart part = container.getWorkbenchPart(); - if (part instanceof ISaveablesSource) { - source = (ISaveablesSource) part; - } - } - if (source != null) { - Saveable[] saveables = source.getSaveables(); - for (int i = 0; i < saveables.length; i++) { - if (saveables[i] instanceof ISavingSaveable) { - ISavingSaveable saveable = (ISavingSaveable) saveables[i]; - if (saveable.isSaving()) - return true; - } - } - } - return false; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IDocumentRange.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IDocumentRange.java deleted file mode 100644 index f682388a2..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IDocumentRange.java +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.contentmergeviewer; - -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.IDocument; - - -/** - * Defines a subrange in a document. - * <p> - * It is used by text viewers that can work on a subrange of a document. For example, - * a text viewer for Java compilation units might use this to restrict the view - * to a single method. - * </p> - * <p> - * Clients may implement this interface. - * </p> - * - * @see TextMergeViewer - * @see org.eclipse.compare.structuremergeviewer.DocumentRangeNode - */ -public interface IDocumentRange { - - /** - * The position category typically used for an <code>IDocumentRange</code> position - * (value <code>"DocumentRangeCategory"</code>). - * @since 2.0 - */ - public static final String RANGE_CATEGORY= "DocumentRangeCategory"; //$NON-NLS-1$ - - /** - * Returns the underlying document. - * - * @return the underlying document - */ - IDocument getDocument(); - - /** - * Returns a position that specifies a subrange in the underlying document, - * or <code>null</code> if this document range spans the whole underlying document. - * - * @return a position that specifies a subrange in the underlying document, or <code>null</code> - */ - Position getRange(); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IFlushable.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IFlushable.java deleted file mode 100644 index 440d31ef5..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IFlushable.java +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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.contentmergeviewer; - -import org.eclipse.compare.IEditableContent; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.text.IDocument; - -/** - * Interface which provides the ability to flush the contents from the viewer - * model (for example, an {@link IDocument} for text based content) into the - * underlying compare model ( most likely an instance of {@link IEditableContent}). - * <p> - * This interface may be implemented by clients. - * </p> - * - * @since 3.3 - */ -public interface IFlushable { - - /** - * Request that the view contents be flushed to the underlying compare input. - * Depending on the type of input, this may result in the contents being written - * into the underlying model (e.g. file) as well. - * @param monitor a progress monitor or <code>null</code> if progress reporting is not desired - */ - void flush(IProgressMonitor monitor); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IMergeViewerContentProvider.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IMergeViewerContentProvider.java deleted file mode 100644 index 86222edd7..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IMergeViewerContentProvider.java +++ /dev/null @@ -1,155 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.contentmergeviewer; - -import org.eclipse.swt.graphics.Image; -import org.eclipse.jface.viewers.IContentProvider; - - -/** - * A content provider that mediates between a <code>ContentMergeViewer</code>'s model - * and the viewer itself. - * <p> - * Clients may implement this interface. - * </p> - * - * @see ContentMergeViewer - */ -public interface IMergeViewerContentProvider extends IContentProvider { - - //---- ancestor side - - /** - * Returns the label for the ancestor side of a <code>ContentMergeViewer</code>. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @return the label for the ancestor side of a <code>ContentMergeViewer</code> - */ - String getAncestorLabel(Object input); - - /** - * Returns an optional image for the ancestor side of a <code>ContentMergeViewer</code>. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @return the image for the ancestor side of a <code>ContentMergeViewer</code>, - * or <code>null</code> if none - */ - Image getAncestorImage(Object input); - - /** - * Returns the contents for the ancestor side of a <code>ContentMergeViewer</code>. - * The interpretation of the returned object depends on the concrete <code>ContentMergeViewer</code>. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @return the content for the ancestor side of a <code>ContentMergeViewer</code>, - * or <code>null</code> if none - */ - Object getAncestorContent(Object input); - - /** - * Returns whether the ancestor side of the given input element should be shown. - * @param input the merge viewer's input - * @return <code>true</code> if the ancestor side of the given input element should be shown - */ - boolean showAncestor(Object input); - - //---- left side - - /** - * Returns the label for the left side of a <code>ContentMergeViewer</code>. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @return the label for the left side of a <code>ContentMergeViewer</code> - */ - String getLeftLabel(Object input); - - /** - * Returns an optional image for the left side of a <code>ContentMergeViewer</code>. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @return the image for the left side of a <code>ContentMergeViewer</code>, - * or <code>null</code> if none - */ - Image getLeftImage(Object input); - - /** - * Returns the contents for the left side of a <code>ContentMergeViewer</code>. - * The interpretation of the returned object depends on the concrete <code>ContentMergeViewer</code>. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @return the content for the left side of a <code>ContentMergeViewer</code>, - * or <code>null</code> if none - */ - Object getLeftContent(Object input); - - /** - * Returns whether the left side is editable. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @return <code>true</code> if the left side of a <code>ContentMergeViewer</code> is editable - */ - boolean isLeftEditable(Object input); - - /** - * Saves new contents for the left side of the <code>ContentMergeViewer</code>. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @param bytes the new contents to save for the left side - */ - void saveLeftContent(Object input, byte[] bytes); - - //---- right side - - /** - * Returns the label for the right side of a <code>ContentMergeViewer</code>. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @return the label for the right side of a <code>ContentMergeViewer</code> - */ - String getRightLabel(Object input); - - /** - * Returns an optional image for the right side of a <code>ContentMergeViewer</code>. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @return the image for the right side of a <code>ContentMergeViewer</code>, - * or <code>null</code> if none - */ - Image getRightImage(Object input); - - /** - * Returns the contents for the right side of a <code>ContentMergeViewer</code>. - * The interpretation of the returned object depends on the concrete <code>ContentMergeViewer</code>. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @return the content for the right side of a <code>ContentMergeViewer</code>, - * or <code>null</code> if none - */ - Object getRightContent(Object input); - - /** - * Returns whether the right side is editable. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @return <code>true</code> if the right side of a <code>ContentMergeViewer</code> is editable - */ - boolean isRightEditable(Object input); - - /** - * Saves new contents for the right side of the <code>ContentMergeViewer</code>. - * - * @param input the input object of the <code>ContentMergeViewer</code> - * @param bytes the new contents to save for the right side - */ - void saveRightContent(Object input, byte[] bytes); -} - - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ITokenComparator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ITokenComparator.java deleted file mode 100644 index 08815e449..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ITokenComparator.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.contentmergeviewer; - -import org.eclipse.compare.rangedifferencer.IRangeComparator; - - -/** - * For performing a so-called "token compare" on a line of text. - * This interface extends the <code>IRangeComparator</code> interface - * so that it can be used by the <code>TextMergeViewer</code>. - * <p> - * <code>TextMergeViewer</code> activates the token compare when navigating into - * a range of differing lines. At first the lines are selected as a block. - * When navigating into this block the token compare shows for every line - * the differing token by selecting them. - * <p> - * <code>TextMergeViewer</code>'s default token comparator works on characters separated - * by whitespace. If a different strategy is needed (for example, to use Java tokens in - * a Java-aware merge viewer), clients may create their own token - * comparators by implementing this interface (and overriding the - * <code>TextMergeViewer.createTokenComparator</code> factory method). - * </p> - * - * @see TextMergeViewer - */ -public interface ITokenComparator extends IRangeComparator { - - /** - * Returns the start character position of the token with the given index. - * If the index is out of range (but not negative) the character position - * behind the last character (the length of the input string) is returned. - * - * @param index index of the token for which to return the start position - * @return the start position of the token with the given index - * @throws java.lang.IndexOutOfBoundsException if index is negative - */ - int getTokenStart(int index); - - /** - * Returns the character length of the token with the given index. - * If the index is out of range (but not negative) the value 0 is returned. - * - * @param index index of the token for which to return the start position - * @return the character length of the token with the given index - * @throws java.lang.IndexOutOfBoundsException if index is negative - */ - int getTokenLength(int index); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java deleted file mode 100644 index 77dd1a511..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java +++ /dev/null @@ -1,5327 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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 - * channingwalton@mac.com - curved line code - * gilles.querret@free.fr - fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=72995 - * Max Weninger (max.weninger@windriver.com) - Bug 131895 [Edit] Undo in compare - * Max Weninger (max.weninger@windriver.com) - Bug 72936 [Viewers] Show line numbers in comparision - * Matt McCutchen (hashproduct+eclipse@gmail.com) - Bug 178968 [Viewers] Lines scrambled and different font size in compare - * Matt McCutchen (hashproduct+eclipse@gmail.com) - Bug 191524 [Viewers] Synchronize horizontal scrolling by # characters, not % of longest line - * Stephan Herrmann (stephan@cs.tu-berlin.de) - Bug 291695: Element compare fails to use source range - *******************************************************************************/ -package org.eclipse.compare.contentmergeviewer; - -import java.io.UnsupportedEncodingException; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.ResourceBundle; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareNavigator; -import org.eclipse.compare.CompareUI; -import org.eclipse.compare.ICompareNavigator; -import org.eclipse.compare.IEditableContentExtension; -import org.eclipse.compare.IEncodedStreamContentAccessor; -import org.eclipse.compare.INavigatable; -import org.eclipse.compare.ISharedDocumentAdapter; -import org.eclipse.compare.IStreamContentAccessor; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.SharedDocumentAdapter; -import org.eclipse.compare.internal.BufferedCanvas; -import org.eclipse.compare.internal.ChangePropertyAction; -import org.eclipse.compare.internal.CompareEditor; -import org.eclipse.compare.internal.CompareEditorSelectionProvider; -import org.eclipse.compare.internal.CompareHandlerService; -import org.eclipse.compare.internal.CompareMessages; -import org.eclipse.compare.internal.ComparePreferencePage; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.DocumentManager; -import org.eclipse.compare.internal.ICompareContextIds; -import org.eclipse.compare.internal.ICompareUIConstants; -import org.eclipse.compare.internal.IMergeViewerTestAdapter; -import org.eclipse.compare.internal.MergeSourceViewer; -import org.eclipse.compare.internal.MergeViewerContentProvider; -import org.eclipse.compare.internal.NavigationEndDialog; -import org.eclipse.compare.internal.OutlineViewerCreator; -import org.eclipse.compare.internal.ShowWhitespaceAction; -import org.eclipse.compare.internal.TextEditorPropertyAction; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.internal.merge.DocumentMerger; -import org.eclipse.compare.internal.merge.DocumentMerger.Diff; -import org.eclipse.compare.internal.merge.DocumentMerger.IDocumentMergerInput; -import org.eclipse.compare.patch.IHunk; -import org.eclipse.compare.rangedifferencer.RangeDifference; -import org.eclipse.compare.structuremergeviewer.DiffNode; -import org.eclipse.compare.structuremergeviewer.DocumentRangeNode; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.compare.structuremergeviewer.IDiffContainer; -import org.eclipse.compare.structuremergeviewer.IDiffElement; -import org.eclipse.core.commands.operations.IOperationHistoryListener; -import org.eclipse.core.commands.operations.IUndoableOperation; -import org.eclipse.core.commands.operations.OperationHistoryEvent; -import org.eclipse.core.commands.operations.OperationHistoryFactory; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.ActionContributionItem; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.action.ToolBarManager; -import org.eclipse.jface.dialogs.ErrorDialog; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.preference.PreferenceConverter; -import org.eclipse.jface.resource.ColorRegistry; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.BadPositionCategoryException; -import org.eclipse.jface.text.CursorLinePainter; -import org.eclipse.jface.text.DefaultPositionUpdater; -import org.eclipse.jface.text.Document; -import org.eclipse.jface.text.DocumentEvent; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IDocumentExtension3; -import org.eclipse.jface.text.IDocumentListener; -import org.eclipse.jface.text.IDocumentPartitioner; -import org.eclipse.jface.text.IFindReplaceTarget; -import org.eclipse.jface.text.IPositionUpdater; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.IRewriteTarget; -import org.eclipse.jface.text.ITextPresentationListener; -import org.eclipse.jface.text.ITextViewer; -import org.eclipse.jface.text.IViewportListener; -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.Region; -import org.eclipse.jface.text.TextPresentation; -import org.eclipse.jface.text.TextViewer; -import org.eclipse.jface.text.source.CompositeRuler; -import org.eclipse.jface.text.source.ISourceViewer; -import org.eclipse.jface.text.source.SourceViewer; -import org.eclipse.jface.text.source.SourceViewerConfiguration; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.util.Util; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.window.Window; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.accessibility.AccessibleAdapter; -import org.eclipse.swt.accessibility.AccessibleEvent; -import org.eclipse.swt.custom.LineBackgroundEvent; -import org.eclipse.swt.custom.LineBackgroundListener; -import org.eclipse.swt.custom.StyleRange; -import org.eclipse.swt.custom.StyledText; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.FocusAdapter; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.KeyAdapter; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseMoveListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.VerifyEvent; -import org.eclipse.swt.events.VerifyListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.ScrollBar; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.TypedListener; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IEditorSite; -import org.eclipse.ui.IKeyBindingService; -import org.eclipse.ui.IPropertyListener; -import org.eclipse.ui.IWorkbenchCommandConstants; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.IWorkbenchPartSite; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.actions.ActionFactory; -import org.eclipse.ui.contexts.IContextService; -import org.eclipse.ui.editors.text.EditorsUI; -import org.eclipse.ui.editors.text.IEncodingSupport; -import org.eclipse.ui.editors.text.IStorageDocumentProvider; -import org.eclipse.ui.progress.UIJob; -import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants; -import org.eclipse.ui.texteditor.AbstractTextEditor; -import org.eclipse.ui.texteditor.ChainedPreferenceStore; -import org.eclipse.ui.texteditor.ChangeEncodingAction; -import org.eclipse.ui.texteditor.FindReplaceAction; -import org.eclipse.ui.texteditor.GotoLineAction; -import org.eclipse.ui.texteditor.IDocumentProvider; -import org.eclipse.ui.texteditor.IDocumentProviderExtension; -import org.eclipse.ui.texteditor.IElementStateListener; -import org.eclipse.ui.texteditor.ITextEditor; -import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; -import org.eclipse.ui.texteditor.SourceViewerDecorationSupport; - -import com.ibm.icu.text.MessageFormat; - -/** - * A text merge viewer uses the <code>RangeDifferencer</code> to perform a - * textual, line-by-line comparison of two (or three) input documents. - * It is based on the <code>ContentMergeViewer</code> and uses <code>TextViewer</code>s - * to implement the ancestor, left, and right content areas. - * <p> - * In the three-way compare case ranges of differing lines are highlighted and framed - * with different colors to show whether the difference is an incoming, outgoing, or conflicting change. - * The <code>TextMergeViewer</code> supports the notion of a current "differing range" - * and provides toolbar buttons to navigate from one range to the next (or previous). - * <p> - * If there is a current "differing range" and the underlying document is editable - * the <code>TextMergeViewer</code> enables actions in context menu and toolbar to - * copy a range from one side to the other side, thereby performing a merge operation. - * <p> - * In addition to a line-by-line comparison the <code>TextMergeViewer</code> - * uses a token based compare on differing lines. - * The token compare is activated when navigating into - * a range of differing lines. At first the lines are selected as a block. - * When navigating into this block the token compare shows for every line - * the differing token by selecting them. - * <p> - * The <code>TextMergeViewer</code>'s default token compare works on characters separated - * by whitespace. If a different strategy is needed (for example, Java tokens in - * a Java-aware merge viewer), clients can create their own token - * comparators by implementing the <code>ITokenComparator</code> interface and overriding the - * <code>TextMergeViewer.createTokenComparator</code> factory method). - * <p> - * Access to the <code>TextMergeViewer</code>'s model is by means of an - * <code>IMergeViewerContentProvider</code>. Its <code>get<it>X</it></code>Content</code> methods must return - * either an <code>IDocument</code>, an <code>IDocumentRange</code>, or an <code>IStreamContentAccessor</code>. - * In the <code>IDocumentRange</code> case the <code>TextMergeViewer</code> - * works on a subrange of a document. In the <code>IStreamContentAccessor</code> case - * a document is created internally and initialized from the stream. - * <p> - * A <code>TextMergeViewer</code> can be used as is. However clients may subclass - * to customize the behavior. For example a <code>MergeTextViewer</code> for Java would override - * the <code>configureTextViewer</code> method to configure the <code>TextViewer</code> for Java source code, - * the <code>createTokenComparator</code> method to create a Java specific tokenizer. - * <p> - * In 3.5 a new API has been introduced to let clients provide their own source - * viewers implementation with an option to configure them basing on a - * corresponding editor input. - * - * @see org.eclipse.compare.rangedifferencer.RangeDifferencer - * @see org.eclipse.jface.text.TextViewer - * @see ITokenComparator - * @see IDocumentRange - * @see org.eclipse.compare.IStreamContentAccessor - */ -public class TextMergeViewer extends ContentMergeViewer implements IAdaptable { - - private static final String COPY_LEFT_TO_RIGHT_INDICATOR = ">"; //$NON-NLS-1$ - private static final String COPY_RIGHT_TO_LEFT_INDICATOR = "<"; //$NON-NLS-1$ - private static final char ANCESTOR_CONTRIBUTOR = MergeViewerContentProvider.ANCESTOR_CONTRIBUTOR; - private static final char RIGHT_CONTRIBUTOR = MergeViewerContentProvider.RIGHT_CONTRIBUTOR; - private static final char LEFT_CONTRIBUTOR = MergeViewerContentProvider.LEFT_CONTRIBUTOR; - - private static final String DIFF_RANGE_CATEGORY = CompareUIPlugin.PLUGIN_ID + ".DIFF_RANGE_CATEGORY"; //$NON-NLS-1$ - - static final boolean DEBUG= false; - - private static final boolean FIX_47640= true; - - private static final String[] GLOBAL_ACTIONS= { - ActionFactory.UNDO.getId(), - ActionFactory.REDO.getId(), - ActionFactory.CUT.getId(), - ActionFactory.COPY.getId(), - ActionFactory.PASTE.getId(), - ActionFactory.DELETE.getId(), - ActionFactory.SELECT_ALL.getId(), - ActionFactory.FIND.getId(), - ITextEditorActionDefinitionIds.LINE_GOTO - }; - private static final String[] TEXT_ACTIONS= { - MergeSourceViewer.UNDO_ID, - MergeSourceViewer.REDO_ID, - MergeSourceViewer.CUT_ID, - MergeSourceViewer.COPY_ID, - MergeSourceViewer.PASTE_ID, - MergeSourceViewer.DELETE_ID, - MergeSourceViewer.SELECT_ALL_ID, - MergeSourceViewer.FIND_ID, - MergeSourceViewer.GOTO_LINE_ID - }; - - private static final String BUNDLE_NAME= "org.eclipse.compare.contentmergeviewer.TextMergeViewerResources"; //$NON-NLS-1$ - - // the following symbolic constants must match the IDs in Compare's plugin.xml - private static final String INCOMING_COLOR= "INCOMING_COLOR"; //$NON-NLS-1$ - private static final String OUTGOING_COLOR= "OUTGOING_COLOR"; //$NON-NLS-1$ - private static final String CONFLICTING_COLOR= "CONFLICTING_COLOR"; //$NON-NLS-1$ - private static final String RESOLVED_COLOR= "RESOLVED_COLOR"; //$NON-NLS-1$ - - // constants - /** Width of left and right vertical bar */ - private static final int MARGIN_WIDTH= 6; - /** Width of center bar */ - private static final int CENTER_WIDTH= 34; - /** Width of birds eye view */ - private static final int BIRDS_EYE_VIEW_WIDTH= 12; - /** Width of birds eye view */ - private static final int BIRDS_EYE_VIEW_INSET= 2; - /** */ - private static final int RESOLVE_SIZE= 5; - - /** line width of change borders */ - private static final int LW= 1; - - // determines whether a change between left and right is considered incoming or outgoing - private boolean fLeftIsLocal; - private boolean fShowCurrentOnly= false; - private boolean fShowCurrentOnly2= false; - private int fMarginWidth= MARGIN_WIDTH; - private int fTopInset; - - // Colors - private RGB fBackground; - private RGB fForeground; - - private boolean fIsUsingSystemForeground= true; - private boolean fIsUsingSystemBackground= true; - - private RGB SELECTED_INCOMING; - private RGB INCOMING; - private RGB INCOMING_FILL; - private RGB INCOMING_TEXT_FILL; - - private RGB SELECTED_CONFLICT; - private RGB CONFLICT; - private RGB CONFLICT_FILL; - private RGB CONFLICT_TEXT_FILL; - - private RGB SELECTED_OUTGOING; - private RGB OUTGOING; - private RGB OUTGOING_FILL; - private RGB OUTGOING_TEXT_FILL; - - private RGB RESOLVED; - - private IPreferenceStore fPreferenceStore; - private IPropertyChangeListener fPreferenceChangeListener; - - private HashMap fNewAncestorRanges= new HashMap(); - private HashMap fNewLeftRanges= new HashMap(); - private HashMap fNewRightRanges= new HashMap(); - - private MergeSourceViewer fAncestor; - private MergeSourceViewer fLeft; - private MergeSourceViewer fRight; - - private int fLeftLineCount; - private int fRightLineCount; - - private boolean fInScrolling; - - private int fPts[]= new int[8]; // scratch area for polygon drawing - - private int fInheritedDirection; // inherited direction - private int fTextDirection; // requested direction for embedded SourceViewer - - private ActionContributionItem fIgnoreAncestorItem; - private boolean fHighlightRanges; - - private boolean fShowPseudoConflicts= false; - - private boolean fUseSplines= true; - private boolean fUseSingleLine= true; - private boolean fUseResolveUI= true; - private boolean fHighlightTokenChanges = false; - - private String fSymbolicFontName; - - private ActionContributionItem fNextDiff; // goto next difference - private ActionContributionItem fPreviousDiff; // goto previous difference - private ActionContributionItem fCopyDiffLeftToRightItem; - private ActionContributionItem fCopyDiffRightToLeftItem; - - private CompareHandlerService fHandlerService; - - private boolean fSynchronizedScrolling= true; - - private MergeSourceViewer fFocusPart; - - private boolean fSubDoc= true; - private IPositionUpdater fPositionUpdater; - private boolean fIsMotif; - private boolean fIsCarbon; - private boolean fIsMac; - - private boolean fHasErrors; - - - // SWT widgets - private BufferedCanvas fAncestorCanvas; - private BufferedCanvas fLeftCanvas; - private BufferedCanvas fRightCanvas; - private Canvas fScrollCanvas; - private ScrollBar fVScrollBar; - private Canvas fBirdsEyeCanvas; - private Canvas fSummaryHeader; - private HeaderPainter fHeaderPainter; - - // SWT resources to be disposed - private Map fColors; - private Cursor fBirdsEyeCursor; - - // points for center curves - private double[] fBasicCenterCurve; - - private Button fCenterButton; - private Diff fButtonDiff; - - private ContributorInfo fLeftContributor; - private ContributorInfo fRightContributor; - private ContributorInfo fAncestorContributor; - private int isRefreshing = 0; - private int fSynchronziedScrollPosition; - private ActionContributionItem fNextChange; - private ActionContributionItem fPreviousChange; - private ShowWhitespaceAction showWhitespaceAction; - private InternalOutlineViewerCreator fOutlineViewerCreator; - private TextEditorPropertyAction toggleLineNumbersAction; - private IFindReplaceTarget fFindReplaceTarget; - private ChangePropertyAction fIgnoreWhitespace; - private DocumentMerger fMerger; - /** The current diff */ - private Diff fCurrentDiff; - - // Bug 259362 - Update diffs after undo - private boolean copyOperationInProgress = false; - private IUndoableOperation copyUndoable = null; - private IOperationHistoryListener operationHistoryListener; - - /** - * Preference key for highlighting current line. - */ - private final static String CURRENT_LINE= AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE; - /** - * Preference key for highlight color of current line. - */ - private final static String CURRENT_LINE_COLOR= AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR; - - private List fSourceViewerDecorationSupport = new ArrayList(3); - // whether enhanced viewer configuration has been done - private boolean isConfigured = false; - private boolean fRedoDiff = false; - - private final class InternalOutlineViewerCreator extends OutlineViewerCreator implements ISelectionChangedListener { - public Viewer findStructureViewer(Viewer oldViewer, - ICompareInput input, Composite parent, - CompareConfiguration configuration) { - if (input != getInput()) - return null; - final Viewer v = CompareUI.findStructureViewer(oldViewer, input, parent, configuration); - if (v != null) { - v.getControl().addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - v.removeSelectionChangedListener(InternalOutlineViewerCreator.this); - } - }); - v.addSelectionChangedListener(this); - } - - return v; - } - - public boolean hasViewerFor(Object input) { - return true; - } - - public void selectionChanged(SelectionChangedEvent event) { - ISelection s = event.getSelection(); - if (s instanceof IStructuredSelection) { - IStructuredSelection ss = (IStructuredSelection) s; - Object element = ss.getFirstElement(); - Diff diff = findDiff(element); - if (diff != null) - setCurrentDiff(diff, true); - } - } - - private Diff findDiff(Object element) { - if (element instanceof ICompareInput) { - ICompareInput ci = (ICompareInput) element; - Position p = getPosition(ci.getLeft()); - if (p != null) - return findDiff(p, true); - p = getPosition(ci.getRight()); - if (p != null) - return findDiff(p, false); - } - return null; - } - - private Diff findDiff(Position p, boolean left) { - for (Iterator iterator = fMerger.rangesIterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - Position diffPos; - if (left) { - diffPos = diff.getPosition(LEFT_CONTRIBUTOR); - } else { - diffPos = diff.getPosition(RIGHT_CONTRIBUTOR); - } - // If the element falls within a diff, highlight that diff - if (diffPos.offset + diffPos.length >= p.offset && diff.getKind() != RangeDifference.NOCHANGE) - return diff; - // Otherwise, highlight the first diff after the elements position - if (diffPos.offset >= p.offset) - return diff; - } - return null; - } - - private Position getPosition(ITypedElement left) { - if (left instanceof DocumentRangeNode) { - DocumentRangeNode drn = (DocumentRangeNode) left; - return drn.getRange(); - } - return null; - } - - public Object getInput() { - return TextMergeViewer.this.getInput(); - } - } - - class ContributorInfo implements IElementStateListener, VerifyListener, IDocumentListener, IEncodingSupport { - private final TextMergeViewer fViewer; - private final Object fElement; - private char fLeg; - private String fEncoding; - private IDocumentProvider fDocumentProvider; - private IEditorInput fDocumentKey; - private ISelection fSelection; - private int fTopIndex = -1; - private boolean fNeedsValidation = false; - private MergeSourceViewer fSourceViewer; - - public ContributorInfo(TextMergeViewer viewer, Object element, char leg) { - fViewer = viewer; - fElement = element; - fLeg = leg; - if (fElement instanceof IEncodedStreamContentAccessor) { - try { - fEncoding = ((IEncodedStreamContentAccessor)fElement).getCharset(); - } catch (CoreException e) { - // silently ignored - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.editors.text.IEncodingSupport#setEncoding(java.lang.String) - */ - public void setEncoding(String encoding) { - if (fDocumentKey == null || fDocumentProvider == null) { - return; - } - if (fDocumentProvider instanceof IStorageDocumentProvider) { - IStorageDocumentProvider provider = (IStorageDocumentProvider) fDocumentProvider; - String current = provider.getEncoding(fDocumentKey); - boolean dirty = fDocumentProvider.canSaveDocument(fDocumentKey); - if (!dirty) { - String internal = encoding == null ? "" : encoding; //$NON-NLS-1$ - if (!internal.equals(current)) { - provider.setEncoding(fDocumentKey, encoding); - try { - fDocumentProvider.resetDocument(fDocumentKey); - } catch (CoreException e) { - CompareUIPlugin.log(e); - } finally { - update(true); - updateStructure(fLeg); - } - } - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.editors.text.IEncodingSupport#getEncoding() - */ - public String getEncoding() { - if (fDocumentProvider != null && fDocumentKey != null - && fDocumentProvider instanceof IStorageDocumentProvider) { - IStorageDocumentProvider provider = (IStorageDocumentProvider) fDocumentProvider; - return provider.getEncoding(fDocumentKey); - } - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.editors.text.IEncodingSupport#getDefaultEncoding() - */ - public String getDefaultEncoding() { - if (fDocumentProvider != null && fDocumentKey != null - && fDocumentProvider instanceof IStorageDocumentProvider) { - IStorageDocumentProvider provider = (IStorageDocumentProvider) fDocumentProvider; - return provider.getDefaultEncoding(); - } - return null; - } - - private String internalGetEncoding() { - if (fElement instanceof IEncodedStreamContentAccessor) { - try { - fEncoding = ((IEncodedStreamContentAccessor) fElement) - .getCharset(); - } catch (CoreException e) { - // silently ignored - } - } - if (fEncoding != null) { - return fEncoding; - } - return ResourcesPlugin.getEncoding(); - } - - public void setEncodingIfAbsent(ContributorInfo otherContributor) { - if (fEncoding == null) - fEncoding = otherContributor.fEncoding; - } - - public IDocument getDocument() { - if (fDocumentProvider != null) { - IDocument document = fDocumentProvider.getDocument(getDocumentKey()); - if (document != null) - return document; - } - if (fElement instanceof IDocument) - return (IDocument) fElement; - if (fElement instanceof IDocumentRange) - return ((IDocumentRange) fElement).getDocument(); - if (fElement instanceof IStreamContentAccessor) - return DocumentManager.get(fElement); - return null; - } - - public void setDocument(MergeSourceViewer viewer, boolean isEditable) { - // Ensure that this method is only called once - Assert.isTrue(fSourceViewer == null); - fSourceViewer = viewer; - try { - internalSetDocument(viewer); - } catch (RuntimeException e) { - // The error may be due to a stale entry in the DocumentManager (see bug 184489) - clearCachedDocument(); - throw e; - } - setEditable(viewer.getSourceViewer(), isEditable); - // Verify changes if the document is editable - if (isEditable) { - fNeedsValidation = true; - viewer.getSourceViewer().getTextWidget().addVerifyListener(this); - } - } - - /* - * Returns true if a new Document could be installed. - */ - private boolean internalSetDocument(MergeSourceViewer tp) { - - if (tp == null) - return false; - - IDocument newDocument = null; - Position range= null; - - if (fElement instanceof IDocumentRange) { - newDocument= ((IDocumentRange)fElement).getDocument(); - range= ((IDocumentRange)fElement).getRange(); - connectToSharedDocument(); - - } else if (fElement instanceof IDocument) { - newDocument= (IDocument) fElement; - - } else if (fElement instanceof IStreamContentAccessor) { - newDocument= DocumentManager.get(fElement); - if (newDocument == null) { - newDocument = createDocument(); - DocumentManager.put(fElement, newDocument); - setupDocument(newDocument); - } else if (fDocumentProvider == null) { - // Connect to a shared document so we can get the proper save synchronization - connectToSharedDocument(); - } - } else if (fElement == null) { // deletion on one side - - ITypedElement parent= this.fViewer.getParent(fLeg); // we try to find an insertion position within the deletion's parent - - if (parent instanceof IDocumentRange) { - newDocument= ((IDocumentRange)parent).getDocument(); - newDocument.addPositionCategory(DIFF_RANGE_CATEGORY); - Object input= this.fViewer.getInput(); - range= this.fViewer.getNewRange(fLeg, input); - if (range == null) { - int pos= 0; - if (input instanceof ICompareInput) - pos= this.fViewer.findInsertionPosition(fLeg, (ICompareInput)input); - range= new Position(pos, 0); - try { - newDocument.addPosition(DIFF_RANGE_CATEGORY, range); - } catch (BadPositionCategoryException ex) { - // silently ignored - if (TextMergeViewer.DEBUG) System.out.println("BadPositionCategoryException: " + ex); //$NON-NLS-1$ - } catch (BadLocationException ex) { - // silently ignored - if (TextMergeViewer.DEBUG) System.out.println("BadLocationException: " + ex); //$NON-NLS-1$ - } - this.fViewer.addNewRange(fLeg, input, range); - } - } else if (parent instanceof IDocument) { - newDocument= ((IDocumentRange)fElement).getDocument(); - } - } - - boolean enabled= true; - if (newDocument == null) { - newDocument= new Document(""); //$NON-NLS-1$ - enabled= false; - } - - // Update the viewer document or range - IDocument oldDoc= tp.getSourceViewer().getDocument(); - if (newDocument != oldDoc) { - updateViewerDocument(tp, newDocument, range); - } else { // same document but different range - updateViewerDocumentRange(tp, range); - } - newDocument.addDocumentListener(this); - - tp.setEnabled(enabled); - - return enabled; - } - - /* - * The viewer document is the same but the range has changed - */ - private void updateViewerDocumentRange(MergeSourceViewer tp, Position range) { - tp.setRegion(range); - if (this.fViewer.fSubDoc) { - if (range != null) { - IRegion r= this.fViewer.normalizeDocumentRegion(tp.getSourceViewer().getDocument(), TextMergeViewer.toRegion(range)); - tp.getSourceViewer().setVisibleRegion(r.getOffset(), r.getLength()); - } else - tp.getSourceViewer().resetVisibleRegion(); - } else - tp.getSourceViewer().resetVisibleRegion(); - } - - /* - * The viewer has a new document - */ - private void updateViewerDocument(MergeSourceViewer tp, IDocument document, Position range) { - unsetDocument(tp); - if (document == null) - return; - - connectPositionUpdater(document); - - // install new document - tp.setRegion(range); - if (this.fViewer.fSubDoc) { - if (range != null) { - IRegion r= this.fViewer.normalizeDocumentRegion(document, TextMergeViewer.toRegion(range)); - tp.getSourceViewer().setDocument(document, r.getOffset(), r.getLength()); - } else - tp.getSourceViewer().setDocument(document); - } else - tp.getSourceViewer().setDocument(document); - - tp.rememberDocument(document); - } - - void connectPositionUpdater(IDocument document) { - document.addPositionCategory(DIFF_RANGE_CATEGORY); - if (this.fViewer.fPositionUpdater == null) - this.fViewer.fPositionUpdater= this.fViewer.new ChildPositionUpdater(DIFF_RANGE_CATEGORY); - else - document.removePositionUpdater(this.fViewer.fPositionUpdater); - document.addPositionUpdater(this.fViewer.fPositionUpdater); - } - - private void unsetDocument(MergeSourceViewer tp) { - IDocument oldDoc= internalGetDocument(tp); - if (oldDoc != null) { - tp.rememberDocument(null); - try { - oldDoc.removePositionCategory(DIFF_RANGE_CATEGORY); - } catch (BadPositionCategoryException ex) { - // Ignore - } - if (fPositionUpdater != null) - oldDoc.removePositionUpdater(fPositionUpdater); - oldDoc.removeDocumentListener(this); - } - } - - private IDocument createDocument() { - // If the content provider is a text content provider, attempt to obtain - // a shared document (i.e. file buffer) - IDocument newDoc = connectToSharedDocument(); - - if (newDoc == null) { - IStreamContentAccessor sca= (IStreamContentAccessor) fElement; - String s= null; - - try { - String encoding = internalGetEncoding(); - s = Utilities.readString(sca, encoding); - } catch (CoreException ex) { - this.fViewer.setError(fLeg, ex.getMessage()); - } - - newDoc= new Document(s != null ? s : ""); //$NON-NLS-1$ - } - return newDoc; - } - - /** - * Connect to a shared document if possible. Return <code>null</code> - * if the connection was not possible. - * @return the shared document or <code>null</code> if connection to a - * shared document was not possible - */ - private IDocument connectToSharedDocument() { - IEditorInput key = getDocumentKey(); - if (key != null) { - if (fDocumentProvider != null) { - // We've already connected and setup the document - return fDocumentProvider.getDocument(key); - } - IDocumentProvider documentProvider = getDocumentProvider(); - if (documentProvider != null) { - try { - connect(documentProvider, key); - setCachedDocumentProvider(key, - documentProvider); - IDocument newDoc = documentProvider.getDocument(key); - this.fViewer.updateDirtyState(key, documentProvider, fLeg); - return newDoc; - } catch (CoreException e) { - // Connection failed. Log the error and continue without a shared document - CompareUIPlugin.log(e); - } - } - } - return null; - } - - private void connect(IDocumentProvider documentProvider, IEditorInput input) throws CoreException { - final ISharedDocumentAdapter sda = (ISharedDocumentAdapter) Utilities.getAdapter(fElement, ISharedDocumentAdapter.class); - if (sda != null) { - sda.connect(documentProvider, input); - } else { - documentProvider.connect(input); - } - } - - private void disconnect(IDocumentProvider provider, IEditorInput input) { - final ISharedDocumentAdapter sda = (ISharedDocumentAdapter) Utilities.getAdapter(fElement, ISharedDocumentAdapter.class); - if (sda != null) { - sda.disconnect(provider, input); - } else { - provider.disconnect(input); - } - } - - private void setCachedDocumentProvider(IEditorInput key, - IDocumentProvider documentProvider) { - fDocumentKey = key; - fDocumentProvider = documentProvider; - documentProvider.addElementStateListener(this); - } - - public void disconnect() { - IDocumentProvider provider = null; - IEditorInput input = getDocumentKey(); - synchronized(this) { - if (fDocumentProvider != null) { - provider = fDocumentProvider; - fDocumentProvider = null; - fDocumentKey = null; - } - } - if (provider != null) { - disconnect(provider, input); - provider.removeElementStateListener(this); - } - // If we have a listener registered with the widget, remove it - if (fSourceViewer != null && !fSourceViewer.getSourceViewer().getTextWidget().isDisposed()) { - if (fNeedsValidation) { - fSourceViewer.getSourceViewer().getTextWidget().removeVerifyListener(this); - fNeedsValidation = false; - } - IDocument oldDoc= internalGetDocument(fSourceViewer); - if (oldDoc != null) { - oldDoc.removeDocumentListener(this); - } - } - clearCachedDocument(); - } - - private void clearCachedDocument() { - // Finally, remove the document from the document manager - IDocument doc = DocumentManager.get(fElement); - if (doc != null) - DocumentManager.remove(doc); - } - - private IDocument internalGetDocument(MergeSourceViewer tp) { - IDocument oldDoc= tp.getSourceViewer().getDocument(); - if (oldDoc == null) { - oldDoc= tp.getRememberedDocument(); - } - return oldDoc; - } - - /** - * Return the document key used to obtain a shared document. A <code>null</code> - * is returned in the following cases: - * <ol> - * <li>This contributor does not have a shared document adapter.</li> - * <li>This text merge viewer has a document partitioner but uses the default partitioning.</li> - * <li>This text merge viewer does not use he default content provider.</li> - * </ol> - * @return the document key used to obtain a shared document or <code>null</code> - */ - private IEditorInput getDocumentKey() { - if (fDocumentKey != null) - return fDocumentKey; - if (isUsingDefaultContentProvider() && fElement != null && canHaveSharedDocument()) { - ISharedDocumentAdapter sda = (ISharedDocumentAdapter)Utilities.getAdapter(fElement, ISharedDocumentAdapter.class, true); - if (sda != null) { - return sda.getDocumentKey(fElement); - } - } - return null; - } - - private IDocumentProvider getDocumentProvider() { - if (fDocumentProvider != null) - return fDocumentProvider; - // We will only use document providers if the content provider is the - // default content provider - if (isUsingDefaultContentProvider()) { - IEditorInput input = getDocumentKey(); - if (input != null) - return SharedDocumentAdapter.getDocumentProvider(input); - } - return null; - } - - private boolean isUsingDefaultContentProvider() { - return fViewer.isUsingDefaultContentProvider(); - } - - private boolean canHaveSharedDocument() { - return fViewer.canHaveSharedDocument(); - } - - boolean hasSharedDocument(Object object) { - return (fElement == object && - fDocumentProvider != null - && fDocumentProvider.getDocument(getDocumentKey()) != null); - } - - public boolean flush() throws CoreException { - if (fDocumentProvider != null) { - IEditorInput input = getDocumentKey(); - IDocument document = fDocumentProvider.getDocument(input); - if (document != null) { - final ISharedDocumentAdapter sda = (ISharedDocumentAdapter) Utilities.getAdapter(fElement, ISharedDocumentAdapter.class); - if (sda != null) { - sda.flushDocument(fDocumentProvider, input, document, false); - return true; - } - try { - fDocumentProvider.aboutToChange(input); - fDocumentProvider.saveDocument(new NullProgressMonitor(), input, document, false); - return true; - } finally { - fDocumentProvider.changed(input); - } - } - } - return false; - } - - public void elementMoved(Object originalElement, Object movedElement) { - IEditorInput input = getDocumentKey(); - if (input != null && input.equals(originalElement)) { - // This method will only get called if the buffer is not dirty - resetDocument(); - } - } - public void elementDirtyStateChanged(Object element, boolean isDirty) { - if (!checkState()) - return; - IEditorInput input = getDocumentKey(); - if (input != null && input.equals(element)) { - this.fViewer.updateDirtyState(input, getDocumentProvider(), fLeg); - } - } - - public void elementDeleted(Object element) { - IEditorInput input = getDocumentKey(); - if (input != null && input.equals(element)) { - // This method will only get called if the buffer is not dirty - resetDocument(); - } - } - private void resetDocument() { - // Need to remove the document from the manager before refreshing - // or the old document will still be found - clearCachedDocument(); - // TODO: This is fine for now but may need to be revisited if a refresh is performed - // higher up as well (e.g. perhaps a refresh request that waits until after all parties - // have been notified). - if (checkState()) - fViewer.refresh(); - } - - private boolean checkState() { - if (fViewer == null) - return false; - Control control = fViewer.getControl(); - if (control == null) - return false; - return !control.isDisposed(); - } - - public void elementContentReplaced(Object element) { - if (!checkState()) - return; - IEditorInput input = getDocumentKey(); - if (input != null && input.equals(element)) { - this.fViewer.updateDirtyState(input, getDocumentProvider(), fLeg); - - // recalculate diffs and update controls - new UIJob(CompareMessages.DocumentMerger_0) { - public IStatus runInUIThread(IProgressMonitor monitor) { - update(true); - updateStructure(fLeg); - return Status.OK_STATUS; - } - }.schedule(); - } - } - public void elementContentAboutToBeReplaced(Object element) { - // Nothing to do - } - - public Object getElement() { - return fElement; - } - - public void cacheSelection(MergeSourceViewer viewer) { - if (viewer == null) { - this.fSelection = null; - this.fTopIndex = -1; - } else { - this.fSelection = viewer.getSourceViewer().getSelection(); - this.fTopIndex = viewer.getSourceViewer().getTopIndex(); - } - } - - public void updateSelection(MergeSourceViewer viewer, boolean includeScroll) { - if (fSelection != null) - viewer.getSourceViewer().setSelection(fSelection); - if (includeScroll && fTopIndex != -1) { - viewer.getSourceViewer().setTopIndex(fTopIndex); - } - } - - public void transferContributorStateFrom( - ContributorInfo oldContributor) { - if (oldContributor != null) { - fSelection = oldContributor.fSelection; - fTopIndex = oldContributor.fTopIndex; - fEncoding = oldContributor.fEncoding; - } - - } - - public boolean validateChange() { - if (fElement == null) - return true; - if (fDocumentProvider instanceof IDocumentProviderExtension) { - IDocumentProviderExtension ext = (IDocumentProviderExtension)fDocumentProvider; - if (ext.isReadOnly(fDocumentKey)) { - try { - ext.validateState(fDocumentKey, getControl().getShell()); - ext.updateStateCache(fDocumentKey); - } catch (CoreException e) { - ErrorDialog.openError(getControl().getShell(), CompareMessages.TextMergeViewer_12, CompareMessages.TextMergeViewer_13, e.getStatus()); - return false; - } - } - return !ext.isReadOnly(fDocumentKey); - } - IEditableContentExtension ext = (IEditableContentExtension)Utilities.getAdapter(fElement, IEditableContentExtension.class); - if (ext != null) { - if (ext.isReadOnly()) { - IStatus status = ext.validateEdit(getControl().getShell()); - if (!status.isOK()) { - if (status.getSeverity() == IStatus.ERROR) { - ErrorDialog.openError(getControl().getShell(), CompareMessages.TextMergeViewer_14, CompareMessages.TextMergeViewer_15, status); - return false; - } - if (status.getSeverity() == IStatus.CANCEL) - return false; - } - } - } - return true; - } - - /* (non-Javadoc) - * @see org.eclipse.swt.events.VerifyListener#verifyText(org.eclipse.swt.events.VerifyEvent) - */ - public void verifyText(VerifyEvent e) { - if (!validateChange()) { - e.doit= false; - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent) - */ - public void documentAboutToBeChanged(DocumentEvent e) { - // nothing to do - } - - /* (non-Javadoc) - * @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent) - */ - public void documentChanged(DocumentEvent e) { - boolean dirty = true; - if (fDocumentProvider != null && fDocumentKey != null) { - dirty = fDocumentProvider.canSaveDocument(fDocumentKey); - } - TextMergeViewer.this.documentChanged(e, dirty); - // Remove our verify listener since the document is now dirty - if (fNeedsValidation && fSourceViewer != null && !fSourceViewer.getSourceViewer().getTextWidget().isDisposed()) { - fSourceViewer.getSourceViewer().getTextWidget().removeVerifyListener(this); - fNeedsValidation = false; - } - } - } - - class HeaderPainter implements PaintListener { - - private static final int INSET= BIRDS_EYE_VIEW_INSET; - - private RGB fIndicatorColor; - private Color fSeparatorColor; - - public HeaderPainter() { - fSeparatorColor= fSummaryHeader.getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); - } - - /* - * Returns true on color change - */ - public boolean setColor(RGB color) { - RGB oldColor= fIndicatorColor; - fIndicatorColor= color; - if (color == null) - return oldColor != null; - if (oldColor != null) - return !color.equals(oldColor); - return true; - } - - private void drawBevelRect(GC gc, int x, int y, int w, int h, Color topLeft, Color bottomRight) { - gc.setForeground(topLeft); - gc.drawLine(x, y, x + w -1, y); - gc.drawLine(x, y, x, y + h -1); - - gc.setForeground(bottomRight); - gc.drawLine(x + w, y, x + w, y + h); - gc.drawLine(x, y + h, x + w, y + h); - } - - public void paintControl(PaintEvent e) { - - Point s= fSummaryHeader.getSize(); - - if (fIndicatorColor != null) { - Display d= fSummaryHeader.getDisplay(); - e.gc.setBackground(getColor(d, fIndicatorColor)); - int min= Math.min(s.x, s.y)-2*INSET; - Rectangle r= new Rectangle((s.x-min)/2, (s.y-min)/2, min, min); - e.gc.fillRectangle(r); - if (d != null) - drawBevelRect(e.gc, r.x, r.y, r.width -1, r.height -1, d.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW), d.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW)); - - e.gc.setForeground(fSeparatorColor); - e.gc.setLineWidth(0 /* 1 */); - e.gc.drawLine(0+1, s.y-1, s.x-1-1, s.y-1); - } - } - } - - /* - * The position updater used to adapt the positions representing - * the child document ranges to changes of the parent document. - */ - class ChildPositionUpdater extends DefaultPositionUpdater { - - /* - * Creates the position updated. - */ - protected ChildPositionUpdater(String category) { - super(category); - } - - /* - * Child document ranges cannot be deleted other then by calling - * freeChildDocument. - */ - protected boolean notDeleted() { - return true; - } - - /* - * If an insertion happens at a child document's start offset, the - * position is extended rather than shifted. Also, if something is added - * right behind the end of the position, the position is extended rather - * than kept stable. - */ - protected void adaptToInsert() { - - if (fPosition == fLeft.getRegion() || fPosition == fRight.getRegion()) { - int myStart= fPosition.offset; - int myEnd= fPosition.offset + fPosition.length; - myEnd= Math.max(myStart, myEnd); - - int yoursStart= fOffset; - int yoursEnd= fOffset + fReplaceLength -1; - yoursEnd= Math.max(yoursStart, yoursEnd); - - if (myEnd < yoursStart) - return; - - if (myStart <= yoursStart) - fPosition.length += fReplaceLength; - else - fPosition.offset += fReplaceLength; - } else { - super.adaptToInsert(); - } - } - } - - private class ChangeHighlighter implements ITextPresentationListener { - - private final MergeSourceViewer viewer; - - public ChangeHighlighter(MergeSourceViewer viewer) { - this.viewer = viewer; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.text.ITextPresentationListener#applyTextPresentation(org.eclipse.jface.text.TextPresentation) - */ - public void applyTextPresentation(TextPresentation textPresentation) { - if (!fHighlightTokenChanges) - return; - IRegion region= textPresentation.getExtent(); - Diff[] changeDiffs = fMerger.getChangeDiffs(getLeg(viewer), region); - for (int i = 0; i < changeDiffs.length; i++) { - Diff diff = changeDiffs[i]; - StyleRange range = getStyleRange(diff, region); - if (range != null) - textPresentation.mergeStyleRange(range); - } - } - - private StyleRange getStyleRange(Diff diff, IRegion region) { - //Color cText = getColor(null, getTextColor()); - Color cTextFill = getColor(null, getTextFillColor(diff)); - if (cTextFill == null) - return null; - Position p = diff.getPosition(getLeg(viewer)); - int start = p.getOffset(); - int length = p.getLength(); - // Don't start before the region - if (start < region.getOffset()) { - length = length - (region.getOffset() - start); - start = region.getOffset(); - } - // Don't go past the end of the region - int regionEnd = region.getOffset() + region.getLength(); - if (start + length > regionEnd) { - length = regionEnd - start; - } - if (length < 0) - return null; - - return new StyleRange(start, length, null, cTextFill); - } - - private RGB getTextFillColor(Diff diff) { - if (isThreeWay() && !isIgnoreAncestor()) { - switch (diff.getKind()) { - case RangeDifference.RIGHT: - if (fLeftIsLocal) - return INCOMING_TEXT_FILL; - return OUTGOING_TEXT_FILL; - case RangeDifference.ANCESTOR: - return CONFLICT_TEXT_FILL; - case RangeDifference.LEFT: - if (fLeftIsLocal) - return OUTGOING_TEXT_FILL; - return INCOMING_TEXT_FILL; - case RangeDifference.CONFLICT: - return CONFLICT_TEXT_FILL; - } - return null; - } - return OUTGOING_TEXT_FILL; - } - - } - - private class FindReplaceTarget implements IFindReplaceTarget { - - public boolean canPerformFind() { - return fFocusPart != null; - } - - public int findAndSelect(int widgetOffset, String findString, - boolean searchForward, boolean caseSensitive, boolean wholeWord) { - return fFocusPart.getSourceViewer().getFindReplaceTarget().findAndSelect(widgetOffset, findString, searchForward, caseSensitive, wholeWord); - } - - public Point getSelection() { - return fFocusPart.getSourceViewer().getFindReplaceTarget().getSelection(); - } - - public String getSelectionText() { - return fFocusPart.getSourceViewer().getFindReplaceTarget().getSelectionText(); - } - - public boolean isEditable() { - return fFocusPart.getSourceViewer().getFindReplaceTarget().isEditable(); - } - - public void replaceSelection(String text) { - fFocusPart.getSourceViewer().getFindReplaceTarget().replaceSelection(text); - } - - } - - //---- MergeTextViewer - - /** - * Creates a text merge viewer under the given parent control. - * - * @param parent the parent control - * @param configuration the configuration object - */ - public TextMergeViewer(Composite parent, CompareConfiguration configuration) { - this(parent, SWT.NULL, configuration); - } - - /** - * Creates a text merge viewer under the given parent control. - * - * @param parent the parent control - * @param style SWT style bits for top level composite of this viewer - * @param configuration the configuration object - */ - public TextMergeViewer(Composite parent, int style, CompareConfiguration configuration) { - super(style, ResourceBundle.getBundle(BUNDLE_NAME), configuration); - - operationHistoryListener = new IOperationHistoryListener() { - public void historyNotification(OperationHistoryEvent event) { - TextMergeViewer.this.historyNotification(event); - } - }; - OperationHistoryFactory.getOperationHistory() - .addOperationHistoryListener(operationHistoryListener); - - fMerger = new DocumentMerger(new IDocumentMergerInput() { - public ITokenComparator createTokenComparator(String line) { - return TextMergeViewer.this.createTokenComparator(line); - } - public CompareConfiguration getCompareConfiguration() { - return TextMergeViewer.this.getCompareConfiguration(); - } - public IDocument getDocument(char contributor) { - switch (contributor) { - case LEFT_CONTRIBUTOR: - return fLeft.getSourceViewer().getDocument(); - case RIGHT_CONTRIBUTOR: - return fRight.getSourceViewer().getDocument(); - case ANCESTOR_CONTRIBUTOR: - return fAncestor.getSourceViewer().getDocument(); - } - return null; - } - public int getHunkStart() { - return TextMergeViewer.this.getHunkStart(); - } - public Position getRegion(char contributor) { - switch (contributor) { - case LEFT_CONTRIBUTOR: - return fLeft.getRegion(); - case RIGHT_CONTRIBUTOR: - return fRight.getRegion(); - case ANCESTOR_CONTRIBUTOR: - return fAncestor.getRegion(); - } - return null; - } - public boolean isHunkOnLeft() { - ITypedElement left = ((ICompareInput)getInput()).getRight(); - return left != null && Utilities.getAdapter(left, IHunk.class) != null; - } - public boolean isIgnoreAncestor() { - return TextMergeViewer.this.isIgnoreAncestor(); - } - public boolean isPatchHunk() { - return TextMergeViewer.this.isPatchHunk(); - } - - public boolean isShowPseudoConflicts() { - return fShowPseudoConflicts; - } - public boolean isThreeWay() { - return TextMergeViewer.this.isThreeWay(); - } - public boolean isPatchHunkOk() { - return TextMergeViewer.this.isPatchHunkOk(); - } - - }); - - int inheritedStyle= parent.getStyle(); - if ((inheritedStyle & SWT.LEFT_TO_RIGHT) != 0) - fInheritedDirection= SWT.LEFT_TO_RIGHT; - else if ((inheritedStyle & SWT.RIGHT_TO_LEFT) != 0) - fInheritedDirection= SWT.RIGHT_TO_LEFT; - else - fInheritedDirection= SWT.NONE; - - if ((style & SWT.LEFT_TO_RIGHT) != 0) - fTextDirection= SWT.LEFT_TO_RIGHT; - else if ((style & SWT.RIGHT_TO_LEFT) != 0) - fTextDirection= SWT.RIGHT_TO_LEFT; - else - fTextDirection= SWT.NONE; - - fSymbolicFontName= getSymbolicFontName(); - - fIsMotif= Util.isMotif(); - fIsCarbon= Util.isCarbon(); - fIsMac= Util.isMac(); - - if (fIsMotif) - fMarginWidth= 0; - - fPreferenceChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - TextMergeViewer.this.handlePropertyChangeEvent(event); - } - }; - - fPreferenceStore= createChainedPreferenceStore(); - if (fPreferenceStore != null) { - fPreferenceStore.addPropertyChangeListener(fPreferenceChangeListener); - - fLeftIsLocal= Utilities.getBoolean(getCompareConfiguration(), "LEFT_IS_LOCAL", false); //$NON-NLS-1$ - fSynchronizedScrolling= fPreferenceStore.getBoolean(ComparePreferencePage.SYNCHRONIZE_SCROLLING); - fShowPseudoConflicts= fPreferenceStore.getBoolean(ComparePreferencePage.SHOW_PSEUDO_CONFLICTS); - //fUseSplines= fPreferenceStore.getBoolean(ComparePreferencePage.USE_SPLINES); - fUseSingleLine= fPreferenceStore.getBoolean(ComparePreferencePage.USE_SINGLE_LINE); - fHighlightTokenChanges= fPreferenceStore.getBoolean(ComparePreferencePage.HIGHLIGHT_TOKEN_CHANGES); - //fUseResolveUI= fPreferenceStore.getBoolean(ComparePreferencePage.USE_RESOLVE_UI); - } - - buildControl(parent); - - setColors(); - - INavigatable nav= new INavigatable() { - public boolean selectChange(int flag) { - if (flag == INavigatable.FIRST_CHANGE || flag == INavigatable.LAST_CHANGE) { - selectFirstDiff(flag == INavigatable.FIRST_CHANGE); - return false; - } - return navigate(flag == INavigatable.NEXT_CHANGE, false, false); - } - public Object getInput() { - return TextMergeViewer.this.getInput(); - } - public boolean openSelectedChange() { - return false; - } - public boolean hasChange(int flag) { - return getNextVisibleDiff(flag == INavigatable.NEXT_CHANGE, false) != null; - } - }; - fComposite.setData(INavigatable.NAVIGATOR_PROPERTY, nav); - - fBirdsEyeCursor= new Cursor(parent.getDisplay(), SWT.CURSOR_HAND); - - JFaceResources.getFontRegistry().addListener(fPreferenceChangeListener); - JFaceResources.getColorRegistry().addListener(fPreferenceChangeListener); - updateFont(); - } - - private ChainedPreferenceStore createChainedPreferenceStore() { - ArrayList stores= new ArrayList(2); - stores.add(getCompareConfiguration().getPreferenceStore()); - stores.add(EditorsUI.getPreferenceStore()); - return new ChainedPreferenceStore((IPreferenceStore[]) stores.toArray(new IPreferenceStore[stores.size()])); - } - - /** - * Creates a color from the information stored in the given preference store. - * Returns <code>null</code> if there is no such information available. - * @param store preference store - * @param key preference key - * @return the color or <code>null</code> - */ - private static RGB createColor(IPreferenceStore store, String key) { - if (!store.contains(key)) - return null; - if (store.isDefault(key)) - return PreferenceConverter.getDefaultColor(store, key); - return PreferenceConverter.getColor(store, key); - } - - private void setColors() { - fIsUsingSystemBackground= fPreferenceStore.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT); - if (!fIsUsingSystemBackground) - fBackground= createColor(fPreferenceStore, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND); - - fIsUsingSystemForeground= fPreferenceStore.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT); - if (!fIsUsingSystemForeground) - fForeground= createColor(fPreferenceStore, AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND); - - updateColors(null); - } - - private String getSymbolicFontName() { - Class clazz= getClass(); - do { - String fontName= clazz.getName(); - if (JFaceResources.getFontRegistry().hasValueFor(fontName)) - return fontName; - clazz= clazz.getSuperclass(); - } while (clazz != null); - // use text compare font if no font has been registered for subclass - return getClass().getName(); - } - - private void updateFont() { - Font f= JFaceResources.getFont(fSymbolicFontName); - if (f != null) { - if (fAncestor != null) - fAncestor.setFont(f); - if (fLeft != null) - fLeft.setFont(f); - if (fRight != null) - fRight.setFont(f); - } - } - - private void checkForColorUpdate(Display display) { - if (fIsUsingSystemBackground) { - RGB bg= display.getSystemColor(SWT.COLOR_LIST_BACKGROUND).getRGB(); - if (!bg.equals(getBackground(display))) { - updateColors(display); - } - } - } - - /** - * Sets the viewer's background color to the given RGB value. - * If the value is <code>null</code> the system's default background color is used. - * @param background the background color or <code>null</code> to use the system's default background color - * @since 2.0 - */ - public void setBackgroundColor(RGB background) { - fIsUsingSystemBackground= (background == null); - fBackground= background; - updateColors(null); - } - - private RGB getBackground(Display display) { - if (fBackground != null) - return fBackground; - - if (display == null) - display= fComposite.getDisplay(); - - return display.getSystemColor(SWT.COLOR_LIST_BACKGROUND).getRGB(); - } - - /** - * Sets the viewer's foreground color to the given RGB value. - * If the value is <code>null</code> the system's default foreground color is used. - * @param foreground the foreground color or <code>null</code> to use the system's default foreground color - * @since 2.0 - */ - public void setForegroundColor(RGB foreground) { - fIsUsingSystemForeground= (foreground == null); - fForeground= foreground; - updateColors(null); - } - - private void updateColors(Display display) { - - if (display == null) - display = fComposite.getDisplay(); - - Color bgColor = null; - if (fBackground != null) - bgColor = getColor(display, fBackground); - - if (fAncestor != null) - fAncestor.setBackgroundColor(bgColor); - if (fLeft != null) - fLeft.setBackgroundColor(bgColor); - if (fRight != null) - fRight.setBackgroundColor(bgColor); - - Color fgColor = null; - if (fForeground != null) - fgColor = getColor(display, fForeground); - - if (fAncestor != null) - fAncestor.setForegroundColor(fgColor); - if (fLeft != null) - fLeft.setForegroundColor(fgColor); - if (fRight != null) - fRight.setForegroundColor(fgColor); - - ColorRegistry registry= JFaceResources.getColorRegistry(); - - RGB bg= getBackground(display); - SELECTED_INCOMING= registry.getRGB(INCOMING_COLOR); - if (SELECTED_INCOMING == null) - SELECTED_INCOMING= new RGB(0, 0, 255); // BLUE - INCOMING= interpolate(SELECTED_INCOMING, bg, 0.6); - INCOMING_FILL= interpolate(SELECTED_INCOMING, bg, 0.97); - INCOMING_TEXT_FILL= interpolate(SELECTED_INCOMING, bg, 0.85); - - SELECTED_OUTGOING= registry.getRGB(OUTGOING_COLOR); - if (SELECTED_OUTGOING == null) - SELECTED_OUTGOING= new RGB(0, 0, 0); // BLACK - OUTGOING= interpolate(SELECTED_OUTGOING, bg, 0.6); - OUTGOING_FILL= interpolate(SELECTED_OUTGOING, bg, 0.97); - OUTGOING_TEXT_FILL= interpolate(SELECTED_OUTGOING, bg, 0.85); - - SELECTED_CONFLICT= registry.getRGB(CONFLICTING_COLOR); - if (SELECTED_CONFLICT == null) - SELECTED_CONFLICT= new RGB(255, 0, 0); // RED - CONFLICT= interpolate(SELECTED_CONFLICT, bg, 0.6); - CONFLICT_FILL= interpolate(SELECTED_CONFLICT, bg, 0.97); - CONFLICT_TEXT_FILL= interpolate(SELECTED_CONFLICT, bg, 0.85); - - RESOLVED= registry.getRGB(RESOLVED_COLOR); - if (RESOLVED == null) - RESOLVED= new RGB(0, 255, 0); // GREEN - - updatePresentation(); - } - - private void updatePresentation() { - refreshBirdsEyeView(); - invalidateLines(); - invalidateTextPresentation(); - } - - /** - * Invalidates the current presentation by invalidating the three text viewers. - * @since 2.0 - */ - public void invalidateTextPresentation() { - if (fAncestor != null) - fAncestor.getSourceViewer().invalidateTextPresentation(); - if (fLeft != null) - fLeft.getSourceViewer().invalidateTextPresentation(); - if (fRight != null) - fRight.getSourceViewer().invalidateTextPresentation(); - } - - /** - * Configures the passed text viewer. This method is called after the three - * text viewers have been created for the content areas. The - * <code>TextMergeViewer</code> implementation of this method will - * configure the viewer with a {@link SourceViewerConfiguration}. - * Subclasses may reimplement to provide a specific configuration for the - * text viewer. - * - * @param textViewer - * the text viewer to configure - */ - protected void configureTextViewer(TextViewer textViewer) { - // to get undo for all text files, bugzilla 131895, 33665 - if(textViewer instanceof ISourceViewer){ - SourceViewerConfiguration configuration= new SourceViewerConfiguration(); - ((ISourceViewer)textViewer).configure(configuration); - } - } - - /** - * Creates an <code>ITokenComparator</code> which is used to show the - * intra line differences. - * The <code>TextMergeViewer</code> implementation of this method returns a - * tokenizer that breaks a line into words separated by whitespace. - * Subclasses may reimplement to provide a specific tokenizer. - * @param line the line for which to create the <code>ITokenComparator</code> - * @return a ITokenComparator which is used for a second level token compare. - */ - protected ITokenComparator createTokenComparator(String line) { - return new TokenComparator(line); - } - - /** - * Setup the given document for use with this viewer. By default, - * the partitioner returned from {@link #getDocumentPartitioner()} - * is registered as the default partitioner for the document. - * Subclasses that return a partitioner must also override - * {@link #getDocumentPartitioning()} if they wish to be able to use shared - * documents (i.e. file buffers). - * @param document the document to be set up - * - * @since 3.3 - */ - 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); - } - } - } - } - - /** - * Returns a document partitioner which is suitable for the underlying content type. - * This method is only called if the input provided by the content provider is a - * <code>IStreamContentAccessor</code> and an internal document must be obtained. This - * document is initialized with the partitioner returned from this method. - * <p> - * The <code>TextMergeViewer</code> implementation of this method returns - * <code>null</code>. Subclasses may reimplement to create a partitioner for a - * specific content type. Subclasses that do return a partitioner should also - * return a partitioning from {@link #getDocumentPartitioning()} in order to make - * use of shared documents (e.g. file buffers). - * - * @return a document partitioner, or <code>null</code> - */ - 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. - * By default, <code>null</code> is returned which means that shared - * documents that return a partitioner from {@link #getDocumentPartitioner()} - * will not be able to use shared documents. - * @see IDocumentExtension3 - * @return a partitioning - * - * @since 3.3 - */ - protected String getDocumentPartitioning() { - return null; - } - - /** - * Called on the viewer disposal. - * Unregisters from the compare configuration. - * Clients may extend if they have to do additional cleanup. - * @param event - */ - protected void handleDispose(DisposeEvent event) { - OperationHistoryFactory.getOperationHistory() - .removeOperationHistoryListener(operationHistoryListener); - - if (fHandlerService != null) - fHandlerService.dispose(); - - Object input= getInput(); - removeFromDocumentManager(ANCESTOR_CONTRIBUTOR, input); - removeFromDocumentManager(LEFT_CONTRIBUTOR, input); - removeFromDocumentManager(RIGHT_CONTRIBUTOR, input); - - if (DEBUG) - DocumentManager.dump(); - - if (fPreferenceChangeListener != null) { - JFaceResources.getFontRegistry().removeListener(fPreferenceChangeListener); - JFaceResources.getColorRegistry().removeListener(fPreferenceChangeListener); - if (fPreferenceStore != null) - fPreferenceStore.removePropertyChangeListener(fPreferenceChangeListener); - fPreferenceChangeListener= null; - } - - fLeftCanvas= null; - fRightCanvas= null; - fVScrollBar= null; - fBirdsEyeCanvas= null; - fSummaryHeader= null; - - fAncestorContributor.unsetDocument(fAncestor); - fLeftContributor.unsetDocument(fLeft); - fRightContributor.unsetDocument(fRight); - - disconnect(fLeftContributor); - disconnect(fRightContributor); - disconnect(fAncestorContributor); - - if (fBirdsEyeCursor != null) { - fBirdsEyeCursor.dispose(); - fBirdsEyeCursor= null; - } - - if (showWhitespaceAction != null) - showWhitespaceAction.dispose(); - - if (toggleLineNumbersAction != null) - toggleLineNumbersAction.dispose(); - - if (fIgnoreWhitespace != null) - fIgnoreWhitespace.dispose(); - - if (fSourceViewerDecorationSupport != null) { - for (Iterator iterator = fSourceViewerDecorationSupport.iterator(); iterator.hasNext();) { - ((SourceViewerDecorationSupport) iterator.next()).dispose(); - } - fSourceViewerDecorationSupport = null; - } - - - if (fAncestor != null) - fAncestor.dispose(); - fAncestor = null; - if (fLeft != null) - fLeft.dispose(); - fLeft = null; - if (fRight != null) - fRight.dispose(); - fRight = null; - - if (fColors != null) { - Iterator i= fColors.values().iterator(); - while (i.hasNext()) { - Color color= (Color) i.next(); - if (!color.isDisposed()) - color.dispose(); - } - fColors= null; - } - // don't add anything here, disposing colors should be done last - super.handleDispose(event); - } - - private void disconnect(ContributorInfo legInfo) { - if (legInfo != null) - legInfo.disconnect(); - } - - //------------------------------------------------------------------------------------------------------------- - //--- internal ------------------------------------------------------------------------------------------------ - //------------------------------------------------------------------------------------------------------------- - - /* - * Creates the specific SWT controls for the content areas. - * Clients must not call or override this method. - */ - protected void createControls(Composite composite) { - - PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ICompareContextIds.TEXT_MERGE_VIEW); - - // 1st row - if (fMarginWidth > 0) { - fAncestorCanvas= new BufferedCanvas(composite, SWT.NONE) { - public void doPaint(GC gc) { - paintSides(gc, fAncestor, fAncestorCanvas, false); - } - }; - fAncestorCanvas.addMouseListener( - new MouseAdapter() { - public void mouseDown(MouseEvent e) { - setCurrentDiff2(handleMouseInSides(fAncestorCanvas, fAncestor, e.y), false); - } - } - ); - } - - fAncestor= createPart(composite); - setEditable(fAncestor.getSourceViewer(), false); - fAncestor.getSourceViewer().getTextWidget().getAccessible().addAccessibleListener(new AccessibleAdapter() { - public void getName(AccessibleEvent e) { - e.result = NLS.bind(CompareMessages.TextMergeViewer_accessible_ancestor, getCompareConfiguration().getAncestorLabel(getInput())); - } - }); - fAncestor.getSourceViewer().addTextPresentationListener(new ChangeHighlighter(fAncestor)); - - fSummaryHeader= new Canvas(composite, SWT.NONE); - fHeaderPainter= new HeaderPainter(); - fSummaryHeader.addPaintListener(fHeaderPainter); - updateResolveStatus(); - - // 2nd row - if (fMarginWidth > 0) { - fLeftCanvas= new BufferedCanvas(composite, SWT.NONE) { - public void doPaint(GC gc) { - paintSides(gc, fLeft, fLeftCanvas, false); - } - }; - fLeftCanvas.addMouseListener( - new MouseAdapter() { - public void mouseDown(MouseEvent e) { - setCurrentDiff2(handleMouseInSides(fLeftCanvas, fLeft, e.y), false); - } - } - ); - } - - fLeft= createPart(composite); - fLeft.getSourceViewer().getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling); - fLeft.getSourceViewer().getTextWidget().getAccessible().addAccessibleListener(new AccessibleAdapter() { - public void getName(AccessibleEvent e) { - e.result = NLS.bind(CompareMessages.TextMergeViewer_accessible_left, getCompareConfiguration().getLeftLabel(getInput())); - } - }); - fLeft.getSourceViewer().addTextPresentationListener(new ChangeHighlighter(fLeft)); - - fRight= createPart(composite); - fRight.getSourceViewer().getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling); - fRight.getSourceViewer().getTextWidget().getAccessible().addAccessibleListener(new AccessibleAdapter() { - public void getName(AccessibleEvent e) { - e.result = NLS.bind(CompareMessages.TextMergeViewer_accessible_right, getCompareConfiguration().getRightLabel(getInput())); - } - }); - fRight.getSourceViewer().addTextPresentationListener(new ChangeHighlighter(fRight)); - - IWorkbenchPart part = getCompareConfiguration().getContainer().getWorkbenchPart(); - // part is not available for contexts different than editor - if (part != null) { - ISelectionProvider selectionProvider = part.getSite().getSelectionProvider(); - if (selectionProvider instanceof CompareEditorSelectionProvider) { - CompareEditorSelectionProvider cesp = (CompareEditorSelectionProvider) selectionProvider; - SourceViewer focusSourceViewer = fFocusPart == null ? null : fFocusPart.getSourceViewer(); - cesp.setViewers(new SourceViewer[] { fLeft.getSourceViewer(), fRight.getSourceViewer(), fAncestor.getSourceViewer() }, focusSourceViewer); - } - } - - hsynchViewport(fAncestor.getSourceViewer(), fLeft.getSourceViewer(), fRight.getSourceViewer()); - hsynchViewport(fLeft.getSourceViewer(), fAncestor.getSourceViewer(), fRight.getSourceViewer()); - hsynchViewport(fRight.getSourceViewer(), fAncestor.getSourceViewer(), fLeft.getSourceViewer()); - - if (fMarginWidth > 0) { - fRightCanvas= new BufferedCanvas(composite, SWT.NONE) { - public void doPaint(GC gc) { - paintSides(gc, fRight, fRightCanvas, fSynchronizedScrolling); - } - }; - fRightCanvas.addMouseListener( - new MouseAdapter() { - public void mouseDown(MouseEvent e) { - setCurrentDiff2(handleMouseInSides(fRightCanvas, fRight, e.y), false); - } - } - ); - } - - fScrollCanvas= new Canvas(composite, SWT.V_SCROLL); - Rectangle trim= fLeft.getSourceViewer().getTextWidget().computeTrim(0, 0, 0, 0); - fTopInset= trim.y; - - fVScrollBar= fScrollCanvas.getVerticalBar(); - fVScrollBar.setIncrement(1); - fVScrollBar.setVisible(true); - fVScrollBar.addListener(SWT.Selection, - new Listener() { - public void handleEvent(Event e) { - int vpos= ((ScrollBar)e.widget).getSelection(); - synchronizedScrollVertical(vpos); - } - } - ); - - fBirdsEyeCanvas= new BufferedCanvas(composite, SWT.NONE) { - public void doPaint(GC gc) { - paintBirdsEyeView(this, gc); - } - }; - fBirdsEyeCanvas.addMouseListener( - new MouseAdapter() { - public void mouseDown(MouseEvent e) { - setCurrentDiff2(handlemouseInBirdsEyeView(fBirdsEyeCanvas, e.y), true); - } - } - ); - fBirdsEyeCanvas.addMouseMoveListener( - new MouseMoveListener() { - - private Cursor fLastCursor; - - public void mouseMove(MouseEvent e) { - Cursor cursor= null; - Diff diff= handlemouseInBirdsEyeView(fBirdsEyeCanvas, e.y); - if (diff != null && diff.getKind() != RangeDifference.NOCHANGE) - cursor= fBirdsEyeCursor; - if (fLastCursor != cursor) { - fBirdsEyeCanvas.setCursor(cursor); - fLastCursor= cursor; - } - } - } - ); - - IWorkbenchPart workbenchPart = getCompareConfiguration().getContainer().getWorkbenchPart(); - if (workbenchPart != null) { - IContextService service = (IContextService)workbenchPart.getSite().getService(IContextService.class); - if (service != null) { - service.activateContext("org.eclipse.ui.textEditorScope"); //$NON-NLS-1$ - } - } - } - - private void hsynchViewport(final TextViewer tv1, final TextViewer tv2, final TextViewer tv3) { - final StyledText st1= tv1.getTextWidget(); - final StyledText st2= tv2.getTextWidget(); - final StyledText st3= tv3.getTextWidget(); - final ScrollBar sb1= st1.getHorizontalBar(); - sb1.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (fSynchronizedScrolling) { - int v= sb1.getSelection(); - if (st2.isVisible()) - st2.setHorizontalPixel(v); - if (st3.isVisible()) - st3.setHorizontalPixel(v); - } - } - }); - } - - private void setCurrentDiff2(Diff diff, boolean reveal) { - if (diff != null && diff.getKind() != RangeDifference.NOCHANGE) { - //fCurrentDiff= null; - setCurrentDiff(diff, reveal); - } - } - - private Diff handleMouseInSides(Canvas canvas, MergeSourceViewer tp, int my) { - - int lineHeight= tp.getSourceViewer().getTextWidget().getLineHeight(); - int visibleHeight= tp.getViewportHeight(); - - if (! fHighlightRanges) - return null; - - if (fMerger.hasChanges()) { - int shift= tp.getVerticalScrollOffset() + (2-LW); - - Point region= new Point(0, 0); - char leg = getLeg(tp); - for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - if (diff.isDeleted()) - continue; - - if (fShowCurrentOnly2 && !isCurrentDiff(diff)) - continue; - - tp.getLineRange(diff.getPosition(leg), region); - int y= (region.x * lineHeight) + shift; - int h= region.y * lineHeight; - - if (y+h < 0) - continue; - if (y >= visibleHeight) - break; - - if (my >= y && my < y+h) - return diff; - } - } - return null; - } - - private Diff getDiffUnderMouse(Canvas canvas, int mx, int my, Rectangle r) { - - if (! fSynchronizedScrolling) - return null; - - int lineHeight= fLeft.getSourceViewer().getTextWidget().getLineHeight(); - int visibleHeight= fRight.getViewportHeight(); - - Point size= canvas.getSize(); - int w= size.x; - - if (! fHighlightRanges) - return null; - - if (fMerger.hasChanges()) { - int lshift= fLeft.getVerticalScrollOffset(); - int rshift= fRight.getVerticalScrollOffset(); - - Point region= new Point(0, 0); - - for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - if (diff.isDeleted()) - continue; - - if (fShowCurrentOnly2 && !isCurrentDiff(diff)) - continue; - - fLeft.getLineRange(diff.getPosition(LEFT_CONTRIBUTOR), region); - int ly= (region.x * lineHeight) + lshift; - int lh= region.y * lineHeight; - - fRight.getLineRange(diff.getPosition(RIGHT_CONTRIBUTOR), region); - int ry= (region.x * lineHeight) + rshift; - int rh= region.y * lineHeight; - - if (Math.max(ly+lh, ry+rh) < 0) - continue; - if (Math.min(ly, ry) >= visibleHeight) - break; - - int cx= (w-RESOLVE_SIZE)/2; - int cy= ((ly+lh/2) + (ry+rh/2) - RESOLVE_SIZE)/2; - if (my >= cy && my < cy+RESOLVE_SIZE && mx >= cx && mx < cx+RESOLVE_SIZE) { - if (r != null) { - int SIZE= fIsCarbon ? 30 : 20; - r.x= cx+(RESOLVE_SIZE-SIZE)/2; - r.y= cy+(RESOLVE_SIZE-SIZE)/2; - r.width= SIZE; - r.height= SIZE; - } - return diff; - } - } - } - return null; - } - - private Diff handlemouseInBirdsEyeView(Canvas canvas, int my) { - return fMerger.findDiff(getViewportHeight(), fSynchronizedScrolling, canvas.getSize(), my); - } - - private void paintBirdsEyeView(Canvas canvas, GC gc) { - - Color c; - Rectangle r= new Rectangle(0, 0, 0, 0); - int yy, hh; - - Point size= canvas.getSize(); - - int virtualHeight= fSynchronizedScrolling ? fMerger.getVirtualHeight() : fMerger.getRightHeight(); - if (virtualHeight < getViewportHeight()) - return; - - Display display= canvas.getDisplay(); - int y= 0; - for (Iterator iterator = fMerger.rangesIterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - int h= fSynchronizedScrolling ? diff.getMaxDiffHeight() - : diff.getRightHeight(); - - if (fMerger.useChange(diff)) { - - yy= (y*size.y)/virtualHeight; - hh= (h*size.y)/virtualHeight; - if (hh < 3) - hh= 3; - - c= getColor(display, getFillColor(diff)); - if (c != null) { - gc.setBackground(c); - gc.fillRectangle(BIRDS_EYE_VIEW_INSET, yy, size.x-(2*BIRDS_EYE_VIEW_INSET),hh); - } - c= getColor(display, getStrokeColor(diff)); - if (c != null) { - gc.setForeground(c); - r.x= BIRDS_EYE_VIEW_INSET; - r.y= yy; - r.width= size.x-(2*BIRDS_EYE_VIEW_INSET)-1; - r.height= hh; - if (isCurrentDiff(diff)) { - gc.setLineWidth(2); - r.x++; - r.y++; - r.width--; - r.height--; - } else { - gc.setLineWidth(0 /* 1 */); - } - gc.drawRectangle(r); - } - } - - y+= h; - } - } - - private void refreshBirdsEyeView() { - if (fBirdsEyeCanvas != null) - fBirdsEyeCanvas.redraw(); - } - - /** - * Override to give focus to the pane that previously had focus or to a suitable - * default pane. - * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleSetFocus() - * @since 3.3 - */ - protected boolean handleSetFocus() { - if (fRedoDiff) { - new UIJob(CompareMessages.DocumentMerger_0) { - public IStatus runInUIThread(IProgressMonitor monitor) { - update(true); - updateStructure(); - return Status.OK_STATUS; - } - }.schedule(); - fRedoDiff = false; - } - if (fFocusPart == null) { - if (fLeft != null && fLeft.getEnabled()) { - fFocusPart= fLeft; - } else if (fRight != null && fRight.getEnabled()) { - fFocusPart= fRight; - } else if (fAncestor != null && fAncestor.getEnabled()) { - fFocusPart= fAncestor; - } - } - if (fFocusPart != null) { - StyledText st= fFocusPart.getSourceViewer().getTextWidget(); - if (st != null) - return st.setFocus(); - } - return false; // could not set focus - } - - - class HoverResizer extends Resizer { - Canvas fCanvas; - public HoverResizer(Canvas c, int dir) { - super(c, dir); - fCanvas= c; - } - public void mouseMove(MouseEvent e) { - if (!fIsDown && fUseSingleLine && showResolveUI() && handleMouseMoveOverCenter(fCanvas, e.x, e.y)) - return; - super.mouseMove(e); - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#createCenterControl(org.eclipse.swt.widgets.Composite) - */ - protected final Control createCenterControl(Composite parent) { - if (fSynchronizedScrolling) { - final Canvas canvas= new BufferedCanvas(parent, SWT.NONE) { - public void doPaint(GC gc) { - paintCenter(this, gc); - } - }; - if (fUseResolveUI) { - - new HoverResizer(canvas, HORIZONTAL); - - fCenterButton= new Button(canvas, fIsMac ? SWT.FLAT : SWT.PUSH); - if (fNormalCursor == null) fNormalCursor= new Cursor(canvas.getDisplay(), SWT.CURSOR_ARROW); - fCenterButton.setCursor(fNormalCursor); - fCenterButton.setText(COPY_RIGHT_TO_LEFT_INDICATOR); - fCenterButton.pack(); - fCenterButton.setVisible(false); - fCenterButton.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - fCenterButton.setVisible(false); - if (fButtonDiff != null) { - setCurrentDiff(fButtonDiff, false); - copy(fCurrentDiff, fCenterButton.getText().equals( - COPY_LEFT_TO_RIGHT_INDICATOR), false); - } - } - } - ); - } else { - new Resizer(canvas, HORIZONTAL); - } - - return canvas; - } - return super.createCenterControl(parent); - } - - private boolean handleMouseMoveOverCenter(Canvas canvas, int x, int y) { - Rectangle r= new Rectangle(0, 0, 0, 0); - Diff diff= getDiffUnderMouse(canvas, x, y, r); - if (diff != null && !diff.isUnresolvedIncomingOrConflicting()) - diff= null; - if (diff != fButtonDiff) { - if (diff != null) { - if (fLeft.getSourceViewer().isEditable()) { - fButtonDiff= diff; - fCenterButton.setText(COPY_RIGHT_TO_LEFT_INDICATOR); - String tt= fCopyDiffRightToLeftItem.getAction().getToolTipText(); - fCenterButton.setToolTipText(tt); - fCenterButton.setBounds(r); - fCenterButton.setVisible(true); - } else if (fRight.getSourceViewer().isEditable()) { - fButtonDiff= diff; - fCenterButton.setText(COPY_LEFT_TO_RIGHT_INDICATOR); - String tt= fCopyDiffLeftToRightItem.getAction().getToolTipText(); - fCenterButton.setToolTipText(tt); - fCenterButton.setBounds(r); - fCenterButton.setVisible(true); - } else - fButtonDiff= null; - } else { - fCenterButton.setVisible(false); - fButtonDiff= null; - } - } - return fButtonDiff != null; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#getCenterWidth() - */ - protected final int getCenterWidth() { - if (fSynchronizedScrolling) - return CENTER_WIDTH; - return super.getCenterWidth(); - } - - private int getDirection() { - switch (fTextDirection) { - case SWT.LEFT_TO_RIGHT: - case SWT.RIGHT_TO_LEFT: - if (fInheritedDirection == fTextDirection) - return SWT.NONE; - return fTextDirection; - } - return fInheritedDirection; - } - - /** - * Creates a new source viewer. This method is called when creating and - * initializing the content areas of the merge viewer (see - * {@link #createControls(Composite)}). It is called three - * times for each text part of the comparison: ancestor, left, right. - * Clients may implement to provide their own type of source viewers. The - * viewer is not expected to be configured with a source viewer - * configuration. - * - * @param parent - * the parent of the viewer's control - * @param textOrientation - * style constant bit for text orientation - * @return Default implementation returns an instance of - * {@link SourceViewer}. - * @since 3.5 - */ - protected SourceViewer createSourceViewer(Composite parent, int textOrientation) { - return new SourceViewer(parent, new CompositeRuler(), textOrientation | SWT.H_SCROLL | SWT.V_SCROLL); - } - - /** - * Tells whether the given text viewer is backed by an editor. - * - * @param textViewer the text viewer to check - * @return <code>true</code> if the viewer is backed by an editor - * @since 3.5 - */ - protected boolean isEditorBacked(ITextViewer textViewer) { - return false; - } - - /** - * Returns an editor input for the given source viewer. The method returns - * <code>null</code> when no input is available, for example when the input - * for the merge viewer has not been set yet. - * - * @param sourceViewer - * the source viewer to get input for - * @return input for the given viewer or <code>null</code> when no input is - * available - * - * @since 3.5 - */ - protected IEditorInput getEditorInput(ISourceViewer sourceViewer) { - if (fLeft != null && sourceViewer == fLeft.getSourceViewer()) - if (fLeftContributor != null) - return fLeftContributor.getDocumentKey(); - if (fRight != null && sourceViewer == fRight.getSourceViewer()) - if (fRightContributor != null) - return fRightContributor.getDocumentKey(); - if (fAncestor != null - && sourceViewer == fAncestor.getSourceViewer()) - if (fAncestorContributor != null) - return fAncestorContributor.getDocumentKey(); - return null; - } - - /* - * Creates and initializes a text part. - */ - private MergeSourceViewer createPart(Composite parent) { - final MergeSourceViewer viewer = new MergeSourceViewer( - createSourceViewer(parent, getDirection()), - getResourceBundle(), getCompareConfiguration().getContainer()); - final StyledText te= viewer.getSourceViewer().getTextWidget(); - - if (!fConfirmSave) - viewer.hideSaveAction(); - - te.addPaintListener( - new PaintListener() { - public void paintControl(PaintEvent e) { - paint(e, viewer); - } - } - ); - te.addKeyListener( - new KeyAdapter() { - public void keyPressed(KeyEvent e) { - handleSelectionChanged(viewer); - } - } - ); - te.addMouseListener( - new MouseAdapter() { - public void mouseDown(MouseEvent e) { - //syncViewport(part); - handleSelectionChanged(viewer); - } - } - ); - - te.addFocusListener( - new FocusAdapter() { - public void focusGained(FocusEvent fe) { - setActiveViewer(viewer, true); - } - public void focusLost(FocusEvent fe) { - setActiveViewer(viewer, false); - } - } - ); - - viewer.getSourceViewer().addViewportListener( - new IViewportListener() { - public void viewportChanged(int verticalPosition) { - syncViewport(viewer); - } - } - ); - - Font font= JFaceResources.getFont(fSymbolicFontName); - if (font != null) - te.setFont(font); - - if (fBackground != null) // not default - te.setBackground(getColor(parent.getDisplay(), fBackground)); - - // Add the find action to the popup menu of the viewer - contributeFindAction(viewer); - - contributeGotoLineAction(viewer); - - contributeChangeEncodingAction(viewer); - - contributeDiffBackgroundListener(viewer); - - return viewer; - } - - private void setActiveViewer(MergeSourceViewer viewer, boolean activate) { - connectContributedActions(viewer, activate); - if (activate) { - fFocusPart= viewer; - connectGlobalActions(fFocusPart); - } else { - connectGlobalActions(null); - } - } - - private SourceViewerDecorationSupport getSourceViewerDecorationSupport(ISourceViewer viewer) { - SourceViewerDecorationSupport support = new SourceViewerDecorationSupport(viewer, null, null, EditorsUI.getSharedTextColors()); - support.setCursorLinePainterPreferenceKeys(CURRENT_LINE, CURRENT_LINE_COLOR); - fSourceViewerDecorationSupport.add(support); - return support; - } - - private void contributeFindAction(MergeSourceViewer viewer) { - IAction action; - IWorkbenchPart wp = getCompareConfiguration().getContainer().getWorkbenchPart(); - if (wp != null) - action = new FindReplaceAction(getResourceBundle(), "Editor.FindReplace.", wp); //$NON-NLS-1$ - else - action = new FindReplaceAction(getResourceBundle(), "Editor.FindReplace.", viewer.getSourceViewer().getControl().getShell(), getFindReplaceTarget()); //$NON-NLS-1$ - action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_FIND_AND_REPLACE); - viewer.addAction(MergeSourceViewer.FIND_ID, action); - } - - private void contributeGotoLineAction(MergeSourceViewer viewer) { - IAction action = new GotoLineAction((ITextEditor) viewer.getAdapter(ITextEditor.class)); - action.setActionDefinitionId(ITextEditorActionDefinitionIds.LINE_GOTO); - viewer.addAction(MergeSourceViewer.GOTO_LINE_ID, action); - } - - private void contributeChangeEncodingAction(MergeSourceViewer viewer) { - IAction action = new ChangeEncodingAction(getTextEditorAdapter()); - viewer.addAction(MergeSourceViewer.CHANGE_ENCODING_ID, action); - } - - private void contributeDiffBackgroundListener(final MergeSourceViewer viewer) { - viewer.getSourceViewer().getTextWidget().addLineBackgroundListener( - new LineBackgroundListener() { - public void lineGetBackground(LineBackgroundEvent event) { - StyledText textWidget = viewer.getSourceViewer() - .getTextWidget(); - if (textWidget != null) { - - int caret = textWidget.getCaretOffset(); - int length = event.lineText.length(); - - if (event.lineOffset <= caret - && caret <= event.lineOffset + length) { - // current line, do nothing - // decorated by CursorLinePainter - } else { - // find diff for the event line - Diff diff = findDiff(viewer, event.lineOffset, - event.lineOffset + length); - if (diff != null && updateDiffBackground(diff)) { - // highlights only the event line, not the - // whole diff - event.lineBackground = getColor(fComposite - .getDisplay(), getFillColor(diff)); - } - } - } - } - }); - } - - private void connectGlobalActions(final MergeSourceViewer part) { - if (fHandlerService != null) { - if (part != null) - part.updateActions(); - fHandlerService.updatePaneActionHandlers(new Runnable() { - public void run() { - for (int i= 0; i < GLOBAL_ACTIONS.length; i++) { - IAction action= null; - if (part != null) { - action= part.getAction(TEXT_ACTIONS[i]); - } - fHandlerService.setGlobalActionHandler(GLOBAL_ACTIONS[i], action); - } - } - }); - } - } - - private void connectContributedActions(final MergeSourceViewer viewer, final boolean connect) { - if (fHandlerService != null) { - fHandlerService.updatePaneActionHandlers(new Runnable() { - public void run() { - if (viewer != null) { - setActionsActivated(viewer.getSourceViewer(), connect); - if (isEditorBacked(viewer.getSourceViewer()) && connect) { - /* - * If editor backed, activating contributed actions - * might have disconnected actions provided in - * CompareEditorContributor => when connecting, - * refresh active editor in the contributor, when - * disconnecting do nothing. See bug 261229. - */ - IWorkbenchPart part = getCompareConfiguration().getContainer().getWorkbenchPart(); - if (part instanceof CompareEditor) { - ((CompareEditor) part).refreshActionBarsContributor(); - } - } - } - } - }); - } - } - - /** - * Activates or deactivates actions of the given source viewer. - * <p> - * The default implementation does nothing, but clients should override to properly react to - * viewers switching. - * </p> - * - * @param sourceViewer the source viewer - * @param state <code>true</code> if activated - * @since 3.5 - */ - protected void setActionsActivated(SourceViewer sourceViewer, boolean state) { - // default implementation does nothing - } - - private IDocument getElementDocument(char type, Object element) { - if (element instanceof IDocument) { - return (IDocument) element; - } - ITypedElement te= Utilities.getLeg(type, element); - // First check the contributors for the document - IDocument document = null; - switch (type) { - case ANCESTOR_CONTRIBUTOR: - document = getDocument(te, fAncestorContributor); - break; - case LEFT_CONTRIBUTOR: - document = getDocument(te, fLeftContributor); - break; - case RIGHT_CONTRIBUTOR: - document = getDocument(te, fRightContributor); - break; - } - if (document != null) - return document; - // The document is not associated with the input of the viewer so try to find the document - return Utilities.getDocument(type, element, isUsingDefaultContentProvider(), canHaveSharedDocument()); - } - - private boolean isUsingDefaultContentProvider() { - return getContentProvider() instanceof MergeViewerContentProvider; - } - - private boolean canHaveSharedDocument() { - return getDocumentPartitioning() != null - || getDocumentPartitioner() == null; - } - - private IDocument getDocument(ITypedElement te, ContributorInfo info) { - if (info != null && info.getElement() == te) - return info.getDocument(); - return null; - } - - IDocument getDocument(char type, Object input) { - IDocument doc= getElementDocument(type, input); - if (doc != null) - return doc; - - if (input instanceof IDiffElement) { - IDiffContainer parent= ((IDiffElement)input).getParent(); - return getElementDocument(type, parent); - } - return null; - } - - /* - * Returns true if the given inputs map to the same documents - */ - boolean sameDoc(char type, Object newInput, Object oldInput) { - IDocument newDoc= getDocument(type, newInput); - IDocument oldDoc= getDocument(type, oldInput); - return newDoc == oldDoc; - } - - /** - * Overridden to prevent save confirmation if new input is sub document of current input. - * @param newInput the new input of this viewer, or <code>null</code> if there is no new input - * @param oldInput the old input element, or <code>null</code> if there was previously no input - * @return <code>true</code> if saving was successful, or if the user didn't want to save (by pressing 'NO' in the confirmation dialog). - * @since 2.0 - */ - protected boolean doSave(Object newInput, Object oldInput) { - // TODO: Would be good if this could be restated in terms of Saveables and moved up - if (oldInput != null && newInput != null) { - // check whether underlying documents have changed. - if (sameDoc(ANCESTOR_CONTRIBUTOR, newInput, oldInput) && - sameDoc(LEFT_CONTRIBUTOR, newInput, oldInput) && - sameDoc(RIGHT_CONTRIBUTOR, newInput, oldInput)) { - if (DEBUG) System.out.println("----- Same docs !!!!"); //$NON-NLS-1$ - return false; - } - } - - if (DEBUG) System.out.println("***** New docs !!!!"); //$NON-NLS-1$ - - removeFromDocumentManager(ANCESTOR_CONTRIBUTOR, oldInput); - removeFromDocumentManager(LEFT_CONTRIBUTOR, oldInput); - removeFromDocumentManager(RIGHT_CONTRIBUTOR, oldInput); - - if (DEBUG) - DocumentManager.dump(); - - return super.doSave(newInput, oldInput); - } - - private void removeFromDocumentManager(char leg, Object oldInput) { - IDocument document= getDocument(leg, oldInput); - if (document != null) - DocumentManager.remove(document); - } - - private ITypedElement getParent(char type) { - Object input= getInput(); - if (input instanceof IDiffElement) { - IDiffContainer parent= ((IDiffElement)input).getParent(); - return Utilities.getLeg(type, parent); - } - return null; - } - - /* - * Initializes the text viewers of the three content areas with the given input objects. - * Subclasses may extend. - */ - protected void updateContent(Object ancestor, Object left, Object right) { - - boolean emptyInput= (ancestor == null && left == null && right == null); - - Object input= getInput(); - - Position leftRange= null; - Position rightRange= null; - - // if one side is empty use container - if (FIX_47640 && !emptyInput && (left == null || right == null)) { - if (input instanceof IDiffElement) { - IDiffContainer parent= ((IDiffElement)input).getParent(); - if (parent instanceof ICompareInput) { - ICompareInput ci= (ICompareInput) parent; - - if (ci.getAncestor() instanceof IDocumentRange - || ci.getLeft() instanceof IDocumentRange - || ci.getRight() instanceof IDocumentRange) { - - if (left instanceof IDocumentRange) - leftRange= ((IDocumentRange)left).getRange(); - if (right instanceof IDocumentRange) - rightRange= ((IDocumentRange)right).getRange(); - - ancestor= ci.getAncestor(); - left= ci.getLeft(); - right= ci.getRight(); - } - } - } - } - - int n= 0; - if (left != null) - n++; - if (right != null) - n++; - fHighlightRanges= n > 1; - - resetDiffs(); - fHasErrors= false; // start with no errors - - CompareConfiguration cc= getCompareConfiguration(); - IMergeViewerContentProvider cp= getMergeContentProvider(); - - if (cp instanceof MergeViewerContentProvider) { - MergeViewerContentProvider mcp= (MergeViewerContentProvider) cp; - mcp.setAncestorError(null); - mcp.setLeftError(null); - mcp.setRightError(null); - } - - // Record current contributors so we disconnect after creating the new ones. - // This is done in case the old and new use the same document. - ContributorInfo oldLeftContributor = fLeftContributor; - ContributorInfo oldRightContributor = fRightContributor; - ContributorInfo oldAncestorContributor = fAncestorContributor; - - // Create the new contributor - fLeftContributor = createLegInfoFor(left, LEFT_CONTRIBUTOR); - fRightContributor = createLegInfoFor(right, RIGHT_CONTRIBUTOR); - fAncestorContributor = createLegInfoFor(ancestor, ANCESTOR_CONTRIBUTOR); - - fLeftContributor.transferContributorStateFrom(oldLeftContributor); - fRightContributor.transferContributorStateFrom(oldRightContributor); - fAncestorContributor.transferContributorStateFrom(oldAncestorContributor); - - // Now disconnect the old ones - disconnect(oldLeftContributor); - disconnect(oldRightContributor); - disconnect(oldAncestorContributor); - - // Get encodings from streams. If an encoding is null, abide by the other one - // Defaults to workbench encoding only if both encodings are null - fLeftContributor.setEncodingIfAbsent(fRightContributor); - fRightContributor.setEncodingIfAbsent(fLeftContributor); - fAncestorContributor.setEncodingIfAbsent(fLeftContributor); - - if (!isConfigured) { - configureSourceViewer(fAncestor.getSourceViewer(), false, null); - configureSourceViewer(fLeft.getSourceViewer(), cc.isLeftEditable() && cp.isLeftEditable(input), fLeftContributor); - configureSourceViewer(fRight.getSourceViewer(), cc.isRightEditable() && cp.isRightEditable(input), fRightContributor); - isConfigured = true; // configure once - } - - // set new documents - fLeftContributor.setDocument(fLeft, cc.isLeftEditable() && cp.isLeftEditable(input)); - fLeftLineCount= fLeft.getLineCount(); - - fRightContributor.setDocument(fRight, cc.isRightEditable() && cp.isRightEditable(input)); - fRightLineCount= fRight.getLineCount(); - - fAncestorContributor.setDocument(fAncestor, false); - - //if the input is part of a patch hunk, toggle synchronized scrolling - /*if (isPatchHunk()){ - setSyncScrolling(false); - } else { - setSyncScrolling(fPreferenceStore.getBoolean(ComparePreferencePage.SYNCHRONIZE_SCROLLING)); - }*/ - setSyncScrolling(fPreferenceStore.getBoolean(ComparePreferencePage.SYNCHRONIZE_SCROLLING)); - - update(false); - - if (!fHasErrors && !emptyInput && !fComposite.isDisposed()) { - if (isRefreshing()) { - fLeftContributor.updateSelection(fLeft, !fSynchronizedScrolling); - fRightContributor.updateSelection(fRight, !fSynchronizedScrolling); - fAncestorContributor.updateSelection(fAncestor, !fSynchronizedScrolling); - if (fSynchronizedScrolling && fSynchronziedScrollPosition != -1) { - synchronizedScrollVertical(fSynchronziedScrollPosition); - } - } else { - if (isPatchHunk()) { - if (right != null && Utilities.getAdapter(right, IHunk.class) != null) - fLeft.getSourceViewer().setTopIndex(getHunkStart()); - else - fRight.getSourceViewer().setTopIndex(getHunkStart()); - } else { - Diff selectDiff= null; - if (FIX_47640) { - if (leftRange != null) - selectDiff= fMerger.findDiff(LEFT_CONTRIBUTOR, leftRange); - else if (rightRange != null) - selectDiff= fMerger.findDiff(RIGHT_CONTRIBUTOR, rightRange); - } - if (selectDiff != null) - setCurrentDiff(selectDiff, true); - else - selectFirstDiff(true); - } - } - } - - } - - private void configureSourceViewer(SourceViewer sourceViewer, boolean editable, ContributorInfo contributor) { - setEditable(sourceViewer, editable); - configureTextViewer(sourceViewer); - if (editable && contributor != null) { - IDocument document = sourceViewer.getDocument(); - if (document != null) - contributor.connectPositionUpdater(document); - } - if (!isCursorLinePainterInstalled(sourceViewer)) - getSourceViewerDecorationSupport(sourceViewer).install(fPreferenceStore); - } - - private boolean isCursorLinePainterInstalled(SourceViewer viewer) { - Listener[] listeners = viewer.getTextWidget().getListeners(3001/*StyledText.LineGetBackground*/); - for (int i = 0; i < listeners.length; i++) { - if (listeners[i] instanceof TypedListener) { - TypedListener listener = (TypedListener) listeners[i]; - if (listener.getEventListener() instanceof CursorLinePainter) - return true; - } - } - return false; - } - - /** - * Sets the editable state of the given source viewer. - * - * @param sourceViewer - * the source viewer - * @param state - * the state - * @since 3.5 - */ - protected void setEditable(ISourceViewer sourceViewer, boolean state) { - sourceViewer.setEditable(state); - } - - private boolean isRefreshing() { - return isRefreshing > 0; - } - - private ContributorInfo createLegInfoFor(Object element, char leg) { - return new ContributorInfo(this, element, leg); - } - - private boolean updateDiffBackground(Diff diff) { - - if (!fHighlightRanges) - return false; - - if (diff == null || diff.isToken()) - return false; - - if (fShowCurrentOnly && !isCurrentDiff(diff)) - return false; - - return true; - } - - /* - * Called whenever one of the documents changes. - * Sets the dirty state of this viewer and updates the lines. - * Implements IDocumentListener. - */ - private void documentChanged(DocumentEvent e, boolean dirty) { - - IDocument doc= e.getDocument(); - - if (doc == fLeft.getSourceViewer().getDocument()) { - setLeftDirty(dirty); - } else if (doc == fRight.getSourceViewer().getDocument()) { - setRightDirty(dirty); - } - if (!isLeftDirty() && !isRightDirty()) { - fRedoDiff = false; - } - updateLines(doc); - } - - /* - * This method is called if a range of text on one side is copied into an empty sub-document - * on the other side. The method returns the position where the sub-document is placed into the base document. - * This default implementation determines the position by using the text range differencer. - * However this position is not always optimal for specific types of text. - * So subclasses (which are aware of the type of text they are dealing with) - * may override this method to find a better position where to insert a newly added - * piece of text. - * @param type the side for which the insertion position should be determined: 'A' for ancestor, 'L' for left hand side, 'R' for right hand side. - * @param input the current input object of this viewer - * @since 2.0 - */ - protected int findInsertionPosition(char type, ICompareInput input) { - - ITypedElement other= null; - char otherType= 0; - - switch (type) { - case ANCESTOR_CONTRIBUTOR: - other= input.getLeft(); - otherType= LEFT_CONTRIBUTOR; - if (other == null) { - other= input.getRight(); - otherType= RIGHT_CONTRIBUTOR; - } - break; - case LEFT_CONTRIBUTOR: - other= input.getRight(); - otherType= RIGHT_CONTRIBUTOR; - if (other == null) { - other= input.getAncestor(); - otherType= ANCESTOR_CONTRIBUTOR; - } - break; - case RIGHT_CONTRIBUTOR: - other= input.getLeft(); - otherType= LEFT_CONTRIBUTOR; - if (other == null) { - other= input.getAncestor(); - otherType= ANCESTOR_CONTRIBUTOR; - } - break; - } - - if (other instanceof IDocumentRange) { - IDocumentRange dr= (IDocumentRange) other; - Position p= dr.getRange(); - Diff diff= findDiff(otherType, p.offset); - return fMerger.findInsertionPoint(diff, type); - } - return 0; - } - - private void setError(char type, String message) { - IMergeViewerContentProvider cp= getMergeContentProvider(); - if (cp instanceof MergeViewerContentProvider) { - MergeViewerContentProvider mcp= (MergeViewerContentProvider) cp; - switch (type) { - case ANCESTOR_CONTRIBUTOR: - mcp.setAncestorError(message); - break; - case LEFT_CONTRIBUTOR: - mcp.setLeftError(message); - break; - case RIGHT_CONTRIBUTOR: - mcp.setRightError(message); - break; - } - } - fHasErrors= true; - } - - private void updateDirtyState(IEditorInput key, - IDocumentProvider documentProvider, char type) { - boolean dirty = documentProvider.canSaveDocument(key); - boolean oldLeftDirty = isLeftDirty(); - boolean oldRightDirty = isRightDirty(); - if (type == LEFT_CONTRIBUTOR) - setLeftDirty(dirty); - else if (type == RIGHT_CONTRIBUTOR) - setRightDirty(dirty); - if ((oldLeftDirty && !isLeftDirty()) - || (oldRightDirty && !isRightDirty())) { - /* - * Dirty state has changed from true to false, combined dirty state - * is false. _In most cases_ this means that save has taken place - * outside compare editor. Ask to redo diff calculation when the - * editor gets focus. - * - * However, undoing all the changes made in another editor would - * result in asking for redo diff as well. In this case, we set the - * flag back to false, see - * TextMergeViewer.documentChanged(DocumentEvent, boolean) - */ - fRedoDiff = true; - } - } - - private Position getNewRange(char type, Object input) { - switch (type) { - case ANCESTOR_CONTRIBUTOR: - return (Position) fNewAncestorRanges.get(input); - case LEFT_CONTRIBUTOR: - return (Position) fNewLeftRanges.get(input); - case RIGHT_CONTRIBUTOR: - return (Position) fNewRightRanges.get(input); - } - return null; - } - - private void addNewRange(char type, Object input, Position range) { - switch (type) { - case ANCESTOR_CONTRIBUTOR: - fNewAncestorRanges.put(input, range); - break; - case LEFT_CONTRIBUTOR: - fNewLeftRanges.put(input, range); - break; - case RIGHT_CONTRIBUTOR: - fNewRightRanges.put(input, range); - break; - } - } - - /** - * Returns the contents of the underlying document as an array of bytes using the current workbench encoding. - * - * @param left if <code>true</code> the contents of the left side is returned; otherwise the right side - * @return the contents of the left or right document or null - */ - protected byte[] getContents(boolean left) { - MergeSourceViewer v= left ? fLeft : fRight; - if (v != null) { - IDocument d= v.getSourceViewer().getDocument(); - if (d != null) { - String contents= d.get(); - if (contents != null) { - byte[] bytes; - try { - bytes= contents.getBytes(left ? fLeftContributor.internalGetEncoding() : fRightContributor.internalGetEncoding()); - } catch(UnsupportedEncodingException ex) { - // use default encoding - bytes= contents.getBytes(); - } - return bytes; - } - } - } - return null; - } - - private IRegion normalizeDocumentRegion(IDocument doc, IRegion region) { - - if (region == null || doc == null) - return region; - - int maxLength= doc.getLength(); - - int start= region.getOffset(); - if (start < 0) - start= 0; - else if (start > maxLength) - start= maxLength; - - int length= region.getLength(); - if (length < 0) - length= 0; - else if (start + length > maxLength) - length= maxLength - start; - - return new Region(start, length); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleResizeAncestor(int, int, int, int) - */ - protected final void handleResizeAncestor(int x, int y, int width, int height) { - if (width > 0) { - Rectangle trim= fLeft.getSourceViewer().getTextWidget().computeTrim(0, 0, 0, 0); - int scrollbarHeight= trim.height; - if (Utilities.okToUse(fAncestorCanvas)) - fAncestorCanvas.setVisible(true); - if (fAncestor.isControlOkToUse()) - fAncestor.getSourceViewer().getTextWidget().setVisible(true); - - if (fAncestorCanvas != null) { - fAncestorCanvas.setBounds(x, y, fMarginWidth, height-scrollbarHeight); - x+= fMarginWidth; - width-= fMarginWidth; - } - fAncestor.setBounds(x, y, width, height); - } else { - if (Utilities.okToUse(fAncestorCanvas)) - fAncestorCanvas.setVisible(false); - if (fAncestor.isControlOkToUse()) { - StyledText t= fAncestor.getSourceViewer().getTextWidget(); - t.setVisible(false); - fAncestor.setBounds(0, 0, 0, 0); - if (fFocusPart == fAncestor) { - fFocusPart= fLeft; - fFocusPart.getSourceViewer().getTextWidget().setFocus(); - } - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleResizeLeftRight(int, int, int, int, int, int) - */ - protected final void handleResizeLeftRight(int x, int y, int width1, int centerWidth, int width2, int height) { - - if (fBirdsEyeCanvas != null) - width2-= BIRDS_EYE_VIEW_WIDTH; - - Rectangle trim= fLeft.getSourceViewer().getTextWidget().computeTrim(0, 0, 0, 0); - int scrollbarHeight= trim.height + trim.x; - - Composite composite= (Composite) getControl(); - - int leftTextWidth= width1; - if (fLeftCanvas != null) { - fLeftCanvas.setBounds(x, y, fMarginWidth, height-scrollbarHeight); - x+= fMarginWidth; - leftTextWidth-= fMarginWidth; - } - - fLeft.setBounds(x, y, leftTextWidth, height); - x+= leftTextWidth; - - if (fCenter == null || fCenter.isDisposed()) - fCenter= createCenterControl(composite); - fCenter.setBounds(x, y, centerWidth, height-scrollbarHeight); - x+= centerWidth; - - if (!fSynchronizedScrolling) { // canvas is to the left of text - if (fRightCanvas != null) { - fRightCanvas.setBounds(x, y, fMarginWidth, height-scrollbarHeight); - fRightCanvas.redraw(); - x+= fMarginWidth; - } - // we draw the canvas to the left of the text widget - } - - int scrollbarWidth= 0; - if (fSynchronizedScrolling && fScrollCanvas != null) { - trim= fLeft.getSourceViewer().getTextWidget().computeTrim(0, 0, 0, 0); - // one pixel was cut off - scrollbarWidth= trim.width + 2*trim.x+1; - } - int rightTextWidth= width2-scrollbarWidth; - if (fRightCanvas != null) - rightTextWidth-= fMarginWidth; - fRight.setBounds(x, y, rightTextWidth, height); - x+= rightTextWidth; - - if (fSynchronizedScrolling) { - if (fRightCanvas != null) { // canvas is to the right of the text - fRightCanvas.setBounds(x, y, fMarginWidth, height-scrollbarHeight); - x+= fMarginWidth; - } - if (fScrollCanvas != null) - fScrollCanvas.setBounds(x, y, scrollbarWidth, height-scrollbarHeight); - } - - if (fBirdsEyeCanvas != null) { - int verticalScrollbarButtonHeight= scrollbarWidth; - int horizontalScrollbarButtonHeight= scrollbarHeight; - if (fIsMac) { - verticalScrollbarButtonHeight+= 2; - horizontalScrollbarButtonHeight= 18; - } - if (fSummaryHeader != null) - fSummaryHeader.setBounds(x+scrollbarWidth, y, BIRDS_EYE_VIEW_WIDTH, verticalScrollbarButtonHeight); - y+= verticalScrollbarButtonHeight; - fBirdsEyeCanvas.setBounds(x+scrollbarWidth, y, BIRDS_EYE_VIEW_WIDTH, height-(2*verticalScrollbarButtonHeight+horizontalScrollbarButtonHeight)); - } - - // doesn't work since TextEditors don't have their correct size yet. - updateVScrollBar(); - refreshBirdsEyeView(); - } - - /* - * Track selection changes to update the current Diff. - */ - private void handleSelectionChanged(MergeSourceViewer tw) { - Point p= tw.getSourceViewer().getSelectedRange(); - Diff d= findDiff(tw, p.x, p.x+p.y); - updateStatus(d); - setCurrentDiff(d, false); // don't select or reveal - } - - private static IRegion toRegion(Position position) { - if (position != null) - return new Region(position.getOffset(), position.getLength()); - return null; - } - - //---- the differencing - - /** - * Perform a two level 2- or 3-way diff. - * The first level is based on line comparison, the second level on token comparison. - */ - private void doDiff() { - IDocument lDoc= fLeft.getSourceViewer().getDocument(); - IDocument rDoc= fRight.getSourceViewer().getDocument(); - if (lDoc == null || rDoc == null) - return; - fAncestor.resetLineBackground(); - fLeft.resetLineBackground(); - fRight.resetLineBackground(); - - fCurrentDiff= null; - try { - fMerger.doDiff(); - } catch (CoreException e) { - CompareUIPlugin.log(e.getStatus()); - String title= Utilities.getString(getResourceBundle(), "tooComplexError.title"); //$NON-NLS-1$ - String msg= Utilities.getString(getResourceBundle(), "tooComplexError.message"); //$NON-NLS-1$ - MessageDialog.openError(fComposite.getShell(), title, msg); - } - - invalidateTextPresentation(); - } - - private Diff findDiff(char type, int pos) { - try { - return fMerger.findDiff(type, pos); - } catch (CoreException e) { - CompareUIPlugin.log(e.getStatus()); - String title= Utilities.getString(getResourceBundle(), "tooComplexError.title"); //$NON-NLS-1$ - String msg= Utilities.getString(getResourceBundle(), "tooComplexError.message"); //$NON-NLS-1$ - MessageDialog.openError(fComposite.getShell(), title, msg); - return null; - } - } - - private void resetPositions(IDocument doc) { - if (doc == null) - return; - try { - doc.removePositionCategory(DIFF_RANGE_CATEGORY); - } catch (BadPositionCategoryException e) { - // Ignore - } - doc.addPositionCategory(DIFF_RANGE_CATEGORY); - } - - //---- update UI stuff - - private void updateControls() { - if (getControl().isDisposed()) - return; - - boolean leftToRight= false; - boolean rightToLeft= false; - - updateStatus(fCurrentDiff); - updateResolveStatus(); - - if (fCurrentDiff != null) { - IMergeViewerContentProvider cp= getMergeContentProvider(); - if (cp != null) { - if (!isPatchHunk()) { - rightToLeft= cp.isLeftEditable(getInput()); - leftToRight= cp.isRightEditable(getInput()); - } - } - } - - if (fDirectionLabel != null) { - if (fHighlightRanges && fCurrentDiff != null && isThreeWay() && !isIgnoreAncestor()) { - fDirectionLabel.setImage(fCurrentDiff.getImage()); - } else { - fDirectionLabel.setImage(null); - } - } - - if (fCopyDiffLeftToRightItem != null) - ((Action)fCopyDiffLeftToRightItem.getAction()).setEnabled(leftToRight); - if (fCopyDiffRightToLeftItem != null) - ((Action)fCopyDiffRightToLeftItem.getAction()).setEnabled(rightToLeft); - - if (fNextDiff != null) { - IAction a = fNextDiff.getAction(); - a.setEnabled(isNavigationButtonEnabled(true, false)); - } - if (fPreviousDiff != null) { - IAction a = fPreviousDiff.getAction(); - a.setEnabled(isNavigationButtonEnabled(false, false)); - } - if (fNextChange != null) { - IAction a = fNextChange.getAction(); - a.setEnabled(isNavigationButtonEnabled(true, true)); - } - if (fPreviousChange != null) { - IAction a = fPreviousChange.getAction(); - a.setEnabled(isNavigationButtonEnabled(false, true)); - } - } - - private boolean isNavigationButtonEnabled(boolean down, boolean deep) { - String value = fPreferenceStore - .getString(ICompareUIConstants.PREF_NAVIGATION_END_ACTION); - if (value.equals(ICompareUIConstants.PREF_VALUE_DO_NOTHING)) { - return getNextVisibleDiff(down, deep) != null; - } else if (value.equals(ICompareUIConstants.PREF_VALUE_LOOP)) { - return isNavigationPossible(); - } else if (value.equals(ICompareUIConstants.PREF_VALUE_NEXT)) { - return getNextVisibleDiff(down, deep) != null || hasNextElement(down); - } else if (value.equals(ICompareUIConstants.PREF_VALUE_PROMPT)) { - return isNavigationPossible() || hasNextElement(true); - } - Assert.isTrue(false); - return false; - } - - private void updateResolveStatus() { - - RGB rgb= null; - - if (showResolveUI()) { - // we only show red or green if there is at least one incoming or conflicting change - int incomingOrConflicting= 0; - int unresolvedIncoming= 0; - int unresolvedConflicting= 0; - - if (fMerger.hasChanges()) { - for (Iterator iterator = fMerger.changesIterator(); iterator - .hasNext();) { - Diff d = (Diff) iterator.next(); - if (d.isIncomingOrConflicting() /* && useChange(d.fDirection) && !d.fIsWhitespace */) { - incomingOrConflicting++; - if (!d.isResolved()) { - if (d.getKind() == RangeDifference.CONFLICT) { - unresolvedConflicting++; - break; // we can stop here because a conflict has the maximum priority - } - unresolvedIncoming++; - } - } - } - } - - if (incomingOrConflicting > 0) { - if (unresolvedConflicting > 0) - rgb= SELECTED_CONFLICT; - else if (unresolvedIncoming > 0) - rgb= SELECTED_INCOMING; - else - rgb= RESOLVED; - } - } - - if (fHeaderPainter.setColor(rgb)) - fSummaryHeader.redraw(); - } - - private void updateStatus(Diff diff) { - - String diffDescription; - - if (diff == null) { - diffDescription= CompareMessages.TextMergeViewer_diffDescription_noDiff_format; - } else { - - if (diff.isToken()) // we don't show special info for token diffs - diff= diff.getParent(); - - String format= CompareMessages.TextMergeViewer_diffDescription_diff_format; - diffDescription= MessageFormat.format(format, - new String[] { - getDiffType(diff), // 0: diff type - getDiffNumber(diff), // 1: diff number - getDiffRange(fLeft, diff.getPosition(LEFT_CONTRIBUTOR)), // 2: left start line - getDiffRange(fRight, diff.getPosition(RIGHT_CONTRIBUTOR)) // 3: left end line - } - ); - } - - String format= CompareMessages.TextMergeViewer_statusLine_format; - String s= MessageFormat.format(format, - new String[] { - getCursorPosition(fLeft), // 0: left column - getCursorPosition(fRight), // 1: right column - diffDescription // 2: diff description - } - ); - - getCompareConfiguration().getContainer().setStatusMessage(s); - } - - private String getDiffType(Diff diff) { - String s= ""; //$NON-NLS-1$ - switch(diff.getKind()) { - case RangeDifference.LEFT: - s= CompareMessages.TextMergeViewer_direction_outgoing; - break; - case RangeDifference.RIGHT: - s= CompareMessages.TextMergeViewer_direction_incoming; - break; - case RangeDifference.CONFLICT: - s= CompareMessages.TextMergeViewer_direction_conflicting; - break; - } - String format= CompareMessages.TextMergeViewer_diffType_format; - return MessageFormat.format(format, new String[] { s, diff.changeType() } ); - } - - private String getDiffNumber(Diff diff) { - // find the diff's number - int diffNumber= 0; - if (fMerger.hasChanges()) { - for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) { - Diff d = (Diff) iterator.next(); - diffNumber++; - if (d == diff) - break; - } - } - return Integer.toString(diffNumber); - } - - private String getDiffRange(MergeSourceViewer v, Position pos) { - Point p= v.getLineRange(pos, new Point(0, 0)); - int startLine= p.x+1; - int endLine= p.x+p.y; - - String format; - if (endLine < startLine) - format= CompareMessages.TextMergeViewer_beforeLine_format; - else - format= CompareMessages.TextMergeViewer_range_format; - return MessageFormat.format(format, - new String[] { Integer.toString(startLine), - Integer.toString(endLine) } ); - } - - /* - * Returns a description of the cursor position. - * - * @return a description of the cursor position - */ - private String getCursorPosition(MergeSourceViewer v) { - if (v != null) { - StyledText styledText= v.getSourceViewer().getTextWidget(); - - IDocument document= v.getSourceViewer().getDocument(); - if (document != null) { - int offset= v.getSourceViewer().getVisibleRegion().getOffset(); - int caret= offset + styledText.getCaretOffset(); - - try { - - int line=document.getLineOfOffset(caret); - - int lineOffset= document.getLineOffset(line); - int occurrences= 0; - for (int i= lineOffset; i < caret; i++) - if ('\t' == document.getChar(i)) - ++ occurrences; - - int tabWidth= styledText.getTabs(); - int column= caret - lineOffset + (tabWidth -1) * occurrences; - - String format= CompareMessages.TextMergeViewer_cursorPosition_format; - return MessageFormat.format(format, - new String[] { Integer.toString(line + 1), Integer.toString(column + 1) } ); - - } catch (BadLocationException x) { - // silently ignored - } - } - } - return ""; //$NON-NLS-1$ - } - - protected void updateHeader() { - - super.updateHeader(); - - updateControls(); - } - - /* - * Creates the two items for copying a difference range from one side to the other - * and adds them to the given toolbar manager. - */ - protected void createToolItems(ToolBarManager tbm) { - - fHandlerService= CompareHandlerService.createFor(getCompareConfiguration().getContainer(), fLeft.getSourceViewer().getControl().getShell()); - - final String ignoreAncestorActionKey= "action.IgnoreAncestor."; //$NON-NLS-1$ - Action ignoreAncestorAction= new Action() { - public void run() { - // First make sure the ancestor is hidden - if (!isIgnoreAncestor()) - getCompareConfiguration().setProperty(ICompareUIConstants.PROP_ANCESTOR_VISIBLE, Boolean.FALSE); - // Then set the property to ignore the ancestor - getCompareConfiguration().setProperty(ICompareUIConstants.PROP_IGNORE_ANCESTOR, Boolean.valueOf(!isIgnoreAncestor())); - Utilities.initToggleAction(this, getResourceBundle(), ignoreAncestorActionKey, isIgnoreAncestor()); - } - }; - ignoreAncestorAction.setChecked(isIgnoreAncestor()); - Utilities.initAction(ignoreAncestorAction, getResourceBundle(), ignoreAncestorActionKey); - Utilities.initToggleAction(ignoreAncestorAction, getResourceBundle(), ignoreAncestorActionKey, isIgnoreAncestor()); - - fIgnoreAncestorItem= new ActionContributionItem(ignoreAncestorAction); - fIgnoreAncestorItem.setVisible(false); - tbm.appendToGroup("modes", fIgnoreAncestorItem); //$NON-NLS-1$ - - tbm.add(new Separator()); - - Action a= new Action() { - public void run() { - if (navigate(true, false, false)) { - endOfDocumentReached(true); - } - } - }; - Utilities.initAction(a, getResourceBundle(), "action.NextDiff."); //$NON-NLS-1$ - fNextDiff= new ActionContributionItem(a); - tbm.appendToGroup("navigation", fNextDiff); //$NON-NLS-1$ - // Don't register this action since it is probably registered by the container - - a= new Action() { - public void run() { - if (navigate(false, false, false)) { - endOfDocumentReached(false); - } - } - }; - Utilities.initAction(a, getResourceBundle(), "action.PrevDiff."); //$NON-NLS-1$ - fPreviousDiff= new ActionContributionItem(a); - tbm.appendToGroup("navigation", fPreviousDiff); //$NON-NLS-1$ - // Don't register this action since it is probably registered by the container - - a= new Action() { - public void run() { - if (navigate(true, false, true)) { - endOfDocumentReached(true); - } - } - }; - Utilities.initAction(a, getResourceBundle(), "action.NextChange."); //$NON-NLS-1$ - fNextChange= new ActionContributionItem(a); - tbm.appendToGroup("navigation", fNextChange); //$NON-NLS-1$ - fHandlerService.registerAction(a, "org.eclipse.compare.selectNextChange"); //$NON-NLS-1$ - - a= new Action() { - public void run() { - if (navigate(false, false, true)) { - endOfDocumentReached(false); - } - } - }; - Utilities.initAction(a, getResourceBundle(), "action.PrevChange."); //$NON-NLS-1$ - fPreviousChange= new ActionContributionItem(a); - tbm.appendToGroup("navigation", fPreviousChange); //$NON-NLS-1$ - fHandlerService.registerAction(a, "org.eclipse.compare.selectPreviousChange"); //$NON-NLS-1$ - - CompareConfiguration cc= getCompareConfiguration(); - - if (cc.isRightEditable()) { - a= new Action() { - public void run() { - copyDiffLeftToRight(); - } - }; - Utilities.initAction(a, getResourceBundle(), "action.CopyDiffLeftToRight."); //$NON-NLS-1$ - fCopyDiffLeftToRightItem= new ActionContributionItem(a); - fCopyDiffLeftToRightItem.setVisible(true); - tbm.appendToGroup("merge", fCopyDiffLeftToRightItem); //$NON-NLS-1$ - fHandlerService.registerAction(a, "org.eclipse.compare.copyLeftToRight"); //$NON-NLS-1$ - } - - if (cc.isLeftEditable()) { - a= new Action() { - public void run() { - copyDiffRightToLeft(); - } - }; - Utilities.initAction(a, getResourceBundle(), "action.CopyDiffRightToLeft."); //$NON-NLS-1$ - fCopyDiffRightToLeftItem= new ActionContributionItem(a); - fCopyDiffRightToLeftItem.setVisible(true); - tbm.appendToGroup("merge", fCopyDiffRightToLeftItem); //$NON-NLS-1$ - fHandlerService.registerAction(a, "org.eclipse.compare.copyRightToLeft"); //$NON-NLS-1$ - } - - fIgnoreWhitespace= ChangePropertyAction.createIgnoreWhiteSpaceAction(getResourceBundle(), getCompareConfiguration()); - fIgnoreWhitespace.setActionDefinitionId(ICompareUIConstants.COMMAND_IGNORE_WHITESPACE); - fLeft.addTextAction(fIgnoreWhitespace); - fRight.addTextAction(fIgnoreWhitespace); - fAncestor.addTextAction(fIgnoreWhitespace); - fHandlerService.registerAction(fIgnoreWhitespace, fIgnoreWhitespace.getActionDefinitionId()); - - boolean needsLeftPainter= !isEditorBacked(fLeft.getSourceViewer()); - boolean needsRightPainter= !isEditorBacked(fLeft.getSourceViewer()); - boolean needsAncestorPainter= !isEditorBacked(fAncestor.getSourceViewer()); - showWhitespaceAction = new ShowWhitespaceAction( - new MergeSourceViewer[] {fLeft, fRight, fAncestor}, - new boolean[] {needsLeftPainter, needsRightPainter, needsAncestorPainter }); - fHandlerService.registerAction(showWhitespaceAction, ITextEditorActionDefinitionIds.SHOW_WHITESPACE_CHARACTERS); - - toggleLineNumbersAction = new TextEditorPropertyAction(CompareMessages.TextMergeViewer_16, new MergeSourceViewer[] { - fLeft, fRight, fAncestor - }, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER); - fHandlerService.registerAction(toggleLineNumbersAction, ITextEditorActionDefinitionIds.LINENUMBER_TOGGLE); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handlePropertyChangeEvent(org.eclipse.jface.util.PropertyChangeEvent) - */ - protected void handlePropertyChangeEvent(PropertyChangeEvent event) { - String key= event.getProperty(); - - if (key.equals(CompareConfiguration.IGNORE_WHITESPACE) - || key.equals(ComparePreferencePage.SHOW_PSEUDO_CONFLICTS)) { - - fShowPseudoConflicts= fPreferenceStore.getBoolean(ComparePreferencePage.SHOW_PSEUDO_CONFLICTS); - - update(true); - // selectFirstDiff(true); - if (fFocusPart != null) - handleSelectionChanged(fFocusPart); - -// } else if (key.equals(ComparePreferencePage.USE_SPLINES)) { -// fUseSplines= fPreferenceStore.getBoolean(ComparePreferencePage.USE_SPLINES); -// invalidateLines(); - - } else if (key.equals(ComparePreferencePage.USE_SINGLE_LINE)) { - fUseSingleLine= fPreferenceStore.getBoolean(ComparePreferencePage.USE_SINGLE_LINE); -// fUseResolveUI= fUseSingleLine; - fBasicCenterCurve= null; - updateControls(); - invalidateLines(); - - } else if (key.equals(ComparePreferencePage.HIGHLIGHT_TOKEN_CHANGES)) { - fHighlightTokenChanges= fPreferenceStore.getBoolean(ComparePreferencePage.HIGHLIGHT_TOKEN_CHANGES); - updateControls(); - updatePresentation(); - -// } else if (key.equals(ComparePreferencePage.USE_RESOLVE_UI)) { -// fUseResolveUI= fPreferenceStore.getBoolean(ComparePreferencePage.USE_RESOLVE_UI); -// updateResolveStatus(); -// invalidateLines(); - - } else if (key.equals(fSymbolicFontName)) { - updateFont(); - invalidateLines(); - - } else if (key.equals(INCOMING_COLOR) || key.equals(OUTGOING_COLOR) || key.equals(CONFLICTING_COLOR) || key.equals(RESOLVED_COLOR)) { - updateColors(null); - invalidateLines(); - invalidateTextPresentation(); - - } else if (key.equals(ComparePreferencePage.SYNCHRONIZE_SCROLLING)) { - boolean b= fPreferenceStore.getBoolean(ComparePreferencePage.SYNCHRONIZE_SCROLLING); - setSyncScrolling(b); - - } else if (key.equals(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND)) { - if (!fIsUsingSystemBackground) { - setBackgroundColor(createColor(fPreferenceStore, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND)); - } - - } else if (key.equals(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)) { - fIsUsingSystemBackground= fPreferenceStore.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT); - if (fIsUsingSystemBackground) { - setBackgroundColor(null); - } else { - setBackgroundColor(createColor(fPreferenceStore, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND)); - } - } else if (key.equals(AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND)) { - if (!fIsUsingSystemForeground) { - setForegroundColor(createColor(fPreferenceStore, AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND)); - } - - } else if (key.equals(AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT)) { - fIsUsingSystemForeground= fPreferenceStore.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT); - if (fIsUsingSystemForeground) { - setForegroundColor(null); - } else { - setForegroundColor(createColor(fPreferenceStore, AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND)); - } - } else if (key.equals(ICompareUIConstants.PREF_NAVIGATION_END_ACTION)) { - updateControls(); - } else { - super.handlePropertyChangeEvent(event); - - if (key.equals(ICompareUIConstants.PROP_IGNORE_ANCESTOR)) { - update(true); - selectFirstDiff(true); - } - } - } - - private void selectFirstDiff(boolean first) { - - if (fLeft == null || fRight == null) { - return; - } - if (fLeft.getSourceViewer().getDocument() == null || fRight.getSourceViewer().getDocument() == null) { - return; - } - - Diff firstDiff= null; - if (first) - firstDiff= findNext(fRight, -1, -1, false); - else - firstDiff= findPrev(fRight, 9999999, 9999999, false); - setCurrentDiff(firstDiff, true); - } - - - - private void setSyncScrolling(boolean newMode) { - if (fSynchronizedScrolling != newMode) { - fSynchronizedScrolling= newMode; - - scrollVertical(0, 0, 0, null); - - // throw away central control (Sash or Canvas) - Control center= getCenterControl(); - if (center != null && !center.isDisposed()) - center.dispose(); - - fLeft.getSourceViewer().getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling); - fRight.getSourceViewer().getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling); - - fComposite.layout(true); - } - } - - protected void updateToolItems() { - //only update toolbar items if diffs need to be calculated (which - //dictates whether a toolbar gets added at all) - if (!isPatchHunk()){ - if (fIgnoreAncestorItem != null) - fIgnoreAncestorItem.setVisible(isThreeWay()); - - if (fCopyDiffLeftToRightItem != null) { - IAction a= fCopyDiffLeftToRightItem.getAction(); - if (a != null) - a.setEnabled(a.isEnabled() && !fHasErrors); - } - if (fCopyDiffRightToLeftItem != null) { - IAction a= fCopyDiffRightToLeftItem.getAction(); - if (a != null) - a.setEnabled(a.isEnabled() && !fHasErrors); - } - - super.updateToolItems(); - } - } - - //---- painting lines - - private void updateLines(IDocument d) { - - boolean left= false; - boolean right= false; - - // FIXME: this optimization is incorrect because - // it doesn't take replace operations into account where - // the old and new line count does not differ - if (d == fLeft.getSourceViewer().getDocument()) { - int l= fLeft.getLineCount(); - left= fLeftLineCount != l; - fLeftLineCount= l; - } else if (d == fRight.getSourceViewer().getDocument()) { - int l= fRight.getLineCount(); - right= fRightLineCount != l; - fRightLineCount= l; - } - - if (left || right) { - - if (left) { - if (fLeftCanvas != null) - fLeftCanvas.redraw(); - } else { - if (fRightCanvas != null) - fRightCanvas.redraw(); - } - Control center= getCenterControl(); - if (center != null) - center.redraw(); - - updateVScrollBar(); - refreshBirdsEyeView(); - } - } - - private void invalidateLines() { - if (isThreeWay() && isAncestorVisible()) { - if (Utilities.okToUse(fAncestorCanvas)) - fAncestorCanvas.redraw(); - if (fAncestor != null && fAncestor.isControlOkToUse()) - fAncestor.getSourceViewer().getTextWidget().redraw(); - } - - if (Utilities.okToUse(fLeftCanvas)) - fLeftCanvas.redraw(); - - if (fLeft != null && fLeft.isControlOkToUse()) - fLeft.getSourceViewer().getTextWidget().redraw(); - - if (Utilities.okToUse(getCenterControl())) - getCenterControl().redraw(); - - if (fRight != null && fRight.isControlOkToUse()) - fRight.getSourceViewer().getTextWidget().redraw(); - - if (Utilities.okToUse(fRightCanvas)) - fRightCanvas.redraw(); - } - - private boolean showResolveUI() { - if (!fUseResolveUI || !isThreeWay() || isIgnoreAncestor()) - return false; - CompareConfiguration cc= getCompareConfiguration(); - // we only enable the new resolve UI if exactly one side is editable - boolean l= cc.isLeftEditable(); - boolean r= cc.isRightEditable(); - //return (l && !r) || (r && !l); - return l || r; - } - - private void paintCenter(Canvas canvas, GC g) { - - Display display= canvas.getDisplay(); - - checkForColorUpdate(display); - - if (! fSynchronizedScrolling) - return; - - int lineHeightLeft= fLeft.getSourceViewer().getTextWidget().getLineHeight(); - int lineHeightRight= fRight.getSourceViewer().getTextWidget().getLineHeight(); - int visibleHeight= fRight.getViewportHeight(); - - Point size= canvas.getSize(); - int x= 0; - int w= size.x; - - g.setBackground(canvas.getBackground()); - g.fillRectangle(x+1, 0, w-2, size.y); - - if (!fIsMotif) { - // draw thin line between center ruler and both texts - g.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); - g.fillRectangle(0, 0, 1, size.y); - g.fillRectangle(w-1, 0, 1, size.y); - } - - if (! fHighlightRanges) - return; - - boolean showResolveUI= showResolveUI(); - - if (fMerger.hasChanges()) { - int lshift= fLeft.getVerticalScrollOffset(); - int rshift= fRight.getVerticalScrollOffset(); - - Point region= new Point(0, 0); - - for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - if (diff.isDeleted()) - continue; - - if (fShowCurrentOnly2 && !isCurrentDiff(diff)) - continue; - - fLeft.getLineRange(diff.getPosition(LEFT_CONTRIBUTOR), region); - int ly= (region.x * lineHeightLeft) + lshift; - int lh= region.y * lineHeightLeft; - - fRight.getLineRange(diff.getPosition(RIGHT_CONTRIBUTOR), region); - int ry= (region.x * lineHeightRight) + rshift; - int rh= region.y * lineHeightRight; - - if (Math.max(ly+lh, ry+rh) < 0) - continue; - if (Math.min(ly, ry) >= visibleHeight) - break; - - fPts[0]= x; fPts[1]= ly; fPts[2]= w; fPts[3]= ry; - fPts[6]= x; fPts[7]= ly+lh; fPts[4]= w; fPts[5]= ry+rh; - - Color fillColor= getColor(display, getFillColor(diff)); - Color strokeColor= getColor(display, getStrokeColor(diff)); - - if (fUseSingleLine) { - int w2= 3; - - g.setBackground(fillColor); - g.fillRectangle(0, ly, w2, lh); // left - g.fillRectangle(w-w2, ry, w2, rh); // right - - g.setLineWidth(0 /* LW */); - g.setForeground(strokeColor); - g.drawRectangle(0-1, ly, w2, lh); // left - g.drawRectangle(w-w2, ry, w2, rh); // right - - if (fUseSplines) { - int[] points= getCenterCurvePoints(w2, ly+lh/2, w-w2, ry+rh/2); - for (int i= 1; i < points.length; i++) - g.drawLine(w2+i-1, points[i-1], w2+i, points[i]); - } else { - g.drawLine(w2, ly+lh/2, w-w2, ry+rh/2); - } - } else { - // two lines - if (fUseSplines) { - g.setBackground(fillColor); - - g.setLineWidth(0 /* LW */); - g.setForeground(strokeColor); - - int[] topPoints= getCenterCurvePoints(fPts[0], fPts[1], fPts[2], fPts[3]); - int[] bottomPoints= getCenterCurvePoints(fPts[6], fPts[7], fPts[4], fPts[5]); - g.setForeground(fillColor); - g.drawLine(0, bottomPoints[0], 0, topPoints[0]); - for (int i= 1; i < bottomPoints.length; i++) { - g.setForeground(fillColor); - g.drawLine(i, bottomPoints[i], i, topPoints[i]); - g.setForeground(strokeColor); - g.drawLine(i-1, topPoints[i-1], i, topPoints[i]); - g.drawLine(i-1, bottomPoints[i-1], i, bottomPoints[i]); - } - } else { - g.setBackground(fillColor); - g.fillPolygon(fPts); - - g.setLineWidth(0 /* LW */); - g.setForeground(strokeColor); - g.drawLine(fPts[0], fPts[1], fPts[2], fPts[3]); - g.drawLine(fPts[6], fPts[7], fPts[4], fPts[5]); - } - } - - if (fUseSingleLine && showResolveUI && diff.isUnresolvedIncomingOrConflicting()) { - // draw resolve state - int cx= (w-RESOLVE_SIZE)/2; - int cy= ((ly+lh/2) + (ry+rh/2) - RESOLVE_SIZE)/2; - - g.setBackground(fillColor); - g.fillRectangle(cx, cy, RESOLVE_SIZE, RESOLVE_SIZE); - - g.setForeground(strokeColor); - g.drawRectangle(cx, cy, RESOLVE_SIZE, RESOLVE_SIZE); - } - } - } - } - - private int[] getCenterCurvePoints(int startx, int starty, int endx, int endy) { - if (fBasicCenterCurve == null) - buildBaseCenterCurve(endx-startx); - double height= endy - starty; - height= height/2; - int width= endx-startx; - int[] points= new int[width]; - for (int i= 0; i < width; i++) { - points[i]= (int) (-height * fBasicCenterCurve[i] + height + starty); - } - return points; - } - - private void buildBaseCenterCurve(int w) { - double width= w; - fBasicCenterCurve= new double[getCenterWidth()]; - for (int i= 0; i < getCenterWidth(); i++) { - double r= i / width; - fBasicCenterCurve[i]= Math.cos(Math.PI * r); - } - } - - private void paintSides(GC g, MergeSourceViewer tp, Canvas canvas, boolean right) { - - Display display= canvas.getDisplay(); - - int lineHeight= tp.getSourceViewer().getTextWidget().getLineHeight(); - int visibleHeight= tp.getViewportHeight(); - - Point size= canvas.getSize(); - int x= 0; - int w= fMarginWidth; - int w2= w/2; - - g.setBackground(canvas.getBackground()); - g.fillRectangle(x, 0, w, size.y); - - if (!fIsMotif) { - // draw thin line between ruler and text - g.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); - if (right) - g.fillRectangle(0, 0, 1, size.y); - else - g.fillRectangle(size.x-1, 0, 1, size.y); - } - - if (! fHighlightRanges) - return; - - if (fMerger.hasChanges()) { - int shift= tp.getVerticalScrollOffset() + (2-LW); - - Point region= new Point(0, 0); - char leg = getLeg(tp); - for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - if (diff.isDeleted()) - continue; - - if (fShowCurrentOnly2 && !isCurrentDiff(diff)) - continue; - - tp.getLineRange(diff.getPosition(leg), region); - int y= (region.x * lineHeight) + shift; - int h= region.y * lineHeight; - - if (y+h < 0) - continue; - if (y >= visibleHeight) - break; - - g.setBackground(getColor(display, getFillColor(diff))); - if (right) - g.fillRectangle(x, y, w2, h); - else - g.fillRectangle(x+w2, y, w2, h); - - g.setLineWidth(0 /* LW */); - g.setForeground(getColor(display, getStrokeColor(diff))); - if (right) - g.drawRectangle(x-1, y-1, w2, h); - else - g.drawRectangle(x+w2, y-1, w2, h); - } - } - } - - private void paint(PaintEvent event, MergeSourceViewer tp) { - - if (! fHighlightRanges) - return; - if (!fMerger.hasChanges()) - return; - - Control canvas= (Control) event.widget; - GC g= event.gc; - - Display display= canvas.getDisplay(); - - int lineHeight= tp.getSourceViewer().getTextWidget().getLineHeight(); - int w= canvas.getSize().x; - int shift= tp.getVerticalScrollOffset() + (2-LW); - int maxh= event.y+event.height; // visibleHeight - - //if (fIsMotif) - shift+= fTopInset; - - Point range= new Point(0, 0); - - char leg = getLeg(tp); - for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - if (diff.isDeleted()) - continue; - - if (fShowCurrentOnly && !isCurrentDiff(diff)) - continue; - - tp.getLineRange(diff.getPosition(leg), range); - int y= (range.x * lineHeight) + shift; - int h= range.y * lineHeight; - - if (y+h < event.y) - continue; - if (y > maxh) - break; - - g.setBackground(getColor(display, getStrokeColor(diff))); - g.fillRectangle(0, y-1, w, LW); - g.fillRectangle(0, y+h-1, w, LW); - } - } - - private RGB getFillColor(Diff diff) { - boolean selected= fCurrentDiff != null && fCurrentDiff.getParent() == diff; - RGB selected_fill= getBackground(null); - if (isThreeWay() && !isIgnoreAncestor()) { - switch (diff.getKind()) { - case RangeDifference.RIGHT: - if (fLeftIsLocal) - return selected ? selected_fill : INCOMING_FILL; - return selected ? selected_fill : OUTGOING_FILL; - case RangeDifference.ANCESTOR: - return selected ? selected_fill : CONFLICT_FILL; - case RangeDifference.LEFT: - if (fLeftIsLocal) - return selected ? selected_fill : OUTGOING_FILL; - return selected ? selected_fill : INCOMING_FILL; - case RangeDifference.CONFLICT: - return selected ? selected_fill : CONFLICT_FILL; - } - return null; - } - return selected ? selected_fill : OUTGOING_FILL; - } - - private RGB getStrokeColor(Diff diff) { - boolean selected= fCurrentDiff != null && fCurrentDiff.getParent() == diff; - - if (isThreeWay() && !isIgnoreAncestor()) { - switch (diff.getKind()) { - case RangeDifference.RIGHT: - if (fLeftIsLocal) - return selected ? SELECTED_INCOMING : INCOMING; - return selected ? SELECTED_OUTGOING : OUTGOING; - case RangeDifference.ANCESTOR: - return selected ? SELECTED_CONFLICT : CONFLICT; - case RangeDifference.LEFT: - if (fLeftIsLocal) - return selected ? SELECTED_OUTGOING : OUTGOING; - return selected ? SELECTED_INCOMING : INCOMING; - case RangeDifference.CONFLICT: - return selected ? SELECTED_CONFLICT : CONFLICT; - } - return null; - } - return selected ? SELECTED_OUTGOING : OUTGOING; - } - - private Color getColor(Display display, RGB rgb) { - if (rgb == null) - return null; - if (fColors == null) - fColors= new HashMap(20); - Color c= (Color) fColors.get(rgb); - if (c == null) { - c= new Color(display, rgb); - fColors.put(rgb, c); - } - return c; - } - - static RGB interpolate(RGB fg, RGB bg, double scale) { - if (fg != null && bg != null) - return new RGB( - (int)((1.0-scale) * fg.red + scale * bg.red), - (int)((1.0-scale) * fg.green + scale * bg.green), - (int)((1.0-scale) * fg.blue + scale * bg.blue) - ); - if (fg != null) - return fg; - if (bg != null) - return bg; - return new RGB(128, 128, 128); // a gray - } - - //---- Navigating and resolving Diffs - - private Diff getNextVisibleDiff(boolean down, boolean deep) { - Diff diff= null; - MergeSourceViewer part= getNavigationPart(); - if (part == null) - return null; - Point s = part.getSourceViewer().getSelectedRange(); - char leg = getLeg(part); - for (;;) { - diff = null; - diff = internalGetNextDiff(down, deep, part, s); - if (diff != null && diff.getKind() == RangeDifference.ANCESTOR - && !isAncestorVisible()) { - Position position = diff.getPosition(leg); - s = new Point(position.getOffset(), position.getLength()); - diff= null; - continue; - } - break; - } - return diff; - } - - private Diff internalGetNextDiff(boolean down, boolean deep, MergeSourceViewer part, Point s) { - if (fMerger.hasChanges()) { - if (down) - return findNext(part, s.x, s.x+s.y, deep); - return findPrev(part, s.x, s.x+s.y, deep); - } - return null; - } - - private MergeSourceViewer getNavigationPart() { - MergeSourceViewer part= fFocusPart; - if (part == null) - part= fRight; - return part; - } - - private Diff getWrappedDiff(Diff diff, boolean down) { - return fMerger.getWrappedDiff(diff, down); - } - - /* - * Returns true if end (or beginning) of document reached. - */ - private boolean navigate(boolean down, boolean wrap, boolean deep) { - Diff diff= null; - boolean wrapped = false; - for (;;) { - diff = getNextVisibleDiff(down, deep); - if (diff == null && wrap) { - if (wrapped) - // We've already wrapped once so break out - break; - wrapped = true; - diff = getWrappedDiff(diff, down); - } - if (diff != null) - setCurrentDiff(diff, true, deep); - if (diff != null && diff.getKind() == RangeDifference.ANCESTOR - && !isAncestorVisible()) - continue; - break; - } - return diff == null; - } - - private void endOfDocumentReached(boolean down) { - Control c= getControl(); - if (Utilities.okToUse(c)) { - handleEndOfDocumentReached(c.getShell(), down); - } - } - - private void handleEndOfDocumentReached(Shell shell, boolean next) { - IPreferenceStore store = CompareUIPlugin.getDefault().getPreferenceStore(); - String value = store.getString(ICompareUIConstants.PREF_NAVIGATION_END_ACTION); - if (!value.equals(ICompareUIConstants.PREF_VALUE_PROMPT)) { - performEndOfDocumentAction(shell, store, ICompareUIConstants.PREF_NAVIGATION_END_ACTION, next); - } else { - shell.getDisplay().beep(); - String loopMessage; - String nextMessage; - String message; - String title; - if (next) { - title = CompareMessages.TextMergeViewer_0; - message = CompareMessages.TextMergeViewer_1; - loopMessage = CompareMessages.TextMergeViewer_2; - nextMessage = CompareMessages.TextMergeViewer_3; - } else { - title = CompareMessages.TextMergeViewer_4; - message = CompareMessages.TextMergeViewer_5; - loopMessage = CompareMessages.TextMergeViewer_6; - nextMessage = CompareMessages.TextMergeViewer_7; - } - String[] localLoopOption = new String[] { loopMessage, ICompareUIConstants.PREF_VALUE_LOOP }; - String[] nextElementOption = new String[] { nextMessage, ICompareUIConstants.PREF_VALUE_NEXT}; - String[] doNothingOption = new String[] { CompareMessages.TextMergeViewer_17, ICompareUIConstants.PREF_VALUE_DO_NOTHING}; - NavigationEndDialog dialog = new NavigationEndDialog(shell, - title, - null, - message, - new String[][] { - localLoopOption, - nextElementOption, - doNothingOption - }); - int result = dialog.open(); - if (result == Window.OK) { - performEndOfDocumentAction(shell, store, ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL, next); - if (dialog.getToggleState()) { - String oldValue = store.getString(ICompareUIConstants.PREF_NAVIGATION_END_ACTION); - store.putValue(ICompareUIConstants.PREF_NAVIGATION_END_ACTION, store.getString(ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL)); - store.firePropertyChangeEvent(ICompareUIConstants.PREF_NAVIGATION_END_ACTION, oldValue, store.getString(ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL)); - } - } - } - } - - private void performEndOfDocumentAction(Shell shell, IPreferenceStore store, String key, boolean next) { - String value = store.getString(key); - if (value.equals(ICompareUIConstants.PREF_VALUE_DO_NOTHING)) { - return; - } - if (value.equals(ICompareUIConstants.PREF_VALUE_NEXT)) { - ICompareNavigator navigator = getCompareConfiguration() - .getContainer().getNavigator(); - if (hasNextElement(next)) { - navigator.selectChange(next); - } - } else { - selectFirstDiff(next); - } - } - - private boolean hasNextElement(boolean down) { - ICompareNavigator navigator = getCompareConfiguration().getContainer().getNavigator(); - if (navigator instanceof CompareNavigator) { - CompareNavigator n = (CompareNavigator) navigator; - return n.hasChange(down); - } - return false; - } - - /* - * Find the Diff that overlaps with the given TextPart's text range. - * If the range doesn't overlap with any range <code>null</code> - * is returned. - */ - private Diff findDiff(MergeSourceViewer tp, int rangeStart, int rangeEnd) { - char contributor = getLeg(tp); - return fMerger.findDiff(contributor, rangeStart, rangeEnd); - } - - private Diff findNext(MergeSourceViewer tp, int start, int end, boolean deep) { - return fMerger.findNext(getLeg(tp), start, end, deep); - } - - private Diff findPrev(MergeSourceViewer tp, int start, int end, boolean deep) { - return fMerger.findPrev(getLeg(tp), start, end, deep); - } - - /* - * Set the currently active Diff and update the toolbars controls and lines. - * If <code>revealAndSelect</code> is <code>true</code> the Diff is revealed and - * selected in both TextParts. - */ - private void setCurrentDiff(Diff d, boolean revealAndSelect) { - setCurrentDiff(d, revealAndSelect, false); - } - - /* - * Set the currently active Diff and update the toolbars controls and lines. - * If <code>revealAndSelect</code> is <code>true</code> the Diff is revealed and - * selected in both TextParts. - */ - private void setCurrentDiff(Diff d, boolean revealAndSelect, boolean deep) { - -// if (d == fCurrentDiff) -// return; - boolean diffChanged = fCurrentDiff != d; - - if (fCenterButton != null && !fCenterButton.isDisposed()) - fCenterButton.setVisible(false); - - if (d != null && revealAndSelect) { - - // before we set fCurrentDiff we change the selection - // so that the paint code uses the old background colors - // otherwise selection isn't drawn correctly - if (d.isToken() || !fHighlightTokenChanges || deep || !d.hasChildren()) { - if (isThreeWay() && !isIgnoreAncestor()) - fAncestor.setSelection(d.getPosition(ANCESTOR_CONTRIBUTOR)); - fLeft.setSelection(d.getPosition(LEFT_CONTRIBUTOR)); - fRight.setSelection(d.getPosition(RIGHT_CONTRIBUTOR)); - } else { - if (isThreeWay() && !isIgnoreAncestor()) - fAncestor.setSelection(new Position(d.getPosition(ANCESTOR_CONTRIBUTOR).offset, 0)); - fLeft.setSelection(new Position(d.getPosition(LEFT_CONTRIBUTOR).offset, 0)); - fRight.setSelection(new Position(d.getPosition(RIGHT_CONTRIBUTOR).offset, 0)); - } - - // now switch diffs - fCurrentDiff= d; - revealDiff(d, d.isToken()); - } else { - fCurrentDiff= d; - } - - updateControls(); - if (diffChanged) - invalidateLines(); - refreshBirdsEyeView(); - } - - /* - * Smart determines whether - */ - private void revealDiff(Diff d, boolean smart) { - - boolean ancestorIsVisible= false; - boolean leftIsVisible= false; - boolean rightIsVisible= false; - - if (smart) { - Point region= new Point(0, 0); - // find the starting line of the diff in all text widgets - int ls= fLeft.getLineRange(d.getPosition(LEFT_CONTRIBUTOR), region).x; - int rs= fRight.getLineRange(d.getPosition(RIGHT_CONTRIBUTOR), region).x; - - if (isThreeWay() && !isIgnoreAncestor()) { - int as= fAncestor.getLineRange(d.getPosition(ANCESTOR_CONTRIBUTOR), region).x; - if (as >= fAncestor.getSourceViewer().getTopIndex() && as <= fAncestor.getSourceViewer().getBottomIndex()) - ancestorIsVisible= true; - } - - if (ls >= fLeft.getSourceViewer().getTopIndex() && ls <= fLeft.getSourceViewer().getBottomIndex()) - leftIsVisible= true; - - if (rs >= fRight.getSourceViewer().getTopIndex() && rs <= fRight.getSourceViewer().getBottomIndex()) - rightIsVisible= true; - } - - // vertical scrolling - if (!leftIsVisible || !rightIsVisible) { - int avpos= 0, lvpos= 0, rvpos= 0; - - MergeSourceViewer allButThis= null; - if (leftIsVisible) { - avpos= lvpos= rvpos= realToVirtualPosition(LEFT_CONTRIBUTOR, fLeft.getSourceViewer().getTopIndex()); - allButThis= fLeft; - } else if (rightIsVisible) { - avpos= lvpos= rvpos= realToVirtualPosition(RIGHT_CONTRIBUTOR, fRight.getSourceViewer().getTopIndex()); - allButThis= fRight; - } else if (ancestorIsVisible) { - avpos= lvpos= rvpos= realToVirtualPosition(ANCESTOR_CONTRIBUTOR, fAncestor.getSourceViewer().getTopIndex()); - allButThis= fAncestor; - } else { - int vpos= 0; - for (Iterator iterator = fMerger.rangesIterator(); iterator - .hasNext();) { - Diff diff = (Diff) iterator.next(); - if (diff == d) - break; - if (fSynchronizedScrolling) { - vpos+= diff.getMaxDiffHeight(); - } else { - avpos+= diff.getAncestorHeight(); - lvpos+= diff.getLeftHeight(); - rvpos+= diff.getRightHeight(); - } - } - if (fSynchronizedScrolling) - avpos= lvpos= rvpos= vpos; - int delta= fRight.getViewportLines()/4; - avpos-= delta; - if (avpos < 0) - avpos= 0; - lvpos-= delta; - if (lvpos < 0) - lvpos= 0; - rvpos-= delta; - if (rvpos < 0) - rvpos= 0; - } - - scrollVertical(avpos, lvpos, rvpos, allButThis); - - if (fVScrollBar != null) - fVScrollBar.setSelection(avpos); - } - - // horizontal scrolling - if (d.isToken()) { - // we only scroll horizontally for token diffs - reveal(fAncestor, d.getPosition(ANCESTOR_CONTRIBUTOR)); - reveal(fLeft, d.getPosition(LEFT_CONTRIBUTOR)); - reveal(fRight, d.getPosition(RIGHT_CONTRIBUTOR)); - } else { - // in all other cases we reset the horizontal offset - hscroll(fAncestor); - hscroll(fLeft); - hscroll(fRight); - } - } - - private static void reveal(MergeSourceViewer v, Position p) { - if (v != null && p != null) { - StyledText st= v.getSourceViewer().getTextWidget(); - if (st != null) { - Rectangle r= st.getClientArea(); - if (!r.isEmpty()) // workaround for #7320: Next diff scrolls when going into current diff - v.getSourceViewer().revealRange(p.offset, p.length); - } - } - } - - private static void hscroll(MergeSourceViewer v) { - if (v != null) { - StyledText st= v.getSourceViewer().getTextWidget(); - if (st != null) - st.setHorizontalIndex(0); - } - } - - //-------------------------------------------------------------------------------- - - void copyAllUnresolved(boolean leftToRight) { - if (fMerger.hasChanges() && isThreeWay() && !isIgnoreAncestor()) { - IRewriteTarget target= leftToRight ? fRight.getSourceViewer().getRewriteTarget() : fLeft.getSourceViewer().getRewriteTarget(); - boolean compoundChangeStarted= false; - try { - for (Iterator iterator = fMerger.changesIterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - switch (diff.getKind()) { - case RangeDifference.LEFT: - if (leftToRight) { - if (!compoundChangeStarted) { - target.beginCompoundChange(); - compoundChangeStarted= true; - } - copy(diff, leftToRight); - } - break; - case RangeDifference.RIGHT: - if (!leftToRight) { - if (!compoundChangeStarted) { - target.beginCompoundChange(); - compoundChangeStarted= true; - } - copy(diff, leftToRight); - } - break; - default: - continue; - } - } - } finally { - if (compoundChangeStarted) { - target.endCompoundChange(); - } - } - } - } - - /* - * Copy whole document from one side to the other. - */ - protected void copy(boolean leftToRight) { - if (!validateChange(!leftToRight)) - return; - if (showResolveUI()) { - copyAllUnresolved(leftToRight); - invalidateLines(); - return; - } - copyOperationInProgress = true; - if (leftToRight) { - if (fLeft.getEnabled()) { - // copy text - String text= fLeft.getSourceViewer().getTextWidget().getText(); - fRight.getSourceViewer().getTextWidget().setText(text); - fRight.setEnabled(true); - } else { - // delete - fRight.getSourceViewer().getTextWidget().setText(""); //$NON-NLS-1$ - fRight.setEnabled(false); - } - fRightLineCount= fRight.getLineCount(); - setRightDirty(true); - } else { - if (fRight.getEnabled()) { - // copy text - String text= fRight.getSourceViewer().getTextWidget().getText(); - fLeft.getSourceViewer().getTextWidget().setText(text); - fLeft.setEnabled(true); - } else { - // delete - fLeft.getSourceViewer().getTextWidget().setText(""); //$NON-NLS-1$ - fLeft.setEnabled(false); - } - fLeftLineCount= fLeft.getLineCount(); - setLeftDirty(true); - } - copyOperationInProgress = false; - update(false); - selectFirstDiff(true); - } - - private void historyNotification(OperationHistoryEvent event) { - switch (event.getEventType()) { - case OperationHistoryEvent.OPERATION_ADDED: - if (copyOperationInProgress) { - copyUndoable = event.getOperation(); - } - break; - case OperationHistoryEvent.UNDONE: - if (copyUndoable == event.getOperation()) { - update(false); - } - break; - default: - // Nothing to do - break; - } - } - - private void copyDiffLeftToRight() { - copy(fCurrentDiff, true, false); - } - - private void copyDiffRightToLeft() { - copy(fCurrentDiff, false, false); - } - - /* - * Copy the contents of the given diff from one side to the other. - */ - private void copy(Diff diff, boolean leftToRight, boolean gotoNext) { - if (copy(diff, leftToRight)) { - if (gotoNext) { - navigate(true, true, false /* don't step in */); - } else { - revealDiff(diff, true); - updateControls(); - } - } - } - - /* - * Copy the contents of the given diff from one side to the other but - * doesn't reveal anything. - * Returns true if copy was successful. - */ - private boolean copy(Diff diff, boolean leftToRight) { - - if (diff != null && !diff.isResolved()) { - if (!validateChange(!leftToRight)) - return false; - if (leftToRight) { - fRight.setEnabled(true); - } else { - fLeft.setEnabled(true); - } - boolean result = fMerger.copy(diff, leftToRight); - if (result) - updateResolveStatus(); - return result; - } - return false; - } - - private boolean validateChange(boolean left) { - ContributorInfo info; - if (left) - info = fLeftContributor; - else - info = fRightContributor; - - return info.validateChange(); - } - - //---- scrolling - - /* - * The height of the TextEditors in lines. - */ - private int getViewportHeight() { - StyledText te= fLeft.getSourceViewer().getTextWidget(); - - int vh= te.getClientArea().height; - if (vh == 0) { - Rectangle trim= te.computeTrim(0, 0, 0, 0); - int scrollbarHeight= trim.height; - - int headerHeight= getHeaderHeight(); - - Composite composite= (Composite) getControl(); - Rectangle r= composite.getClientArea(); - - vh= r.height-headerHeight-scrollbarHeight; - } - - return vh / te.getLineHeight(); - } - - /* - * Returns the virtual position for the given view position. - */ - private int realToVirtualPosition(char contributor, int vpos) { - if (! fSynchronizedScrolling) - return vpos; - return fMerger.realToVirtualPosition(contributor, vpos); - } - - private void scrollVertical(int avpos, int lvpos, int rvpos, MergeSourceViewer allBut) { - - int s= 0; - - if (fSynchronizedScrolling) { - s= fMerger.getVirtualHeight() - rvpos; - int height= fRight.getViewportLines()/4; - if (s < 0) - s= 0; - if (s > height) - s= height; - } - - fInScrolling= true; - - if (isThreeWay() && allBut != fAncestor) { - if (fSynchronizedScrolling || allBut == null) { - int y= virtualToRealPosition(ANCESTOR_CONTRIBUTOR, avpos+s)-s; - fAncestor.vscroll(y); - } - } - - if (allBut != fLeft) { - if (fSynchronizedScrolling || allBut == null) { - int y= virtualToRealPosition(LEFT_CONTRIBUTOR, lvpos+s)-s; - fLeft.vscroll(y); - } - } - - if (allBut != fRight) { - if (fSynchronizedScrolling || allBut == null) { - int y= virtualToRealPosition(RIGHT_CONTRIBUTOR, rvpos+s)-s; - fRight.vscroll(y); - } - } - - fInScrolling= false; - - if (isThreeWay() && fAncestorCanvas != null) - fAncestorCanvas.repaint(); - - if (fLeftCanvas != null) - fLeftCanvas.repaint(); - - Control center= getCenterControl(); - if (center instanceof BufferedCanvas) - ((BufferedCanvas)center).repaint(); - - if (fRightCanvas != null) - fRightCanvas.repaint(); - } - - /* - * Updates Scrollbars with viewports. - */ - private void syncViewport(MergeSourceViewer w) { - - if (fInScrolling) - return; - - int ix= w.getSourceViewer().getTopIndex(); - int ix2= w.getDocumentRegionOffset(); - - int viewPosition= realToVirtualPosition(getLeg(w), ix-ix2); - - scrollVertical(viewPosition, viewPosition, viewPosition, w); // scroll all but the given views - - if (fVScrollBar != null) { - int value= Math.max(0, Math.min(viewPosition, fMerger.getVirtualHeight() - getViewportHeight())); - fVScrollBar.setSelection(value); - //refreshBirdEyeView(); - } - } - - /** - */ - private void updateVScrollBar() { - - if (Utilities.okToUse(fVScrollBar) && fSynchronizedScrolling) { - int virtualHeight= fMerger.getVirtualHeight(); - int viewPortHeight= getViewportHeight(); - int pageIncrement= viewPortHeight-1; - int thumb= (viewPortHeight > virtualHeight) ? virtualHeight : viewPortHeight; - - fVScrollBar.setPageIncrement(pageIncrement); - fVScrollBar.setMaximum(virtualHeight); - fVScrollBar.setThumb(thumb); - } - } - - /* - * maps given virtual position into a real view position of this view. - */ - private int virtualToRealPosition(char contributor, int v) { - if (! fSynchronizedScrolling) - return v; - return fMerger.virtualToRealPosition(contributor, v); - } - - void flushLeftSide(Object oldInput, IProgressMonitor monitor){ - IMergeViewerContentProvider content= getMergeContentProvider(); - Object leftContent = content.getLeftContent(oldInput); - - if (leftContent != null && getCompareConfiguration().isLeftEditable() && isLeftDirty()) { - if (fLeftContributor.hasSharedDocument(leftContent)) { - if (flush(fLeftContributor)) - setLeftDirty(false); - } - } - - if (!(content instanceof MergeViewerContentProvider) || isLeftDirty()) { - super.flushLeftSide(oldInput, monitor); - } - } - - void flushRightSide(Object oldInput, IProgressMonitor monitor){ - IMergeViewerContentProvider content= getMergeContentProvider(); - Object rightContent = content.getRightContent(oldInput); - - if (rightContent != null && getCompareConfiguration().isRightEditable() && isRightDirty()) { - if (fRightContributor.hasSharedDocument(rightContent)) { - if (flush(fRightContributor)) - setRightDirty(false); - } - } - - if (!(content instanceof MergeViewerContentProvider) || isRightDirty()) { - super.flushRightSide(oldInput, monitor); - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#flushContent(java.lang.Object, org.eclipse.core.runtime.IProgressMonitor) - */ - protected void flushContent(Object oldInput, IProgressMonitor monitor) { - flushLeftSide(oldInput, monitor); - flushRightSide(oldInput, monitor); - - IMergeViewerContentProvider content = getMergeContentProvider(); - - if (!(content instanceof MergeViewerContentProvider) || isLeftDirty() || isRightDirty()) { - super.flushContent(oldInput, monitor); - } - } - - private boolean flush(final ContributorInfo info) { - try { - return info.flush(); - } catch (CoreException e) { - handleException(e); - } - return false; - } - - private void handleException(Throwable throwable) { - // TODO: Should show error to the user - if (throwable instanceof InvocationTargetException) { - InvocationTargetException ite = (InvocationTargetException) throwable; - handleException(ite.getTargetException()); - return; - } - CompareUIPlugin.log(throwable); - } - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) - */ - public Object getAdapter(Class adapter) { - if (adapter == IMergeViewerTestAdapter.class) { - return new IMergeViewerTestAdapter() { - public IDocument getDocument(char leg) { - switch (leg) { - case LEFT_CONTRIBUTOR: - return fLeft.getSourceViewer().getDocument(); - case RIGHT_CONTRIBUTOR: - return fRight.getSourceViewer().getDocument(); - case ANCESTOR_CONTRIBUTOR: - return fAncestor.getSourceViewer().getDocument(); - } - return null; - } - }; - } - if (adapter == OutlineViewerCreator.class) { - if (fOutlineViewerCreator == null) - fOutlineViewerCreator = new InternalOutlineViewerCreator(); - return fOutlineViewerCreator; - - } - if (adapter == IFindReplaceTarget.class) - return getFindReplaceTarget(); - if (adapter == CompareHandlerService.class) - return fHandlerService; - if (adapter == CompareHandlerService[].class) { - return new CompareHandlerService[] { fHandlerService, - super.getCompareHandlerService() }; - } - if (adapter == IEditorInput.class) { - // return active editor input - if (fLeft != null && fLeft == fFocusPart) - if (fLeftContributor != null) - return fLeftContributor.getDocumentKey(); - if (fRight != null && fRight == fFocusPart) - if (fRightContributor != null) - return fRightContributor.getDocumentKey(); - if (fAncestor != null && fAncestor == fFocusPart) - if (fAncestorContributor != null) - return fAncestorContributor.getDocumentKey(); - } - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer#handleCompareInputChange() - */ - protected void handleCompareInputChange() { - try { - beginRefresh(); - super.handleCompareInputChange(); - } finally { - endRefresh(); - } - } - - private void beginRefresh() { - isRefreshing++; - fLeftContributor.cacheSelection(fLeft); - fRightContributor.cacheSelection(fRight); - fAncestorContributor.cacheSelection(fAncestor); - if (fSynchronizedScrolling) { - fSynchronziedScrollPosition = fVScrollBar.getSelection(); - } - - } - - private void endRefresh() { - isRefreshing--; - fLeftContributor.cacheSelection(null); - fRightContributor.cacheSelection(null); - fAncestorContributor.cacheSelection(null); - fSynchronziedScrollPosition = -1; - } - - private void synchronizedScrollVertical(int vpos) { - scrollVertical(vpos, vpos, vpos, null); - } - - private boolean isIgnoreAncestor() { - return Utilities.getBoolean(getCompareConfiguration(), ICompareUIConstants.PROP_IGNORE_ANCESTOR, false); - } - - /* package */ void update(boolean includeControls) { - if (getControl().isDisposed()) - return; - if (fHasErrors) { - resetDiffs(); - } else { - doDiff(); - } - - if (includeControls) - updateControls(); - - updateVScrollBar(); - updatePresentation(); - } - - private void resetDiffs() { - // clear stuff - fCurrentDiff= null; - fMerger.reset(); - resetPositions(fLeft.getSourceViewer().getDocument()); - resetPositions(fRight.getSourceViewer().getDocument()); - resetPositions(fAncestor.getSourceViewer().getDocument()); - } - - private boolean isPatchHunk() { - return Utilities.isHunk(getInput()); - } - - private boolean isPatchHunkOk() { - if (isPatchHunk()) - return Utilities.isHunkOk(getInput()); - return false; - } - - /** - * Return the provided start position of the hunk in the target file. - * @return the provided start position of the hunk in the target file - */ - private int getHunkStart() { - Object input = getInput(); - if (input != null && input instanceof DiffNode){ - ITypedElement right = ((DiffNode) input).getRight(); - if (right != null) { - Object element = Utilities.getAdapter(right, IHunk.class); - if (element instanceof IHunk) - return ((IHunk)element).getStartPosition(); - } - ITypedElement left = ((DiffNode) input).getLeft(); - if (left != null) { - Object element = Utilities.getAdapter(left, IHunk.class); - if (element instanceof IHunk) - return ((IHunk)element).getStartPosition(); - } - } - return 0; - } - - private IFindReplaceTarget getFindReplaceTarget() { - if (fFindReplaceTarget == null) - fFindReplaceTarget= new FindReplaceTarget(); - return fFindReplaceTarget; - } - - /* package */ char getLeg(MergeSourceViewer w) { - if (w == fLeft) - return LEFT_CONTRIBUTOR; - if (w == fRight) - return RIGHT_CONTRIBUTOR; - if (w == fAncestor) - return ANCESTOR_CONTRIBUTOR; - return ANCESTOR_CONTRIBUTOR; - } - - private boolean isCurrentDiff(Diff diff) { - if (diff == null) - return false; - if (diff == fCurrentDiff) - return true; - if (fCurrentDiff != null && fCurrentDiff.getParent() == diff) - return true; - return false; - } - - private boolean isNavigationPossible() { - if (fCurrentDiff == null && fMerger.hasChanges()) - return true; - else if (fMerger.changesCount() > 1) - return true; - else if (fCurrentDiff != null && fCurrentDiff.hasChildren()) - return true; - else if (fCurrentDiff != null && fCurrentDiff.isToken()) - return true; - return false; - } - - /** - * This method returns {@link ITextEditor} used in the - * {@link ChangeEncodingAction}. It provides implementation of methods that - * are used by the action by delegating them to {@link ContributorInfo} that - * corresponds to the side that has focus. - * - * @return the text editor adapter - */ - private ITextEditor getTextEditorAdapter() { - return new ITextEditor() { - public void close(boolean save) { - // Implementing interface method - } - public void doRevertToSaved() { - // Implementing interface method - } - public IAction getAction(String actionId) { - // Implementing interface method - return null; - } - public IDocumentProvider getDocumentProvider() { - // Implementing interface method - return null; - } - public IRegion getHighlightRange() { - // Implementing interface method - return null; - } - public ISelectionProvider getSelectionProvider() { - // Implementing interface method - return null; - } - public boolean isEditable() { - // Implementing interface method - return false; - } - public void removeActionActivationCode(String actionId) { - // Implementing interface method - } - public void resetHighlightRange() { - // Implementing interface method - } - public void selectAndReveal(int offset, int length) { - // Implementing interface method - } - public void setAction(String actionId, IAction action) { - // Implementing interface method - } - public void setActionActivationCode(String actionId, - char activationCharacter, int activationKeyCode, - int activationStateMask) { - // Implementing interface method - } - public void setHighlightRange(int offset, int length, - boolean moveCursor) { - // Implementing interface method - } - public void showHighlightRangeOnly(boolean showHighlightRangeOnly) { - // Implementing interface method - } - public boolean showsHighlightRangeOnly() { - // Implementing interface method - return false; - } - public IEditorInput getEditorInput() { - if (fFocusPart == fAncestor && fAncestorContributor != null) { - return fAncestorContributor.getDocumentKey(); - } else if (fFocusPart == fLeft && fLeftContributor != null) { - return fLeftContributor.getDocumentKey(); - } else if (fFocusPart == fRight && fRightContributor != null) { - return fRightContributor.getDocumentKey(); - } else { - return null; - } - } - public IEditorSite getEditorSite() { - // Implementing interface method - return null; - } - public void init(IEditorSite site, IEditorInput input) - throws PartInitException { - // Implementing interface method - } - public void addPropertyListener(IPropertyListener listener) { - // Implementing interface method - } - public void createPartControl(Composite parent) { - // Implementing interface method - } - public void dispose() { - // Implementing interface method - } - public IWorkbenchPartSite getSite() { - // Implementing interface method - return new IWorkbenchPartSite() { - public String getId() { - // Implementing interface method - return null; - } - public IKeyBindingService getKeyBindingService() { - // Implementing interface method - return null; - } - public IWorkbenchPart getPart() { - // Implementing interface method - return null; - } - public String getPluginId() { - // Implementing interface method - return null; - } - public String getRegisteredName() { - // Implementing interface method - return null; - } - public void registerContextMenu(MenuManager menuManager, - ISelectionProvider selectionProvider) { - // Implementing interface method - } - public void registerContextMenu(String menuId, - MenuManager menuManager, - ISelectionProvider selectionProvider) { - // Implementing interface method - } - public IWorkbenchPage getPage() { - // Implementing interface method - return null; - } - public ISelectionProvider getSelectionProvider() { - // Implementing interface method - return null; - } - public Shell getShell() { - return fComposite.getShell(); - } - public IWorkbenchWindow getWorkbenchWindow() { - // Implementing interface method - return null; - } - public void setSelectionProvider(ISelectionProvider provider) { - // Implementing interface method - } - public Object getAdapter(Class adapter) { - // Implementing interface method - return null; - } - public Object getService(Class api) { - // Implementing interface method - return null; - } - public boolean hasService(Class api) { - // Implementing interface method - return false; - } - }; - } - public String getTitle() { - // Implementing interface method - return null; - } - public Image getTitleImage() { - // Implementing interface method - return null; - } - public String getTitleToolTip() { - // Implementing interface method - return null; - } - public void removePropertyListener(IPropertyListener listener) { - // Implementing interface method - } - public void setFocus() { - // Implementing interface method - } - public Object getAdapter(Class adapter) { - if (adapter == IEncodingSupport.class) { - if (fFocusPart == fAncestor) { - return getEncodingSupport(fAncestorContributor); - } else if (fFocusPart == fLeft) { - return getEncodingSupport(fLeftContributor); - } else if (fFocusPart == fRight) { - return getEncodingSupport(fRightContributor); - } - } - return null; - } - private IEncodingSupport getEncodingSupport(ContributorInfo contributor) { - if (contributor != null && contributor.getDefaultEncoding() != null) { - return contributor; - } - return null; - } - public void doSave(IProgressMonitor monitor) { - // Implementing interface method - } - public void doSaveAs() { - // Implementing interface method - } - public boolean isDirty() { - if (fFocusPart == fLeft) { - return isLeftDirty(); - } else if (fFocusPart == fRight) { - return isRightDirty(); - } - return false; - } - public boolean isSaveAsAllowed() { - // Implementing interface method - return false; - } - public boolean isSaveOnCloseNeeded() { - // Implementing interface method - return false; - } - }; - } - - private void updateStructure() { - getCompareConfiguration().setProperty("ALL_STRUCTURE_REFRESH", null); //$NON-NLS-1$ - } - - private void updateStructure(char leg) { - String key = null; - switch (leg) { - case ANCESTOR_CONTRIBUTOR: - key = "ANCESTOR_STRUCTURE_REFRESH"; //$NON-NLS-1$ - break; - case LEFT_CONTRIBUTOR: - key = "LEFT_STRUCTURE_REFRESH"; //$NON-NLS-1$ - break; - case RIGHT_CONTRIBUTOR: - key = "RIGHT_STRUCTURE_REFRESH"; //$NON-NLS-1$ - break; - } - Assert.isNotNull(key); - getCompareConfiguration().setProperty(key, null); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties deleted file mode 100644 index e278ba7cd..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties +++ /dev/null @@ -1,111 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 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 -############################################################################### -# -# @(#)TextMergeViewerResources.properties -# -# Resource strings for TextMergeViewer.java - -title= Text Compare - -saveDialog.title= Save Resource -saveDialog.message= Resource has been modified. Save changes? - -compareProgressTask.title= Computing Differences... - -tooComplexError.title= Error -tooComplexError.message= Too many differences. Turn on the 'Ignore White Space' option or do a structure compare first. - -##################################################### -# Toolbar actions -##################################################### - -action.CopyLeftToRight.label=Copy Left to Right -action.CopyLeftToRight.tooltip=Copy All from Left to Right -action.CopyLeftToRight.image=copy_r_co.gif - -action.CopyRightToLeft.label=Copy Right to Left -action.CopyRightToLeft.tooltip=Copy All Non-Conflicting Changes from Right to Left -action.CopyRightToLeft.image=copy_l_co.gif - -action.CopyDiffLeftToRight.label=Copy Current Change to Right -action.CopyDiffLeftToRight.tooltip=Copy Current Change from Left to Right -action.CopyDiffLeftToRight.image=copycont_r_co.gif - -action.CopyDiffRightToLeft.label=Copy Current Change to Left -action.CopyDiffRightToLeft.tooltip=Copy Current Change from Right to Left -action.CopyDiffRightToLeft.image=copycont_l_co.gif - -action.NextDiff.label=Next Difference -action.NextDiff.tooltip=Next Difference -action.NextDiff.image=next_diff_nav.gif - -action.PrevDiff.label=Previous Difference -action.PrevDiff.tooltip=Previous Difference -action.PrevDiff.image=prev_diff_nav.gif - -action.NextChange.label=Next Change -action.NextChange.tooltip=Next Change -action.NextChange.image=next_change_nav.gif - -action.PrevChange.label=Previous Change -action.PrevChange.tooltip=Previous Change -action.PrevChange.image=prev_change_nav.gif - -action.EnableAncestor.label=Enable Ancestor Pane -action.EnableAncestor.tooltip.unchecked=Show Ancestor Pane -action.EnableAncestor.tooltip.checked=Hide Ancestor Pane -action.EnableAncestor.description.unchecked=Show Ancestor Pane -action.EnableAncestor.description.checked=Hide Ancestor Pane -action.EnableAncestor.image=ancestorpane_co.gif - -action.IgnoreAncestor.label=Ignore Ancestor -action.IgnoreAncestor.tooltip.unchecked=Two-Way Compare (Ignore Ancestor) -action.IgnoreAncestor.tooltip.checked=Three-Way Compare -action.IgnoreAncestor.description.unchecked=Two-Way Compare (Ignore Ancestor) -action.IgnoreAncestor.description.checked=Three-Way Compare -action.IgnoreAncestor.image=twowaycompare_co.gif - - -##################################################### -# Context menu actions -##################################################### - -action.undo.label=&Undo -action.undo.tooltip=Undo Last Operation - -action.redo.label=&Redo -action.redo.tooltip=Redo Last Operation - -action.cut.label=Cu&t -action.cut.tooltip=Cut Text Selection to Clipboard - -action.copy.label=&Copy -action.copy.tooltip=Copy Text Selection to Clipboard - -action.paste.label=&Paste -action.paste.tooltip=Replace Text Selection with Clipboard Contents - -action.delete.label=&Delete -action.delete.tooltip=Delete Current Text Selection - -action.find.label=&Find... -action.find.tooltip=Find Occurrence - -action.selectAll.label=Select &All -action.selectAll.tooltip=Select All Changes - -Editor.FindReplace.label=&Find/Replace... -Editor.FindReplace.tooltip=Find/Replace -Editor.FindReplace.image= -Editor.FindReplace.description=Find/Replace - -action.IgnoreWhiteSpace.label=&Ignore White Space -action.IgnoreWhiteSpace.tooltip=Ignore White Space Where Applicable diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TokenComparator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TokenComparator.java deleted file mode 100644 index 7370388ba..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TokenComparator.java +++ /dev/null @@ -1,132 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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.contentmergeviewer; - -import org.eclipse.compare.rangedifferencer.IRangeComparator; -import org.eclipse.core.runtime.Assert; - -/** - * Implements the <code>ITokenComparator</code> interface for words (or tokens) - * in a string. - * A <code>TokenComparator</code> is used as the input for the <code>RangeDifferencer</code> - * engine to perform a token oriented compare on strings. - * <p> - * This class may be instantiated by clients but is not intended to be subclassed. - * @since 3.4 - */ -public class TokenComparator implements ITokenComparator { - - private String fText; - private int fCount; - private int[] fStarts; - private int[] fLengths; - - /** - * Creates a <code>TokenComparator</code> for the given string. - * - * @param text the string that is split into token - */ - public TokenComparator(String text) { - - Assert.isNotNull(text); - - fText= text; - - int length= fText.length(); - fStarts= new int[length]; // pessimistic assumption! - fLengths= new int[length]; - fCount= 0; - - char lastCategory= 0; // 0: no category - for (int i= 0; i < length; i++) { - char c= fText.charAt(i); - - char category= '?'; // unspecified category - if (Character.isWhitespace(c)) - category= ' '; // white space category - else if (Character.isDigit(c)) - category= '0'; // digits - else if (Character.isLetter(c)) - category= 'a'; // letters - else if (c == '\"' || c == '\'') - category= '\"'; // quotes (see bug 198671) - - if (category != lastCategory) { - // start a new token - fStarts[fCount++]= i; - lastCategory= category; - } - fLengths[fCount-1]++; - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.rangedifferencer.IRangeComparator#getRangeCount() - */ - public int getRangeCount() { - return fCount; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.contentmergeviewer.ITokenComparator#getTokenStart(int) - */ - public int getTokenStart(int index) { - if (index < fCount) - return fStarts[index]; - return fText.length(); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.contentmergeviewer.ITokenComparator#getTokenLength(int) - */ - public int getTokenLength(int index) { - if (index < fCount) - return fLengths[index]; - return 0; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.rangedifferencer.IRangeComparator#rangesEqual(int, org.eclipse.compare.rangedifferencer.IRangeComparator, int) - */ - public boolean rangesEqual(int thisIndex, IRangeComparator other, int otherIndex) { - if (other != null && getClass() == other.getClass()) { - TokenComparator tc= (TokenComparator) other; - int thisLen= getTokenLength(thisIndex); - int otherLen= tc.getTokenLength(otherIndex); - if (thisLen == otherLen) - return fText.regionMatches(false, getTokenStart(thisIndex), tc.fText, tc.getTokenStart(otherIndex), thisLen); - } - return false; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.rangedifferencer.IRangeComparator#skipRangeComparison(int, int, org.eclipse.compare.rangedifferencer.IRangeComparator) - */ - public boolean skipRangeComparison(int length, int max, IRangeComparator other) { - - if (getRangeCount() < 50 || other.getRangeCount() < 50) - return false; - - if (max < 100) - return false; - - if (length < 100) - return false; - - if (max > 800) - return true; - - if (length < max / 4) - return false; - - return true; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/package.html b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/package.html deleted file mode 100644 index 9f606fb95..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/package.html +++ /dev/null @@ -1,45 +0,0 @@ -<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> - <meta name="Author" content="IBM"> - <meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]"> - <title>Package-level Javadoc</title> -</head> -<body> -Support for compare and merge viewers which show the -content side-by-side. -<h2> -Package Specification</h2> - -The <b>ContentMergeViewer</b> is an abstract compare and merge viewer -with two side-by-side content areas and an optional content area for a -common ancestor (for three-way compare). Because the implementation makes -no assumptions about the content type it is a subclass responsibility to -deal with a specific type. Its subclass <b>ImageMergeViewer</b> in -package org.eclipse.compare.internal shows how to base a simple -mergeviewer for images on <b>ContentMergeViewer</b>. -<p> - -A <b>ContentMergeViewer</b> accesses its model by means of a content -provider which must implement the <b>IMergeViewerContentProvider</b> interface. -<p> - -The <b>TextMergeViewer</b> is the standard concrete subclass of -<b>ContentMergeViewer</b> for comparing and merging text content. -<br> -A text merge viewer uses the <b>org.eclipse.compare.rangedifferencer.RangeDifferencer</b> -to perform a textual, line-by-line comparison of two (or three) input documents. -For text lines that differ the <b>TextMergeViewer</b> uses an <b>ITokenComparator</b> -to find longest sequences of matching and non-matching tokens. -The <b>TextMergeViewer</b>'s -default token compare works on characters separated by whitespace. If a -different strategy is needed (for example, Java tokens in a Java-aware -merge viewer), clients can create their own token comparators by implementing -the <b>ITokenComparator</b> interface. -<p>The <b>TextMergeViewer</b> not only works on whole documents but on -subranges of documents too. In this case the viewer's input must be an -<b>IDocumentRange</b> instead of an <b>IDocument</b>. - -</body> -</html> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AbstractViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AbstractViewer.java deleted file mode 100644 index f76927a20..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AbstractViewer.java +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.Viewer; - - -public abstract class AbstractViewer extends Viewer { - - public void setInput(Object input) { - // empty default implementation - } - - public Object getInput() { - return null; - } - - public ISelection getSelection() { - return null; - } - - public void setSelection(ISelection s, boolean reveal) { - // empty default implementation - } - - public void refresh() { - // empty default implementation - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AdapterFactory.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AdapterFactory.java deleted file mode 100644 index e101563b6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AdapterFactory.java +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010 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 org.eclipse.compare.CompareEditorInput; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IAdapterFactory; -import org.eclipse.ui.IContributorResourceAdapter; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IFileEditorInput; - -public class AdapterFactory implements IAdapterFactory { - - public Object getAdapter(final Object adaptableObject, Class adapterType) { - if (IContributorResourceAdapter.class.equals(adapterType) - && adaptableObject instanceof CompareEditorInput) { - return new IContributorResourceAdapter() { - public IResource getAdaptedResource(IAdaptable adaptable) { - Object ei = ((CompareEditorInput) adaptableObject) - .getAdapter(IEditorInput.class); - if (ei instanceof IFileEditorInput) { - return ((IFileEditorInput) ei).getFile(); - } - return null; - } - }; - } - return null; - } - - public Class[] getAdapterList() { - return new Class[] { IContributorResourceAdapter.class }; - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.java deleted file mode 100644 index 1fdd5c1f6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.java +++ /dev/null @@ -1,144 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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.internal; - -import java.util.ResourceBundle; -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.swt.widgets.Shell; - -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.dialogs.ProgressMonitorDialog; -import org.eclipse.jface.viewers.ISelection; - -import org.eclipse.ui.actions.WorkspaceModifyOperation; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; - - -public class AddFromHistoryAction extends BaseCompareAction { - - private static final String BUNDLE_NAME= "org.eclipse.compare.internal.AddFromHistoryAction"; //$NON-NLS-1$ - - public AddFromHistoryAction() { - // empty default implementation - } - - protected boolean isEnabled(ISelection selection) { - return Utilities.getResources(selection).length == 1; - } - - protected void run(ISelection selection) { - - ResourceBundle bundle= ResourceBundle.getBundle(BUNDLE_NAME); - String title= Utilities.getString(bundle, "title"); //$NON-NLS-1$ - - Shell parentShell= CompareUIPlugin.getShell(); - AddFromHistoryDialog dialog= null; - - Object[] s= Utilities.getResources(selection); - - for (int i= 0; i < s.length; i++) { - Object o= s[i]; - if (o instanceof IContainer) { - IContainer container= (IContainer) o; - - ProgressMonitorDialog pmdialog= new ProgressMonitorDialog(parentShell); - IProgressMonitor pm= pmdialog.getProgressMonitor(); - IFile[] states= null; - try { - states= container.findDeletedMembersWithHistory(IResource.DEPTH_INFINITE, pm); - } catch (CoreException ex) { - pm.done(); - } - - // There could be a recently deleted file at the same path as - // the container. If such a file is the only one to restore, we - // should not suggest to restore it, so set states to null. - if (states.length == 1 && states[0].getFullPath().equals(container.getFullPath())) - states = null; - - if (states == null || states.length <= 0) { - String msg= Utilities.getString(bundle, "noLocalHistoryError"); //$NON-NLS-1$ - MessageDialog.openInformation(parentShell, title, msg); - return; - } - - if (dialog == null) { - dialog= new AddFromHistoryDialog(parentShell, bundle); - dialog.setHelpContextId(ICompareContextIds.ADD_FROM_HISTORY_DIALOG); - } - - if (dialog.select(container, states)) { - AddFromHistoryDialog.HistoryInput[] selected = dialog - .getSelected(); - if (selected != null && selected.length > 0) { - try { - updateWorkspace(bundle, parentShell, selected); - } 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$ - } - } - } - } - } - } - - void createContainers(IResource resource) throws CoreException { - IContainer container= resource.getParent(); - if (container instanceof IFolder) { - IFolder parent= (IFolder) container; - if (parent != null && !parent.exists()) { - createContainers(parent); - parent.create(false, true, null); - } - } - } - - private void updateWorkspace(final ResourceBundle bundle, Shell shell, - final AddFromHistoryDialog.HistoryInput[] selected) - 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, selected.length); - - for (int i= 0; i < selected.length; i++) { - IFile file= selected[i].fFile; - IFileState fileState= selected[i].fFileState; - createContainers(file); - - SubProgressMonitor subMonitor= new SubProgressMonitor(pm, 1); - try { - file.create(fileState.getContents(), false, subMonitor); - } finally { - subMonitor.done(); - } - } - } catch (CoreException e) { - throw new InvocationTargetException(e); - } finally { - pm.done(); - } - } - }; - - ProgressMonitorDialog pmdialog= new ProgressMonitorDialog(shell); - pmdialog.run(false, true, operation); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.properties deleted file mode 100644 index 0a97df87f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.properties +++ /dev/null @@ -1,45 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2010 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 -############################################################################### - -# @(#)AddFromHistoryAction.properties -# -# Resources for AddFromHistoryAction.java - -title= Restore from Local History - -memberPaneTitle= {0} - Available Files in Local History: - -treeTitleFormat= Local History of ''{0}'' -dateIcon= obj16/day_obj.gif -timeIcon= obj16/resource_obj.gif - -memberDescription= Check files to restore from local history: -editionDescription= Select an edition of a file: - -treeFormat= {0} -workspaceTreeFormat= {0} (Workspace File) -parseErrorFormat= {0} (Parse Error) - -editionLabel= Local History ({0}) -workspaceEditionLabel= Workspace File - -targetLabel= {0} - -todayFormat= Today ({0}) -yesterdayFormat= Yesterday ({0}) -dayFormat= {0} - -buttonLabel= &Restore - -noLocalHistoryError= No deleted resources in local history for selected container. -replaceError=Cannot replace resource (reason: {0}). - -taskName=Restoring diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryDialog.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryDialog.java deleted file mode 100644 index 0bb24bc9e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryDialog.java +++ /dev/null @@ -1,486 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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.internal; - -import java.io.*; -import com.ibm.icu.text.DateFormat; -import com.ibm.icu.text.MessageFormat; -import java.util.ArrayList; -import com.ibm.icu.util.Calendar; -import java.util.Date; -import java.util.Iterator; -import java.util.ResourceBundle; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.layout.*; -import org.eclipse.swt.widgets.*; - -import org.eclipse.jface.dialogs.*; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; - -import org.eclipse.compare.*; - - -public class AddFromHistoryDialog extends ResizableDialog { - - static class HistoryInput implements ITypedElement, IEncodedStreamContentAccessor, IModificationDate { - IFile fFile; - IFileState fFileState; - - HistoryInput(IFile file, IFileState fileState) { - fFile= file; - fFileState= fileState; - } - public InputStream getContents() throws CoreException { - return new BufferedInputStream(fFileState.getContents()); - } - public String getCharset() { - String charset= null; - try { - charset= fFileState.getCharset(); - } catch (CoreException e) { - // fall through - } - if (charset == null) - charset= Utilities.getCharset(fFile); - return charset; - } - public String getName() { - return fFile.getName(); - } - public String getType() { - return fFile.getFileExtension(); - } - public Image getImage() { - return CompareUI.getImage(fFile); - } - public long getModificationDate() { - return fFileState.getModificationTime(); - } - } - - static class FileHistory { - private IFile fFile; - private IFileState[] fStates; - private int fSelected; - - FileHistory(IFile file) { - fFile= file; - } - - IFile getFile() { - return fFile; - } - - IFileState[] getStates() { - if (fStates == null) { - try { - fStates= fFile.getHistory(new NullProgressMonitor()); - } catch (CoreException ex) { - // NeedWork - } - } - return fStates; - } - - IFileState getSelectedState() { - return getStates()[fSelected]; - } - - void setSelected(IFileState state) { - for (int i= 0; i < fStates.length; i++) { - if (fStates[i] == state) { - fSelected= i; - return; - } - } - } - - HistoryInput getHistoryInput() { - return new HistoryInput(fFile, getSelectedState()); - } - - boolean isSelected(int index) { - return index == fSelected; - } - } - - private CompareConfiguration fCompareConfiguration; - private ArrayList fArrayList= new ArrayList(); - private FileHistory fCurrentFileHistory; - - // SWT controls - private CompareViewerSwitchingPane fContentPane; - private Button fCommitButton; - private Table fMemberTable; - private CompareViewerPane fMemberPane; - private Tree fEditionTree; - private CompareViewerPane fEditionPane; - private Image fDateImage; - private Image fTimeImage; - - - public AddFromHistoryDialog(Shell parent, ResourceBundle bundle) { - super(parent, bundle); - - String iconName= Utilities.getString(fBundle, "dateIcon", "obj16/day_obj.gif"); //$NON-NLS-2$ //$NON-NLS-1$ - ImageDescriptor id= CompareUIPlugin.getImageDescriptor(iconName); - if (id != null) - fDateImage= id.createImage(); - iconName= Utilities.getString(fBundle, "timeIcon", "obj16/resource_obj.gif"); //$NON-NLS-1$ //$NON-NLS-2$ - id= CompareUIPlugin.getImageDescriptor(iconName); - if (id != null) - fTimeImage= id.createImage(); - } - - public boolean select(IContainer root, IFile[] inputFiles) { - - create(); // create widgets - - String format= Utilities.getString(fBundle, "memberPaneTitle"); //$NON-NLS-1$ - String title= MessageFormat.format(format, new Object[] { root.getName() }); - fMemberPane.setImage(CompareUI.getImage(root)); - fMemberPane.setText(title); - - // sort input files - final int count= inputFiles.length; - final IFile[] files= new IFile[count]; - for (int i= 0; i < count; i++) - files[i]= inputFiles[i]; - if (count > 1) - internalSort(files, 0, count-1); - - - String prefix= root.getFullPath().toString(); - - if (fMemberTable != null && !fMemberTable.isDisposed()) { - for (int i = 0; i < files.length; i++) { - IFile file = files[i]; - String path = file.getFullPath().toString(); - - // ignore a recently deleted file at the same path as the - // container - if (path.equals(prefix)) - continue; - - if (path.startsWith(prefix)) - path = path.substring(prefix.length() + 1); - TableItem ti = new TableItem(fMemberTable, SWT.NONE); - ti.setImage(CompareUI.getImage(file)); - ti.setText(path); - ti.setData(new FileHistory(file)); - } - } - - open(); - - return (getReturnCode() == OK) && (fArrayList.size() > 0); - } - - HistoryInput[] getSelected() { - HistoryInput[] selected= new HistoryInput[fArrayList.size()]; - Iterator iter= fArrayList.iterator(); - for (int i= 0; iter.hasNext(); i++) { - FileHistory h= (FileHistory) iter.next(); - selected[i]= h.getHistoryInput(); - } - return selected; - } - - protected synchronized Control createDialogArea(Composite parent2) { - - Composite parent= (Composite) super.createDialogArea(parent2); - - getShell().setText(Utilities.getString(fBundle, "title")); //$NON-NLS-1$ - - org.eclipse.compare.Splitter vsplitter= new org.eclipse.compare.Splitter(parent, SWT.VERTICAL); - vsplitter.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL - | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL)); - - vsplitter.addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fDateImage != null) - fDateImage.dispose(); - if (fTimeImage != null) - fTimeImage.dispose(); - } - } - ); - - // we need two panes: the left for the elements, the right one for the editions - Splitter hsplitter= new Splitter(vsplitter, SWT.HORIZONTAL); - - Composite c= new Composite(hsplitter, SWT.NONE); - GridLayout layout= new GridLayout(); - layout.marginWidth= 0; - layout.marginHeight= 2; - layout.verticalSpacing= 2; - layout.numColumns= 1; - c.setLayout(layout); - Label l1= new Label(c, SWT.NONE); - l1.setText(Utilities.getString(fBundle, "memberDescription")); //$NON-NLS-1$ - fMemberPane= new CompareViewerPane(c, SWT.BORDER | SWT.FLAT); - GridData gd= new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL); - fMemberPane.setLayoutData(gd); - - fMemberTable= new Table(fMemberPane, SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL); - fMemberTable.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (e.detail == SWT.CHECK) { - if (e.item instanceof TableItem) { - TableItem ti= (TableItem) e.item; - if (ti.getChecked()) - fArrayList.add(ti.getData()); - else - fArrayList.remove(ti.getData()); - - if (fCommitButton != null) - fCommitButton.setEnabled(fArrayList.size() > 0); - } - } else { - handleMemberSelect(e.item); - } - } - } - ); - - fMemberPane.setContent(fMemberTable); - - c= new Composite(hsplitter, SWT.NONE); - layout= new GridLayout(); - layout.marginWidth= 0; - layout.marginHeight= 2; - layout.verticalSpacing= 2; - layout.numColumns= 1; - c.setLayout(layout); - Label l2= new Label(c, SWT.NONE); - l2.setText(Utilities.getString(fBundle, "editionDescription")); //$NON-NLS-1$ - fEditionPane= new CompareViewerPane(c, SWT.BORDER | SWT.FLAT); - gd= new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL); - fEditionPane.setLayoutData(gd); - - fEditionTree= new Tree(fEditionPane, SWT.H_SCROLL | SWT.V_SCROLL); - fEditionTree.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - feedContent(e.item); - } - } - ); - fEditionPane.setContent(fEditionTree); - - applyDialogFont(parent); // to avoid applying font to compare viewer - fContentPane= new CompareViewerSwitchingPane(vsplitter, SWT.BORDER | SWT.FLAT) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - return CompareUI.findContentViewer(oldViewer, input, this, fCompareConfiguration); - } - }; - vsplitter.setWeights(new int[] { 30, 70 }); - - return parent; - } - - /* - * Feeds selection from member viewer to edition viewer. - */ - private void handleMemberSelect(Widget w) { - Object data= null; - if (w != null) - data= w.getData(); - if (data instanceof FileHistory) { - - FileHistory h= (FileHistory) data; - fCurrentFileHistory= h; - - IFile file= h.getFile(); - IFileState[] states= h.getStates(); - - fEditionPane.setImage(CompareUI.getImage(file)); - String pattern= Utilities.getString(fBundle, "treeTitleFormat"); //$NON-NLS-1$ - String title= MessageFormat.format(pattern, new Object[] { file.getName() }); - fEditionPane.setText(title); - - if (fEditionTree != null) { - fEditionTree.setRedraw(false); - fEditionTree.removeAll(); - for (int i= 0; i < states.length; i++) { - addEdition(new HistoryInput(file, states[i]), h.isSelected(i)); - } - fEditionTree.setRedraw(true); - } - } else - fCurrentFileHistory= null; - } - - /* - * Adds the given Pair to the edition tree. - * It takes care of creating tree nodes for different dates. - */ - private void addEdition(HistoryInput input, boolean isSelected) { - if (fEditionTree == null || fEditionTree.isDisposed()) - return; - - IFileState state= input.fFileState; - - // find last day - TreeItem[] days= fEditionTree.getItems(); - TreeItem lastDay= null; - if (days.length > 0) - lastDay= days[days.length-1]; - - long ldate= state.getModificationTime(); - long day= dayNumber(ldate); - Date date= new Date(ldate); - if (lastDay == null || day != dayNumber(((Date)lastDay.getData()).getTime())) { - lastDay= new TreeItem(fEditionTree, SWT.NONE); - lastDay.setImage(fDateImage); - String df= DateFormat.getDateInstance().format(date); - long today= dayNumber(System.currentTimeMillis()); - - String formatKey; - if (day == today) - formatKey= "todayFormat"; //$NON-NLS-1$ - else if (day == today-1) - formatKey= "yesterdayFormat"; //$NON-NLS-1$ - else - formatKey= "dayFormat"; //$NON-NLS-1$ - String pattern= Utilities.getString(fBundle, formatKey); - if (pattern != null) - df= MessageFormat.format(pattern, new String[] { df }); - lastDay.setText(df); - lastDay.setData(date); - } - TreeItem ti= new TreeItem(lastDay, SWT.NONE); - ti.setImage(fTimeImage); - ti.setText(DateFormat.getTimeInstance().format(date)); - ti.setData(input); - - if (isSelected) { - lastDay.setExpanded(true); - fEditionTree.setSelection(new TreeItem[] { ti }); - feedContent(ti); - } - } - - /* - * Returns the number of s since Jan 1st, 1970. - * The given date is converted to GMT and daylight saving is taken into account too. - */ - private long dayNumber(long date) { - int ONE_DAY_MS= 24*60*60 * 1000; // one day in milli seconds - - Calendar calendar= Calendar.getInstance(); - long localTimeOffset= calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET); - - return (date + localTimeOffset) / ONE_DAY_MS; - } - - /* - * Feeds the tree viewer's selection to the contentviewer - */ - private void feedContent(Widget w) { - if (fContentPane != null && !fContentPane.isDisposed()) { - Object o= w.getData(); - if (o instanceof HistoryInput) { - HistoryInput selected= (HistoryInput) o; - fContentPane.setInput(selected); - fContentPane.setText(getEditionLabel(selected)); - fContentPane.setImage(fTimeImage); - - if (fCurrentFileHistory != null) - fCurrentFileHistory.setSelected(selected.fFileState); - } else { - fContentPane.setInput(null); - } - } - } - - protected String getEditionLabel(HistoryInput input) { - String format= Utilities.getString(fBundle, "historyEditionLabel", null); //$NON-NLS-1$ - if (format == null) - format= Utilities.getString(fBundle, "editionLabel"); //$NON-NLS-1$ - if (format == null) - format= "x{0}"; //$NON-NLS-1$ - - long modDate= input.getModificationDate(); - String date= DateFormat.getDateTimeInstance().format(new Date(modDate)); - - return MessageFormat.format(format, new Object[] { date }); - } - - /* (non-Javadoc) - * Method declared on Dialog. - */ - protected void createButtonsForButtonBar(Composite parent) { - String buttonLabel= Utilities.getString(fBundle, "buttonLabel", IDialogConstants.OK_LABEL); //$NON-NLS-1$ - // a 'Cancel' and a 'Add' button - fCommitButton= createButton(parent, IDialogConstants.OK_ID, buttonLabel, true); - fCommitButton.setEnabled(false); - createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); - } - - /* - * Returns true if the pathname of f1 comes after f2 - */ - private static boolean greaterThan(IFile f1, IFile f2) { - String[] ss1= f1.getFullPath().segments(); - String[] ss2= f2.getFullPath().segments(); - int l1= ss1.length; - int l2= ss2.length; - int n= Math.max(l1, l2); - - for (int i= 0; i < n; i++) { - String s1= i < l1 ? ss1[i] : ""; //$NON-NLS-1$ - String s2= i < l2 ? ss2[i] : ""; //$NON-NLS-1$ - int rc= s1.compareToIgnoreCase(s2); - if (rc != 0) - return rc < 0; - } - return false; - } - - private static void internalSort(IFile[] keys, int left, int right) { - - int original_left= left; - int original_right= right; - - IFile mid= keys[(left + right) / 2]; - do { - while (greaterThan(keys[left], mid)) - left++; - - while (greaterThan(mid, keys[right])) - right--; - - if (left <= right) { - IFile tmp= keys[left]; - keys[left]= keys[right]; - keys[right]= tmp; - left++; - right--; - } - } while (left <= right); - - if (original_left < right) - internalSort(keys, original_left, right); - - if (left < original_right) - internalSort(keys, left, original_right); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BaseCompareAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BaseCompareAction.java deleted file mode 100644 index 0998e18d4..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BaseCompareAction.java +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.jface.action.IAction; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.ui.IActionDelegate; - - -public abstract class BaseCompareAction implements IActionDelegate { - - private ISelection fSelection; - - /* (non-Javadoc) - * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) - */ - final public void run(IAction action) { - run(fSelection); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection) - */ - final public void selectionChanged(IAction action, ISelection selection) { - fSelection= selection; - if (action != null) - action.setEnabled(isEnabled(fSelection)); - } - - protected boolean isEnabled(ISelection selection) { - return false; - } - - abstract protected void run(ISelection selection); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java deleted file mode 100644 index c6d9d2e91..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java +++ /dev/null @@ -1,140 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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.internal; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ResourceBundle; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.compare.CompareUI; -import org.eclipse.compare.IStreamContentAccessor; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.RowLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.ui.PlatformUI; - -import com.ibm.icu.text.MessageFormat; - -/** - * A simple compare viewer for binary files. - * Shows the position of the first non-matching byte. - */ -public class BinaryCompareViewer extends AbstractViewer { - - private static final String BUNDLE_NAME = "org.eclipse.compare.internal.BinaryCompareViewerResources"; //$NON-NLS-1$ - - private static final int EOF = -1; - private ICompareInput fInput; - private ResourceBundle fBundle; - private boolean fLeftIsLocal; - - private Composite fComposite; - private Label fMessage; - - public BinaryCompareViewer(Composite parent, final CompareConfiguration cc) { - - PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, ICompareContextIds.BINARY_COMPARE_VIEW); - - fBundle= ResourceBundle.getBundle(BUNDLE_NAME); - - fComposite= new Composite(parent, SWT.NONE); - RowLayout rowLayout = new RowLayout(); - rowLayout.type = SWT.VERTICAL; - fComposite.setLayout(rowLayout); - - fMessage= new Label(fComposite, SWT.WRAP); - fComposite.setData(CompareUI.COMPARE_VIEWER_TITLE, Utilities.getString(fBundle, "title")); //$NON-NLS-1$ - - fLeftIsLocal= Utilities.getBoolean(cc, "LEFT_IS_LOCAL", false); //$NON-NLS-1$ - - if (cc != null && cc.getContainer() instanceof CompareEditorInput) { - Label compareAsTextLabel = new Label(fComposite, SWT.WRAP); - compareAsTextLabel - .setText(Utilities.getString(fBundle, "compareAsText")); //$NON-NLS-1$ - } - } - - public Control getControl() { - return fComposite; - } - - public void setInput(Object input) { - if (fComposite != null && input instanceof ICompareInput) { - fInput= (ICompareInput) input; - - InputStream left= null; - InputStream right= null; - - String message= null; - try { - left= getStream(fInput.getLeft()); - right= getStream(fInput.getRight()); - - if (left != null && right != null) { - int pos= 0; - while (true) { - int l= left.read(); - int r= right.read(); - if (l != r) { - String format= Utilities.getString(fBundle, "diffMessageFormat"); //$NON-NLS-1$ - message= MessageFormat.format(format, new String[] { Integer.toString(pos) } ); - break; - } - if (l == EOF) - break; - pos++; - } - } else if (left == null && right == null) { - message= Utilities.getString(fBundle, "deleteConflictMessage"); //$NON-NLS-1$ - } else if (left == null) { - if (fLeftIsLocal) - message= Utilities.getString(fBundle, "deletedMessage"); //$NON-NLS-1$ - else - message= Utilities.getString(fBundle, "addedMessage"); //$NON-NLS-1$ - } else if (right == null) { - if (fLeftIsLocal) - message= Utilities.getString(fBundle, "addedMessage"); //$NON-NLS-1$ - else - message= Utilities.getString(fBundle, "deletedMessage"); //$NON-NLS-1$ - } - } catch (CoreException ex) { - message = Utilities.getString(fBundle, "errorMessage"); //$NON-NLS-1$ - CompareUIPlugin.log(ex); - } catch (IOException ex) { - message = Utilities.getString(fBundle, "errorMessage"); //$NON-NLS-1$ - CompareUIPlugin.log(ex); - } finally { - Utilities.close(left); - Utilities.close(right); - } - if (message != null) - fMessage.setText(message); - fComposite.layout(); - } - } - - public Object getInput() { - return fInput; - } - - private InputStream getStream(ITypedElement input) throws CoreException { - if (input instanceof IStreamContentAccessor) - return ((IStreamContentAccessor)input).getContents(); - return null; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerCreator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerCreator.java deleted file mode 100644 index e66bd88b6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerCreator.java +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.swt.widgets.Composite; -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.compare.*; - -/** - * A factory object for the <code>BinaryCompareViewer</code>. - * This indirection is necessary because only objects with a default - * constructor can be created via an extension point - * (this precludes Viewers). - */ -public class BinaryCompareViewerCreator implements IViewerCreator { - - public Viewer createViewer(Composite parent, CompareConfiguration mp) { - return new BinaryCompareViewer(parent, mp); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerResources.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerResources.properties deleted file mode 100644 index 225cb447b..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerResources.properties +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 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 -############################################################################### - -# @(#)BinaryCompareViewerResources.properties -# -# Resource strings for BinaryCompareViewer.java - -title= Binary Compare - -diffMessageFormat= First bytes differ at position {0} -deleteConflictMessage= Delete Conflict -addedMessage= Added Resource -deletedMessage= Removed Resource -errorMessage= Internal Error -compareAsText= Switch to Text Compare using the drop down menu above diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedCanvas.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedCanvas.java deleted file mode 100644 index af8af9041..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedCanvas.java +++ /dev/null @@ -1,98 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.swt.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.events.*; - -/** - * A Canvas which reduces flicker by drawing in an off screen buffer. - */ -public abstract class BufferedCanvas extends Canvas { - - //private static final boolean USE_DOUBLE_BUFFER= !"carbon".equals(SWT.getPlatform()); //$NON-NLS-1$ - private static final boolean USE_DOUBLE_BUFFER= true; - - /** The drawable for double buffering */ - Image fBuffer; - - public BufferedCanvas(Composite parent, int flags) { - super(parent, flags | SWT.NO_BACKGROUND); - - addPaintListener( - new PaintListener() { - public void paintControl(PaintEvent event) { - doubleBufferPaint(event.gc); - } - } - ); - - addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fBuffer != null) { - fBuffer.dispose(); - fBuffer= null; - } - } - } - ); - } - - public void repaint() { - if (!isDisposed()) { - GC gc= new GC(this); - doubleBufferPaint(gc); - gc.dispose(); - } - } - - /* - * Double buffer drawing. - */ - void doubleBufferPaint(GC dest) { - - if (!USE_DOUBLE_BUFFER) { - doPaint(dest); - return; - } - - Point size= getSize(); - - if (size.x <= 1 || size.y <= 1) // we test for <= 1 because on X11 controls have initial size 1,1 - return; - - if (fBuffer != null) { - Rectangle r= fBuffer.getBounds(); - if (r.width != size.x || r.height != size.y) { - fBuffer.dispose(); - fBuffer= null; - } - } - if (fBuffer == null) - fBuffer= new Image(getDisplay(), size.x, size.y); - - GC gc= new GC(fBuffer); - try { - gc.setBackground(getBackground()); - gc.fillRectangle(0, 0, size.x, size.y); - doPaint(gc); - } finally { - gc.dispose(); - } - - dest.drawImage(fBuffer, 0, 0); - } - - abstract public void doPaint(GC gc); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedResourceNode.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedResourceNode.java deleted file mode 100644 index ccf566c21..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedResourceNode.java +++ /dev/null @@ -1,128 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.*; - -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; -import org.eclipse.compare.*; -import org.eclipse.compare.structuremergeviewer.IStructureComparator; - -/** - * A buffer for a workspace resource. - */ -public class BufferedResourceNode extends ResourceNode { - - private boolean fDirty= false; - private IFile fDeleteFile; - - /** - * Creates a <code>ResourceNode</code> for the given resource. - * - * @param resource the resource - */ - public BufferedResourceNode(IResource resource) { - super(resource); - } - - /* - * Returns <code>true</code> if buffer contains uncommitted changes. - */ - public boolean isDirty() { - return fDirty; - } - - protected IStructureComparator createChild(IResource child) { - return new BufferedResourceNode(child); - } - - public void setContent(byte[] contents) { - fDirty= true; - super.setContent(contents); - } - - /* - * Commits buffered contents to resource. - */ - public void commit(IProgressMonitor pm) throws CoreException { - if (fDirty) { - - if (fDeleteFile != null) { - fDeleteFile.delete(true, true, pm); - return; - } - - IResource resource= getResource(); - if (resource instanceof IFile) { - - byte[] bytes= getContent(); - ByteArrayInputStream is= new ByteArrayInputStream(bytes); - try { - IFile file= (IFile) resource; - if (file.exists()) - file.setContents(is, false, true, pm); - else - file.create(is, false, pm); - fDirty= false; - } finally { - if (is != null) - try { - is.close(); - } catch(IOException ex) { - // Silently ignored - } - } - } - } - } - - public ITypedElement replace(ITypedElement child, ITypedElement other) { - - if (child == null) { // add resource - // create a node without a resource behind it! - IResource resource= getResource(); - if (resource instanceof IFolder) { - IFolder folder= (IFolder) resource; - IFile file= folder.getFile(other.getName()); - child= new BufferedResourceNode(file); - } - } - - if (other == null) { // delete resource - IResource resource= getResource(); - if (resource instanceof IFolder) { - IFolder folder= (IFolder) resource; - IFile file= folder.getFile(child.getName()); - if (file != null && file.exists()) { - fDeleteFile= file; - fDirty= true; - } - } - return null; - } - - if (other instanceof IStreamContentAccessor && child instanceof IEditableContent) { - IEditableContent dst= (IEditableContent) child; - - try { - InputStream is= ((IStreamContentAccessor)other).getContents(); - byte[] bytes= Utilities.readBytes(is); - if (bytes != null) - dst.setContent(bytes); - } catch (CoreException ex) { - // NeedWork - } - } - return child; - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ChangePropertyAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ChangePropertyAction.java deleted file mode 100644 index 85fd9b48e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ChangePropertyAction.java +++ /dev/null @@ -1,82 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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.util.ResourceBundle; - -import org.eclipse.jface.action.Action; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.compare.CompareConfiguration; - -/** - * Toggles a boolean property of an <code>CompareConfiguration</code>. - */ -public class ChangePropertyAction extends Action implements IPropertyChangeListener, DisposeListener { - - private CompareConfiguration fCompareConfiguration; - private String fPropertyKey; - private ResourceBundle fBundle; - private String fPrefix; - - public static ChangePropertyAction createIgnoreWhiteSpaceAction(ResourceBundle bundle, CompareConfiguration compareConfiguration) { - return new ChangePropertyAction(bundle, compareConfiguration, "action.IgnoreWhiteSpace.", CompareConfiguration.IGNORE_WHITESPACE); //$NON-NLS-1$ - } - public static ChangePropertyAction createShowPseudoConflictsAction(ResourceBundle bundle, CompareConfiguration compareConfiguration) { - return new ChangePropertyAction(bundle, compareConfiguration, "action.ShowPseudoConflicts.", CompareConfiguration.SHOW_PSEUDO_CONFLICTS); //$NON-NLS-1$ - } - - public ChangePropertyAction(ResourceBundle bundle, CompareConfiguration cc, String rkey, String pkey) { - fPropertyKey= pkey; - fBundle= bundle; - fPrefix= rkey; - Utilities.initAction(this, fBundle, fPrefix); - setCompareConfiguration(cc); - } - - public void run() { - boolean b= !Utilities.getBoolean(fCompareConfiguration, fPropertyKey, false); - setChecked(b); - if (fCompareConfiguration != null) - fCompareConfiguration.setProperty(fPropertyKey, new Boolean(b)); - } - - public void setChecked(boolean state) { - super.setChecked(state); - Utilities.initToggleAction(this, fBundle, fPrefix, state); - } - - public void setCompareConfiguration(CompareConfiguration cc) { - if (fCompareConfiguration != null) - fCompareConfiguration.removePropertyChangeListener(this); - fCompareConfiguration= cc; - if (fCompareConfiguration != null) - fCompareConfiguration.addPropertyChangeListener(this); - setChecked(Utilities.getBoolean(fCompareConfiguration, fPropertyKey, false)); - } - - public void propertyChange(PropertyChangeEvent event) { - if (event.getProperty().equals(fPropertyKey)) { - setChecked(Utilities.getBoolean(fCompareConfiguration, fPropertyKey, false)); - } - } - - public void dispose(){ - if (fCompareConfiguration != null) - fCompareConfiguration.removePropertyChangeListener(this); - } - - public void widgetDisposed(DisposeEvent e) { - dispose(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java deleted file mode 100644 index 0ff9e5444..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java +++ /dev/null @@ -1,64 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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 - * Matt McCutchen (hashproduct+eclipse@gmail.com) - Bug 35390 Three-way compare cannot select (mis-selects) )ancestor resource - * Aleksandra Wozniak (aleksandra.k.wozniak@gmail.com) - Bug 239959 - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareUI; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.ui.IObjectActionDelegate; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchPart; - - -/* - * The "Compare with each other" action - */ -public class CompareAction extends BaseCompareAction implements IObjectActionDelegate { - - protected ResourceCompareInput fInput; - protected IWorkbenchPage fWorkbenchPage; - protected boolean showSelectAncestorDialog = true; - - public void run(ISelection selection) { - if (fInput != null) { - // Pass the shell so setSelection can prompt the user for which - // resource should be the ancestor - boolean ok = fInput.setSelection(selection, fWorkbenchPage - .getWorkbenchWindow().getShell(), showSelectAncestorDialog); - if (!ok) return; - fInput.initializeCompareConfiguration(); - CompareUI.openCompareEditorOnPage(fInput, fWorkbenchPage); - fInput= null; // don't reuse this input! - } - } - - protected boolean isEnabled(ISelection selection) { - if (fInput == null) { - CompareConfiguration cc= new CompareConfiguration(); - // buffered merge mode: don't ask for confirmation - // when switching between modified resources - cc.setProperty(CompareEditor.CONFIRM_SAVE_PROPERTY, new Boolean(false)); - - // uncomment following line to have separate outline view - //cc.setProperty(CompareConfiguration.USE_OUTLINE_VIEW, new Boolean(true)); - - fInput= new ResourceCompareInput(cc); - } - return fInput.isEnabled(selection); - } - - public void setActivePart(IAction action, IWorkbenchPart targetPart) { - fWorkbenchPage= targetPart.getSite().getPage(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareContainer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareContainer.java deleted file mode 100644 index 2a106c004..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareContainer.java +++ /dev/null @@ -1,112 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2007 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.lang.reflect.InvocationTargetException; - -import org.eclipse.compare.ICompareContainer; -import org.eclipse.compare.ICompareNavigator; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.ui.*; -import org.eclipse.ui.services.IServiceLocator; - -public class CompareContainer implements ICompareContainer { - - private WorkerJob worker; - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#setStatusMessage(java.lang.String) - */ - public void setStatusMessage(String message) { - // Do nothing, by default - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#addCompareInputChangeListener(org.eclipse.compare.structuremergeviewer.ICompareInput, org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener) - */ - public void addCompareInputChangeListener(ICompareInput input, - ICompareInputChangeListener listener) { - input.addCompareInputChangeListener(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#removeCompareInputChangeListener(org.eclipse.compare.structuremergeviewer.ICompareInput, org.eclipse.compare.structuremergeviewer.ICompareInputChangeListener) - */ - public void removeCompareInputChangeListener(ICompareInput input, - ICompareInputChangeListener listener) { - input.removeCompareInputChangeListener(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#registerContextMenu(org.eclipse.jface.action.MenuManager, org.eclipse.jface.viewers.ISelectionProvider) - */ - public void registerContextMenu(MenuManager menu, - ISelectionProvider selectionProvider) { - // Nothing to do - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#getServiceLocator() - */ - public IServiceLocator getServiceLocator() { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#getActionBars() - */ - public IActionBars getActionBars() { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress) - */ - public void run(boolean fork, boolean cancelable, - IRunnableWithProgress runnable) - throws InvocationTargetException, InterruptedException { - PlatformUI.getWorkbench().getProgressService().run(fork, cancelable, runnable); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#getNavigator() - */ - public ICompareNavigator getNavigator() { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#runAsynchronously(org.eclipse.jface.operation.IRunnableWithProgress) - */ - public synchronized void runAsynchronously(IRunnableWithProgress runnable) { - if (worker == null) - worker = createWorkerJob(); - worker.add(runnable); - } - - protected WorkerJob createWorkerJob() { - WorkerJob workerJob = new WorkerJob(getWorkerJobName()); - return workerJob; - } - - protected String getWorkerJobName() { - return CompareMessages.CompareContainer_0; - } - - public IWorkbenchPart getWorkbenchPart() { - return null; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareContentViewerSwitchingPane.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareContentViewerSwitchingPane.java deleted file mode 100644 index d92ad78ba..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareContentViewerSwitchingPane.java +++ /dev/null @@ -1,285 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2010 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.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.compare.CompareViewerSwitchingPane; -import org.eclipse.compare.Splitter; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CLabel; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.MenuAdapter; -import org.eclipse.swt.events.MenuEvent; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.RowLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; -import org.eclipse.swt.widgets.ToolBar; -import org.eclipse.swt.widgets.ToolItem; -import org.eclipse.ui.PlatformUI; - -public class CompareContentViewerSwitchingPane extends - CompareViewerSwitchingPane { - - private static final String OPTIMIZED_INFO_IMAGE_NAME = "obj16/message_info.gif"; //$NON-NLS-1$ - public static final String OPTIMIZED_ALGORITHM_USED = "OPTIMIZED_ALGORITHM_USED"; //$NON-NLS-1$ - - private CompareEditorInput fCompareEditorInput; - - private ViewerDescriptor fSelectedViewerDescriptor; - - private ToolBar toolBar; - private CLabel clOptimized; - - private boolean menuShowing; - - public CompareContentViewerSwitchingPane(Splitter parent, int style, - CompareEditorInput cei) { - super(parent, style); - fCompareEditorInput = cei; - } - - private CompareConfiguration getCompareConfiguration() { - return fCompareEditorInput.getCompareConfiguration(); - } - - protected Viewer getViewer(Viewer oldViewer, Object input) { - if (fSelectedViewerDescriptor != null) { - ViewerDescriptor[] array = CompareUIPlugin.getDefault().findContentViewerDescriptor( - oldViewer, input, getCompareConfiguration()); - List list = array != null ? Arrays.asList(array) - : Collections.EMPTY_LIST; - if (list.contains(fSelectedViewerDescriptor)) { - // use selected viewer only when appropriate for the new input - fCompareEditorInput - .setContentViewerDescriptor(fSelectedViewerDescriptor); - Viewer viewer = fCompareEditorInput.findContentViewer( - oldViewer, (ICompareInput) input, this); - return viewer; - } - // fallback to default otherwise - fSelectedViewerDescriptor = null; - } - if (input instanceof ICompareInput) { - fCompareEditorInput.setContentViewerDescriptor(null); - Viewer viewer = fCompareEditorInput.findContentViewer(oldViewer, - (ICompareInput) input, this); - fCompareEditorInput.setContentViewerDescriptor(fSelectedViewerDescriptor); - return viewer; - } - return null; - } - - protected Control createTopLeft(Composite p) { - final Composite composite = new Composite(p, SWT.NONE) { - public Point computeSize(int wHint, int hHint, boolean changed) { - return super.computeSize(wHint, Math.max(24, hHint), changed); - } - }; - - RowLayout layout = new RowLayout(); - layout.marginTop = 0; - composite.setLayout(layout); - - CLabel cl = new CLabel(composite, SWT.NONE); - cl.setText(null); - - toolBar = new ToolBar(composite, SWT.FLAT); - toolBar.setVisible(false); // hide by default - final ToolItem toolItem = new ToolItem(toolBar, SWT.PUSH, 0); - toolItem.setImage(PlatformUI.getWorkbench().getSharedImages().getImage( - /* IWorkbenchGraphicConstants */"IMG_LCL_VIEW_MENU")); //$NON-NLS-1$ - toolItem - .setToolTipText(CompareMessages.CompareContentViewerSwitchingPane_switchButtonTooltip); - toolItem.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - showMenu(); - } - }); - toolBar.addMouseListener(new MouseAdapter() { - public void mouseDown(MouseEvent e) { - showMenu(); - } - }); - - clOptimized = new CLabel(composite, SWT.NONE); - clOptimized - .setText(CompareMessages.CompareContentViewerSwitchingPane_optimized); - clOptimized - .setToolTipText(CompareMessages.CompareContentViewerSwitchingPane_optimizedTooltip); - clOptimized.setImage(CompareUIPlugin.getImageDescriptor( - OPTIMIZED_INFO_IMAGE_NAME).createImage()); - clOptimized.setVisible(false); // hide by default - clOptimized.addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - Image img = clOptimized.getImage(); - if ((img != null) && (!img.isDisposed())) { - img.dispose(); - } - } - }); - - return composite; - } - - protected boolean inputChanged(Object input) { - return getInput() != input - || fCompareEditorInput.getContentViewerDescriptor() != fSelectedViewerDescriptor; - } - - public void setInput(Object input) { - super.setInput(input); - if (getViewer() == null || !Utilities.okToUse(getViewer().getControl())) - return; - ViewerDescriptor[] vd = CompareUIPlugin.getDefault() - .findContentViewerDescriptor(getViewer(), getInput(), - getCompareConfiguration()); - toolBar.setVisible(vd != null && vd.length > 1); - CompareConfiguration cc = getCompareConfiguration(); - Boolean isOptimized = (Boolean) cc.getProperty(OPTIMIZED_ALGORITHM_USED); - clOptimized.setVisible(isOptimized != null && isOptimized.booleanValue()); - } - - private void showMenu() { - if (menuShowing) - return; - menuShowing= true; - - ViewerDescriptor[] vd = CompareUIPlugin.getDefault() - .findContentViewerDescriptor(getViewer(), getInput(), - getCompareConfiguration()); - - // 1. create - final Menu menu = new Menu(getShell(), SWT.POP_UP); - - // add default - String label = CompareMessages.CompareContentViewerSwitchingPane_defaultViewer; - MenuItem defaultItem = new MenuItem(menu, SWT.RADIO); - defaultItem.setText(label); - defaultItem.addSelectionListener(createSelectionListener(null)); - defaultItem.setSelection(fSelectedViewerDescriptor == null); - - new MenuItem(menu, SWT.SEPARATOR); - - // add others - for (int i = 0; i < vd.length; i++) { - final ViewerDescriptor vdi = vd[i]; - label = vdi.getLabel(); - if (label == null || label.equals("")) { //$NON-NLS-1$ - String l = CompareUIPlugin.getDefault().findContentTypeNameOrType((ICompareInput) getInput(), vdi, getCompareConfiguration()); - if (l == null) - // couldn't figure out the label, skip the viewer - continue; - label = NLS.bind(CompareMessages.CompareContentViewerSwitchingPane_discoveredLabel, new Object[] {l}); - } - MenuItem item = new MenuItem(menu, SWT.RADIO); - item.setText(label); - item.addSelectionListener(createSelectionListener(vdi)); - item.setSelection(vdi == fSelectedViewerDescriptor); - } - - // 2. show - Rectangle bounds = toolBar.getItem(0).getBounds(); - Point topLeft = new Point(bounds.x, bounds.y + bounds.height); - topLeft = toolBar.toDisplay(topLeft); - menu.setLocation(topLeft.x, topLeft.y); - menu.setVisible(true); - - // 3. dispose on close - menu.addMenuListener(new MenuAdapter() { - public void menuHidden(MenuEvent e) { - menuShowing= false; - e.display.asyncExec(new Runnable() { - public void run() { - menu.dispose(); - } - }); - } - }); - } - - private SelectionListener createSelectionListener(final ViewerDescriptor vd) { - return new SelectionListener() { - public void widgetSelected(SelectionEvent e) { - MenuItem mi = (MenuItem) e.widget; - if (mi.getSelection()) { - Viewer oldViewer = getViewer(); - fSelectedViewerDescriptor = vd; - CompareContentViewerSwitchingPane.this.setInput(oldViewer - .getInput()); - } - } - - public void widgetDefaultSelected(SelectionEvent e) { - // nothing to do - } - }; - } - - public void setText(String label) { - Composite c = (Composite) getTopLeft(); - Control[] children = c.getChildren(); - for (int i = 0; i < children.length; i++) { - if (children[i] instanceof CLabel) { - CLabel cl = (CLabel) children[i]; - if (cl != null && !cl.isDisposed()) { - cl.setText(label); - c.layout(); - } - return; - } - } - } - - public void setImage(Image image) { - Composite c = (Composite) getTopLeft(); - Control[] children = c.getChildren(); - for (int i = 0; i < children.length; i++) { - if (children[i] instanceof CLabel) { - CLabel cl = (CLabel) children[i]; - if (cl != null && !cl.isDisposed()) - cl.setImage(image); - return; - } - } - } - - public void addMouseListener(MouseListener listener) { - Composite c = (Composite) getTopLeft(); - Control[] children = c.getChildren(); - for (int i = 0; i < children.length; i++) { - if (children[i] instanceof CLabel) { - CLabel cl = (CLabel) children[i]; - cl.addMouseListener(listener); - } - } - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareDialog.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareDialog.java deleted file mode 100644 index 7a7fcd0ac..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareDialog.java +++ /dev/null @@ -1,286 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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.lang.reflect.InvocationTargetException; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.ProgressMonitorDialog; -import org.eclipse.jface.dialogs.TrayDialog; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.PlatformUI; - -/** - * This is a dialog that can host a {@link CompareEditorInput}. - * <p> - * This class can be used as is or can be subclassed. - * - * @since 3.3 - */ -public class CompareDialog extends TrayDialog implements IPropertyChangeListener { - - private final CompareEditorInput fCompareEditorInput; - private Button fCommitButton; - private Label statusLabel; - boolean hasSettings = true; - private final DialogCompareContainer fContainer = new DialogCompareContainer(); - - private class DialogCompareContainer extends CompareContainer { - - /* (non-Javadoc) - * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress) - */ - public void run(boolean fork, boolean cancelable, - IRunnableWithProgress runnable) throws InvocationTargetException, - InterruptedException { - ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell()); - dialog.run(fork, cancelable, runnable); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#setStatusMessage(java.lang.String) - */ - public void setStatusMessage(String message) { - if (statusLabel != null && !statusLabel.isDisposed()) { - if (message == null) { - statusLabel.setText(""); //$NON-NLS-1$ - } else { - statusLabel.setText(message); - } - } - } - } - - /** - * Create a dialog to host the given input. - * @param shell a shell - * @param input the dialog input - */ - public CompareDialog(Shell shell, CompareEditorInput input) { - super(shell); - setShellStyle(getShellStyle() | SWT.RESIZE | SWT.MAX); - Assert.isNotNull(input); - fCompareEditorInput= input; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.internal.ResizableDialog#close() - */ - public boolean close() { - if (super.close()) { - if (fCompareEditorInput != null) - fCompareEditorInput.removePropertyChangeListener(this); - return true; - } - return false; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) - */ - protected void createButtonsForButtonBar(Composite parent) { - fCommitButton= createButton(parent, IDialogConstants.OK_ID, getOKButtonLabel(), true); - fCommitButton.setEnabled(isOKEnabled()); - if (isCancelable()) { - createButton(parent, IDialogConstants.CANCEL_ID, getCancelButtonLabel(), false); - } - } - - private String getCancelButtonLabel() { - return fCompareEditorInput.getCancelButtonLabel(); - } - - private boolean isCancelable() { - return isInputEditable() || isElementSelectionDialog(); - } - - private String getOKButtonLabel() { - return fCompareEditorInput.getOKButtonLabel(); - } - - private boolean isElementSelectionDialog() { - return fCompareEditorInput.isEditionSelectionDialog(); - } - - /** - * Return whether the compare editor input of this dialog is editable. - * By default, the input is editable if the compare configuration - * indicates that either the left or right sides are editable. - * Subclasses may override. - * @return whether the compare editor input of this dialog is editable - * @see CompareConfiguration#isLeftEditable() - * @see CompareConfiguration#isRightEditable() - */ - protected boolean isInputEditable() { - return fCompareEditorInput.getCompareConfiguration().isLeftEditable() - || fCompareEditorInput.getCompareConfiguration().isRightEditable(); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) - */ - public void propertyChange(PropertyChangeEvent event) { - if (event.getProperty().equals(CompareEditorInput.DIRTY_STATE) - || event.getProperty().equals(CompareEditorInput.PROP_SELECTED_EDITION)) { - if (fCommitButton != null && fCompareEditorInput != null) - fCommitButton.setEnabled(isOKEnabled()); - } else if (event.getProperty().equals(CompareEditorInput.PROP_TITLE)) { - getShell().setText(fCompareEditorInput.getTitle()); - } else if (event.getProperty().equals(CompareEditorInput.PROP_TITLE_IMAGE)) { - getShell().setImage(fCompareEditorInput.getTitleImage()); - } - } - - private boolean isOKEnabled() { - if (isInputEditable()) - return fCompareEditorInput.isDirty(); - if (isElementSelectionDialog()) - return getSelectedElement() != null; - return true; - } - - private Object getSelectedElement() { - return fCompareEditorInput.getSelectedEdition(); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) - */ - protected Control createDialogArea(Composite parent2) { - - Composite parent= (Composite) super.createDialogArea(parent2); - - Control c= fCompareEditorInput.createContents(parent); - c.setLayoutData(new GridData(GridData.FILL_BOTH)); - - statusLabel = new Label(parent, SWT.NONE); - statusLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - Shell shell= c.getShell(); - shell.setText(fCompareEditorInput.getTitle()); - shell.setImage(fCompareEditorInput.getTitleImage()); - applyDialogFont(parent); - return parent; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.window.Window#open() - */ - public int open() { - // Before opening, set the container of the input and listen - // for changes to the input - fCompareEditorInput.addPropertyChangeListener(this); - fCompareEditorInput.setContainer(fContainer); - return super.open(); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int) - */ - protected void buttonPressed(int buttonId) { - if (buttonId == OK) { - if (!fCompareEditorInput.okPressed()) - return; - } else if (buttonId == CANCEL) { - fCompareEditorInput.cancelPressed(); - } - super.buttonPressed(buttonId); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings() - */ - protected IDialogSettings getDialogBoundsSettings() { - IDialogSettings compareSettings = CompareUIPlugin.getDefault().getDialogSettings(); - String sectionName = this.getClass().getName(); - IDialogSettings dialogSettings = compareSettings.getSection(sectionName); - if (dialogSettings == null) { - hasSettings = false; - dialogSettings = compareSettings.addNewSection(sectionName); - } - return dialogSettings; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.internal.ResizableDialog#configureShell(org.eclipse.swt.widgets.Shell) - */ - protected void configureShell(Shell newShell) { - super.configureShell(newShell); - if (getHelpContextId() != null) - PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, getHelpContextId()); - } - - /** - * Return the help content id for this dialog or <code>null</code>. - * By default, a generic help content id is returned. Subclasses may - * override. - * @return the help content id for this dialog or <code>null</code> - */ - public String getHelpContextId() { - return ICompareContextIds.COMPARE_DIALOG; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#getInitialSize() - */ - protected Point getInitialSize() { - Point initialSize = super.getInitialSize(); - if (hasSettings) { - return initialSize; - } - return getDefaultSize(); - } - - /** - * If we don't have settings we need to come up with a reasonable default - * since we can't depend on the compare editor input layout returning a - * good default size. - * @return the default size of the dialog - */ - protected Point getDefaultSize() { - int width= 0; - int height= 0; - Shell shell= getParentShell(); - if (shell != null) { - Point parentSize= shell.getSize(); - width= parentSize.x-100; - height= parentSize.y-100; - } - if (width < 700) - width= 700; - if (height < 500) - height= 500; - return new Point(width, height); - } - - /** - * Return the compare editor input for this dialog. - * @return the compare editor input for this dialog - */ - protected final CompareEditorInput getInput() { - return fCompareEditorInput; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java deleted file mode 100644 index f3fbc5261..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java +++ /dev/null @@ -1,771 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.HashSet; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.compare.IPropertyChangeNotifier; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jface.action.IStatusLineManager; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.dialogs.ErrorDialog; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.text.IFindReplaceTarget; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.IActionBars; -import org.eclipse.ui.IEditorActionBarContributor; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IEditorSite; -import org.eclipse.ui.IReusableEditor; -import org.eclipse.ui.ISaveablesLifecycleListener; -import org.eclipse.ui.ISaveablesSource; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.IWorkbenchPartConstants; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.Saveable; -import org.eclipse.ui.SaveablesLifecycleEvent; -import org.eclipse.ui.actions.WorkspaceModifyOperation; -import org.eclipse.ui.contexts.IContextService; -import org.eclipse.ui.part.EditorPart; -import org.eclipse.ui.part.IShowInSource; -import org.eclipse.ui.part.PageBook; -import org.eclipse.ui.services.IServiceLocator; -import org.eclipse.ui.texteditor.ITextEditorExtension3; -import org.eclipse.ui.views.contentoutline.IContentOutlinePage; - -/** - * A CompareEditor takes a ICompareEditorInput as input. - * Most functionality is delegated to the ICompareEditorInput. - */ -public class CompareEditor extends EditorPart implements IReusableEditor, ISaveablesSource, IPropertyChangeListener, ISaveablesLifecycleListener { - - public final static String CONFIRM_SAVE_PROPERTY= "org.eclipse.compare.internal.CONFIRM_SAVE_PROPERTY"; //$NON-NLS-1$ - - private static final int UNINITIALIZED = 0; - private static final int INITIALIZING = 1; - private static final int NO_DIFF = 2; - private static final int CANCELED = 3; - private static final int INITIALIZED = 4; - private static final int ERROR = 5; - private static final int STILL_INITIALIZING = 6; - private static final int CREATING_CONTROL = 7; - private static final int DONE = 8; - - private IActionBars fActionBars; - - private PageBook fPageBook; - - /** the SWT control from the compare editor input*/ - private Control fControl; - /** the outline page */ - private CompareOutlinePage fOutlinePage; - - private CompareSaveable fSaveable; - - private Control initializingPage; - private Control emptyPage; - - private int state = UNINITIALIZED; - private HashSet knownSaveables; - - private final EditorCompareContainer fContainer = new EditorCompareContainer(); - - private class EditorCompareContainer extends CompareContainer { - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#registerContextMenu(org.eclipse.jface.action.MenuManager, org.eclipse.jface.viewers.ISelectionProvider) - */ - public void registerContextMenu(MenuManager menu, ISelectionProvider provider) { - if (getSite() instanceof IEditorSite) { - IEditorSite es = (IEditorSite) getSite(); - es.registerContextMenu(menu, provider, true); - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#setStatusMessage(java.lang.String) - */ - public void setStatusMessage(String message) { - if (fActionBars != null) { - IStatusLineManager slm= fActionBars.getStatusLineManager(); - if (slm != null) { - slm.setMessage(message); - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareContainer#getServiceLocator() - */ - public IServiceLocator getServiceLocator() { - return getSite(); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.internal.CompareContainer#createWorkerJob() - */ - protected WorkerJob createWorkerJob() { - WorkerJob workerJob = new WorkerJob(getWorkerJobName()) { - public boolean belongsTo(Object family) { - if (family == CompareEditor.this) - return true; - return super.belongsTo(family); - } - }; - return workerJob; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.internal.CompareContainer#getWorkerJobName() - */ - protected String getWorkerJobName() { - return NLS.bind(CompareMessages.CompareEditor_2, getTitle()); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.internal.CompareContainer#getWorkbenchPart() - */ - public IWorkbenchPart getWorkbenchPart() { - return CompareEditor.this; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.internal.CompareContainer#getActionBars() - */ - public IActionBars getActionBars() { - return CompareEditor.this.getActionBars(); - } - } - - /** - * No-argument constructor required for extension points. - */ - public CompareEditor() { - // empty default implementation - } - - /* (non-Javadoc) - * Method declared on IAdaptable - */ - public Object getAdapter(Class key) { - - if (key.equals(IContentOutlinePage.class)) { - Object object= getCompareConfiguration().getProperty(CompareConfiguration.USE_OUTLINE_VIEW); - if (object instanceof Boolean && ((Boolean)object).booleanValue()) { - if (fOutlinePage != null) { - if (fOutlinePage.getControl() != null && fOutlinePage.getControl().isDisposed()) { - fOutlinePage = null; - } else { - return fOutlinePage; - } - } - fOutlinePage= new CompareOutlinePage(this); - return fOutlinePage; - } - } - - if (key == IShowInSource.class - || key == OutlineViewerCreator.class - || key == IFindReplaceTarget.class) { - Object input = getEditorInput(); - if (input != null) { - return Utilities.getAdapter(input, key); - } - } - - if (key == IEditorInput.class) { - return getEditorInput().getAdapter(IEditorInput.class); - } - - if (key == ITextEditorExtension3.class) { - return getEditorInput().getAdapter(ITextEditorExtension3.class); - } - - return super.getAdapter(key); - } - - /* - * Helper method used by ComapreEditorConfiguration to get at the compare configuration of the editor - */ - /* package */ CompareConfiguration getCompareConfiguration() { - IEditorInput input= getEditorInput(); - if (input instanceof CompareEditorInput) - return ((CompareEditorInput)input).getCompareConfiguration(); - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput) - */ - public void init(IEditorSite site, IEditorInput input) throws PartInitException { - - if (!(input instanceof CompareEditorInput)) - throw new PartInitException(Utilities.getString("CompareEditor.invalidInput")); //$NON-NLS-1$ - - setSite(site); - setInput(input); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput) - */ - public void setInput(IEditorInput input) { - if (!(input instanceof CompareEditorInput)) { - IStatus s= new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, IStatus.OK, Utilities.getString("CompareEditor.invalidInput"), null); //$NON-NLS-1$ - String title= Utilities.getString("CompareEditor.error.setinput.title"); //$NON-NLS-1$ - String msg= Utilities.getString("CompareEditor.error.setinput.message"); //$NON-NLS-1$ - ErrorDialog.openError(getSite().getShell(), title, msg, s); - return; - } - doSetInput(input); - // Need to refresh the contributor (see #67888) - refreshActionBarsContributor(); - } - - public void refreshActionBarsContributor() { - IEditorSite editorSite= getEditorSite(); - if (editorSite != null) { - IEditorActionBarContributor actionBarContributor= editorSite.getActionBarContributor(); - if (actionBarContributor != null) { - actionBarContributor.setActiveEditor(null); - actionBarContributor.setActiveEditor(this); - } - } - } - - private void doSetInput(IEditorInput input) { - IEditorInput oldInput= getEditorInput(); - disconnectFromInput(oldInput); - Point oldSize = null; - boolean hadPreviousInput = oldInput != null; - if (hadPreviousInput) { - // Cancel any jobs associated with the old input - Job.getJobManager().cancel(this); - if (fControl != null && !fControl.isDisposed()) { - oldSize= fControl.getSize(); - if (emptyPage == null) - emptyPage = new Composite(fPageBook, SWT.NONE); - fPageBook.showPage(emptyPage); - fControl.dispose(); - fControl = null; - } - } - - super.setInput(input); - - if (fOutlinePage != null) - fOutlinePage.reset(); - - final CompareEditorInput cei= (CompareEditorInput) input; - cei.setContainer(fContainer); - setTitleImage(cei.getTitleImage()); - setPartName(cei.getTitle()); - setTitleToolTip(cei.getToolTipText()); - - if (input instanceof IPropertyChangeNotifier) - ((IPropertyChangeNotifier)input).addPropertyChangeListener(this); - - setState(cei.getCompareResult() == null ? INITIALIZING : INITIALIZED); - if (fPageBook != null) - createCompareControl(); - if (fControl != null && oldSize != null) - fControl.setSize(oldSize); - - boolean hasResult = cei.getCompareResult() != null; - if (!hasResult) { - initializeInBackground(cei, hadPreviousInput); - } - - firePropertyChange(IWorkbenchPartConstants.PROP_INPUT); - - // We only need to notify of new Saveables if we are changing inputs - if (hadPreviousInput && hasResult) { - registerSaveable(); - } - } - - private void registerSaveable() { - ISaveablesLifecycleListener lifecycleListener= (ISaveablesLifecycleListener) getSite().getService(ISaveablesLifecycleListener.class); - lifecycleListener.handleLifecycleEvent( - new SaveablesLifecycleEvent(this, SaveablesLifecycleEvent.POST_OPEN, internalGetSaveables(true), false)); - } - - private void disconnectFromInput(IEditorInput oldInput) { - if (oldInput != null) { - - if (oldInput instanceof IPropertyChangeNotifier) - ((IPropertyChangeNotifier)oldInput).removePropertyChangeListener(this); - - // Let the workbench know that the old input's saveables are no longer needed - if (knownSaveables != null && !knownSaveables.isEmpty()) { - ISaveablesLifecycleListener lifecycleListener= (ISaveablesLifecycleListener) getSite().getService(ISaveablesLifecycleListener.class); - lifecycleListener.handleLifecycleEvent( - new SaveablesLifecycleEvent(this, SaveablesLifecycleEvent.POST_CLOSE, (Saveable[]) knownSaveables.toArray(new Saveable[knownSaveables.size()]), false)); - knownSaveables.clear(); - } - } - } - - protected void initializeInBackground(final CompareEditorInput cei, final boolean hadPreviousInput) { - // Need to cancel any running jobs associated with the oldInput - Job job = new Job(NLS.bind(CompareMessages.CompareEditor_0, cei.getTitle())) { - protected IStatus run(final IProgressMonitor monitor) { - final int[] newState = new int[] { ERROR }; - try { - IStatus status = CompareUIPlugin.getDefault().prepareInput(cei, monitor); - if (status.isOK()) { - // We need to update the saveables list - newState[0] = INITIALIZED; - return Status.OK_STATUS; - } - if (status.getCode() == CompareUIPlugin.NO_DIFFERENCE) { - newState[0] = NO_DIFF; - return Status.OK_STATUS; - } - newState[0] = ERROR; - return status; - } catch (OperationCanceledException e) { - newState[0] = CANCELED; - return Status.CANCEL_STATUS; - } finally { - if (monitor.isCanceled()) - newState[0] = CANCELED; - Display.getDefault().syncExec(new Runnable() { - public void run() { - if (fPageBook.isDisposed()) - return; - // we need to register the saveable if we had a previous input or if - // there are knownSaveables (which means that the workbench called - // getSaveables and got an empty list - if (hadPreviousInput || (knownSaveables != null && !isAllSaveablesKnown())) { - registerSaveable(); - } - setState(newState[0]); - createCompareControl(); - } - }); - monitor.done(); - } - } - public boolean belongsTo(Object family) { - if (family == CompareEditor.this || family == cei) - return true; - return cei.belongsTo(family); - } - }; - job.setUser(true); - Utilities.schedule(job, getSite()); - } - - /* - * Helper method used to find an action bars using the Utilities#findActionsBars(Control) - */ - public IActionBars getActionBars() { - return fActionBars; - } - - /* - * Set the action bars so the Utilities class can access it. - */ - /* package */ void setActionBars(IActionBars actionBars) { - fActionBars= actionBars; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) - */ - public void createPartControl(Composite parent) { - parent.setData(this); - fPageBook = new PageBook(parent, SWT.NONE); - createCompareControl(); - IContextService service = (IContextService)getSite().getService(IContextService.class); - if (service != null) { - service.activateContext("org.eclipse.compare.compareEditorScope"); //$NON-NLS-1$ - service.activateContext("org.eclipse.ui.textEditorScope"); //$NON-NLS-1$ - } - } - - private void createCompareControl() { - if (fPageBook.isDisposed()) - return; - IEditorInput input= getEditorInput(); - if (input instanceof CompareEditorInput) { - CompareEditorInput ci = (CompareEditorInput) input; - if (ci.getCompareResult() == null) { - if (getState() == INITIALIZING) { - getSite().setSelectionProvider(new CompareEditorSelectionProvider()); - setPageLater(); - } else if (getState() == STILL_INITIALIZING) { - if (initializingPage == null) { - initializingPage = getInitializingMessagePane(fPageBook); - } - fPageBook.showPage(initializingPage); - } else if (getState() == CANCELED) { - // Close the editor when we are canceled - closeEditor(); - } else if (getState() == NO_DIFF) { - // Prompt and close the editor as well - setState(DONE); - closeEditor(); - CompareUIPlugin.getDefault().handleNoDifference(); - } else if (getState() == ERROR) { - // If an error occurred, close the editor - // (the message would be displayed by the progress view) - closeEditor(); - } - } else if (fControl == null && getState() != CREATING_CONTROL) { - if (getState() == CANCELED) { - // Close the editor when we are canceled, even when compare - // result has been already prepared - closeEditor(); - return; - } - // Set the state in case this method gets called again - setState(CREATING_CONTROL); - if (getSite().getSelectionProvider() == null) - getSite().setSelectionProvider(new CompareEditorSelectionProvider()); - try { - fControl = ci.createContents(fPageBook); - } catch (SWTException e) { - // closed while creating - if (e.code == SWT.ERROR_WIDGET_DISPOSED) { - setState(CANCELED); - return; - } - } - fPageBook.showPage(fControl); - PlatformUI.getWorkbench().getHelpSystem().setHelp(fControl, ICompareContextIds.COMPARE_EDITOR); - if (isActive()) { - setFocus(); - } - setState(INITIALIZED); - } - } - } - - private boolean isActive() { - return getSite().getPage().getActivePart() == this; - } - - private void setPageLater() { - Display.getCurrent().timerExec(1000, new Runnable() { - public void run() { - synchronized(CompareEditor.this) { - if (getState() == INITIALIZING) { - setState(STILL_INITIALIZING); - createCompareControl(); - } - } - } - }); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#dispose() - */ - public void dispose() { - IEditorInput input= getEditorInput(); - if (input instanceof IPropertyChangeNotifier) - ((IPropertyChangeNotifier)input).removePropertyChangeListener(this); - super.dispose(); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#setFocus() - */ - public void setFocus() { - IEditorInput input= getEditorInput(); - if (input instanceof CompareEditorInput) - if (!((CompareEditorInput)input).setFocus2()) - fPageBook.setFocus(); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed() - */ - public boolean isSaveAsAllowed() { - return false; - } - - /* (non-Javadoc) - * Always throws an AssertionFailedException. - * @see org.eclipse.ui.part.EditorPart#doSaveAs() - */ - public void doSaveAs() { - Assert.isTrue(false); // Save As not supported for CompareEditor - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) - */ - public void doSave(IProgressMonitor progressMonitor) { - - final IEditorInput input= getEditorInput(); - - WorkspaceModifyOperation operation= new WorkspaceModifyOperation() { - public void execute(IProgressMonitor pm) throws CoreException { - if (input instanceof CompareEditorInput) - ((CompareEditorInput)input).saveChanges(pm); - } - }; - - Shell shell= getSite().getShell(); - - try { - - operation.run(progressMonitor); - - firePropertyChange(PROP_DIRTY); - - } catch (InterruptedException x) { - // NeedWork - } catch (OperationCanceledException x) { - // NeedWork - } catch (InvocationTargetException x) { - String title= Utilities.getString("CompareEditor.saveError.title"); //$NON-NLS-1$ - String reason= x.getTargetException().getMessage(); - MessageDialog.openError(shell, title, Utilities.getFormattedString("CompareEditor.cantSaveError", reason)); //$NON-NLS-1$ - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.EditorPart#isDirty() - */ - public boolean isDirty() { - IEditorInput input= getEditorInput(); - if (input instanceof CompareEditorInput) - return ((CompareEditorInput)input).isDirty(); - return false; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) - */ - public void propertyChange(PropertyChangeEvent event) { - if (event.getProperty().equals(CompareEditorInput.DIRTY_STATE)) { - Object old_value= event.getOldValue(); - Object new_value= event.getNewValue(); - if (old_value == null || new_value == null || !old_value.equals(new_value)) - firePropertyChange(PROP_DIRTY); - } else if (event.getProperty().equals(CompareEditorInput.PROP_TITLE)) { - setPartName(((CompareEditorInput)getEditorInput()).getTitle()); - setTitleToolTip(((CompareEditorInput)getEditorInput()).getToolTipText()); - } else if (event.getProperty().equals(CompareEditorInput.PROP_TITLE_IMAGE)) { - setTitleImage(((CompareEditorInput)getEditorInput()).getTitleImage()); - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.ISaveablesSource#getModels() - */ - public Saveable[] getSaveables() { - return internalGetSaveables(knownSaveables == null); - } - - private Saveable[] internalGetSaveables(boolean init) { - IEditorInput input= getEditorInput(); - Saveable[] sourceSaveables = getSaveables(input); - if (init || knownSaveables == null) { - recordSaveables(sourceSaveables); - } else { - for (int i = 0; i < sourceSaveables.length; i++) { - Saveable saveable = sourceSaveables[i]; - if (!knownSaveables.contains(saveable)) { - CompareUIPlugin.logErrorMessage(NLS.bind("Saveable {0} was not added using a saveables lifecycle event.", saveable.getName())); //$NON-NLS-1$ - knownSaveables.add(saveable); - } - } - if (sourceSaveables.length != knownSaveables.size()) { - CompareUIPlugin.logErrorMessage("Saveables were removed without an appropriate event"); //$NON-NLS-1$ - knownSaveables.clear(); - recordSaveables(sourceSaveables); - } - } - return sourceSaveables; - } - - private boolean isAllSaveablesKnown() { - IEditorInput input= getEditorInput(); - Saveable[] sourceSaveables = getSaveables(input); - if (knownSaveables == null) { - return sourceSaveables.length == 0; - } - if (sourceSaveables.length != knownSaveables.size()) { - return false; - } - for (int i = 0; i < sourceSaveables.length; i++) { - Saveable saveable = sourceSaveables[i]; - if (!knownSaveables.contains(saveable)) { - return false; - } - } - return true; - } - - private void recordSaveables(Saveable[] sourceSaveables) { - if (knownSaveables == null) - knownSaveables = new HashSet(); - for (int i = 0; i < sourceSaveables.length; i++) { - Saveable saveable = sourceSaveables[i]; - knownSaveables.add(saveable); - } - } - - private Saveable[] getSaveables(IEditorInput input) { - if (input instanceof ISaveablesSource) { - ISaveablesSource source= (ISaveablesSource) input; - return source.getSaveables(); - } - return new Saveable[] { getSaveable() }; - } - - private Saveable getSaveable() { - if (fSaveable == null) { - fSaveable= new CompareSaveable(); - } - return fSaveable; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.ISaveablesSource#getActiveModels() - */ - public Saveable[] getActiveSaveables() { - IEditorInput input= getEditorInput(); - if (input instanceof ISaveablesSource) { - ISaveablesSource source= (ISaveablesSource) input; - return source.getActiveSaveables(); - } - return new Saveable[] { getSaveable() }; - } - - private class CompareSaveable extends Saveable { - - public String getName() { - return CompareEditor.this.getPartName(); - } - - public String getToolTipText() { - return CompareEditor.this.getTitleToolTip(); - } - - public ImageDescriptor getImageDescriptor() { - return ImageDescriptor.createFromImage(CompareEditor.this.getTitleImage()); - } - - public void doSave(IProgressMonitor monitor) throws CoreException { - CompareEditor.this.doSave(monitor); - } - - public boolean isDirty() { - return CompareEditor.this.isDirty(); - } - - public boolean equals(Object object) { - return object == this; - } - - public int hashCode() { - return CompareEditor.this.hashCode(); - } - } - - private Composite getInitializingMessagePane(Composite parent) { - Composite composite = new Composite(parent, SWT.NONE); - composite.setBackground(getBackgroundColor(parent)); - GridLayout layout = new GridLayout(); - layout.numColumns = 3; - composite.setLayout(layout); - - createDescriptionLabel(composite, CompareMessages.CompareEditor_1); - return composite; - } - - private Color getBackgroundColor(Composite parent) { - return parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND); - } - - private Label createDescriptionLabel(Composite parent, String text) { - Label description = new Label(parent, SWT.WRAP); - GridData data = new GridData(GridData.FILL_HORIZONTAL); - data.horizontalSpan = 2; - description.setLayoutData(data); - description.setText(text); - description.setBackground(getBackgroundColor(parent)); - return description; - } - - private void closeEditor() { - getSite().getPage().closeEditor(CompareEditor.this, false); - } - - private synchronized void setState(int state) { - this.state = state; - } - - private int getState() { - return state; - } - - public void handleLifecycleEvent(SaveablesLifecycleEvent event) { - ISaveablesLifecycleListener lifecycleListener= (ISaveablesLifecycleListener) getSite().getService(ISaveablesLifecycleListener.class); - if (event.getEventType() == SaveablesLifecycleEvent.POST_CLOSE) { - // We may get a post close for a saveable that is not known to the workbench. - // Only pass on the event for known saveables - if (knownSaveables == null || knownSaveables.isEmpty()) - return; - java.util.List result = new ArrayList(); - Saveable[] all = event.getSaveables(); - for (int i = 0; i < all.length; i++) { - Saveable saveable = all[i]; - if (knownSaveables.contains(saveable)) - result.add(saveable); - knownSaveables.remove(saveable); - } - if (result.isEmpty()) - return; - event = new SaveablesLifecycleEvent(this, - SaveablesLifecycleEvent.POST_CLOSE, - (Saveable[]) result.toArray(new Saveable[result.size()]), - false); - } else if (event.getEventType() == SaveablesLifecycleEvent.POST_OPEN) { - recordSaveables(event.getSaveables()); - } - lifecycleListener.handleLifecycleEvent(event); - } - -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorContributor.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorContributor.java deleted file mode 100644 index fc427fe23..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorContributor.java +++ /dev/null @@ -1,123 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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.util.ResourceBundle; - -import org.eclipse.jface.action.*; - -import org.eclipse.ui.*; -import org.eclipse.ui.actions.ActionFactory; -import org.eclipse.ui.help.IWorkbenchHelpSystem; -import org.eclipse.ui.part.EditorActionBarContributor; -import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds; - -import org.eclipse.compare.*; - - -public class CompareEditorContributor extends EditorActionBarContributor { - - private IEditorPart fActiveEditorPart= null; - - private ChangePropertyAction fIgnoreWhitespace; - private NavigationAction fNext; - private NavigationAction fPrevious; - - private NavigationAction fToolbarNext; - private NavigationAction fToolbarPrevious; - - public CompareEditorContributor() { - ResourceBundle bundle= CompareUI.getResourceBundle(); - - IWorkbenchHelpSystem helpSystem= PlatformUI.getWorkbench().getHelpSystem(); - - fIgnoreWhitespace= ChangePropertyAction.createIgnoreWhiteSpaceAction(bundle, null); - helpSystem.setHelp(fIgnoreWhitespace, ICompareContextIds.IGNORE_WHITESPACE_ACTION); - - fNext= new NavigationAction(bundle, true); - helpSystem.setHelp(fNext, ICompareContextIds.GLOBAL_NEXT_DIFF_ACTION); - - fPrevious= new NavigationAction(bundle, false); - helpSystem.setHelp(fPrevious, ICompareContextIds.GLOBAL_PREVIOUS_DIFF_ACTION); - - fToolbarNext= new NavigationAction(bundle, true); - helpSystem.setHelp(fToolbarNext, ICompareContextIds.NEXT_DIFF_ACTION); - - fToolbarPrevious= new NavigationAction(bundle, false); - helpSystem.setHelp(fToolbarPrevious, ICompareContextIds.PREVIOUS_DIFF_ACTION); - } - - /* - * @see EditorActionBarContributor#contributeToToolBar(IToolBarManager) - */ - public void contributeToToolBar(IToolBarManager tbm) { - tbm.add(new Separator()); - tbm.add(fIgnoreWhitespace); - tbm.add(fToolbarNext); - tbm.add(fToolbarPrevious); - } - - /* - * @see EditorActionBarContributor#contributeToMenu(IMenuManager) - */ - public void contributeToMenu(IMenuManager menuManager) { - // empty implementation - } - - public void setActiveEditor(IEditorPart targetEditor) { - - if (fActiveEditorPart == targetEditor) - return; - - fActiveEditorPart= targetEditor; - - if (fActiveEditorPart != null) { - IEditorInput input= fActiveEditorPart.getEditorInput(); - if (input instanceof CompareEditorInput) { - CompareEditorInput compareInput= (CompareEditorInput) input; - fNext.setCompareEditorInput(compareInput); - fPrevious.setCompareEditorInput(compareInput); - // Begin fix http://bugs.eclipse.org/bugs/show_bug.cgi?id=20105 - fToolbarNext.setCompareEditorInput(compareInput); - fToolbarPrevious.setCompareEditorInput(compareInput); - // End fix http://bugs.eclipse.org/bugs/show_bug.cgi?id=20105 - } - } - - if (targetEditor instanceof CompareEditor) { - IActionBars actionBars= getActionBars(); - - CompareEditor editor= (CompareEditor) targetEditor; - editor.setActionBars(actionBars); - - actionBars.setGlobalActionHandler(ActionFactory.NEXT.getId(), fNext); - actionBars.setGlobalActionHandler(ActionFactory.PREVIOUS.getId(), fPrevious); - - actionBars.setGlobalActionHandler(ITextEditorActionDefinitionIds.GOTO_NEXT_ANNOTATION, fNext); - actionBars.setGlobalActionHandler(ITextEditorActionDefinitionIds.GOTO_PREVIOUS_ANNOTATION, fPrevious); - - CompareConfiguration cc= editor.getCompareConfiguration(); - fIgnoreWhitespace.setCompareConfiguration(cc); - } else { - IActionBars actionBars= getActionBars(); - actionBars.setGlobalActionHandler(ActionFactory.NEXT.getId(), null); - actionBars.setGlobalActionHandler(ActionFactory.PREVIOUS.getId(), null); - actionBars.setGlobalActionHandler(ITextEditorActionDefinitionIds.GOTO_NEXT_ANNOTATION, null); - actionBars.setGlobalActionHandler(ITextEditorActionDefinitionIds.GOTO_PREVIOUS_ANNOTATION, null); - } - } - - public void dispose() { - setActiveEditor(null); - super.dispose(); - fIgnoreWhitespace.dispose(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorInputNavigator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorInputNavigator.java deleted file mode 100644 index 9fc2ccf8b..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorInputNavigator.java +++ /dev/null @@ -1,104 +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.internal; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.compare.*; - -/** - * Supports cross-pane navigation through the differences contained in a {@link CompareEditorInput} - * or a similar type of compare container. - * @see INavigatable - */ -public class CompareEditorInputNavigator extends CompareNavigator { - - // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - private boolean fNextFirstTime= true; - private Object[] fPanes; - - /** - * Create a navigator for navigating the given panes - * @param panes the panes to navigate. - */ - public CompareEditorInputNavigator(Object[] panes) { - fPanes= panes; - } - - /** - * Return the set of panes that this navigator is navigating. - * The {@link INavigatable} is obtain from each pane using the - * adaptable mechanism. - * @return the set of panes that this navigator is navigating - */ - public Object[] getPanes() { - return fPanes; - } - - protected INavigatable[] getNavigatables() { - List result = new ArrayList(); - Object[] panes = getPanes(); - for (int i = 0; i < panes.length; i++) { - Object pane = panes[i]; - INavigatable navigator= getNavigator(pane); - if (navigator != null) - result.add(navigator); - } - return (INavigatable[]) result.toArray(new INavigatable[result.size()]); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ICompareNavigator#selectChange(boolean) - */ - public boolean selectChange(boolean next) { - // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - if (next && fNextFirstTime && mustOpen()) { - fNextFirstTime= false; - if (openElement()) - return false; - } - return super.selectChange(next); - } - - /* - * Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - */ - private boolean mustOpen() { - Object[] panes = getPanes(); - if (panes == null || panes.length == 0) - return false; - for (int i= 1; i < panes.length; i++) { - Object pane= panes[i]; - INavigatable nav = getNavigator(pane); - if (nav != null && nav.getInput() != null) - return false; - } - return true; - } - - /* - * Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - */ - private boolean openElement() { - Object[] panes = getPanes(); - if (panes == null || panes.length == 0) - return false; - INavigatable nav = getNavigator(panes[0]); - if (nav != null) { - if (!nav.openSelectedChange()) - // selected change not opened, open first instead - nav.selectChange(INavigatable.FIRST_CHANGE); - return true; - } - return false; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorSelectionProvider.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorSelectionProvider.java deleted file mode 100644 index 771688bcd..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorSelectionProvider.java +++ /dev/null @@ -1,245 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 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 org.eclipse.swt.custom.StyledText; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.FocusListener; -import org.eclipse.swt.widgets.Widget; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.ListenerList; - -import org.eclipse.jface.viewers.IPostSelectionProvider; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; - -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.ITextSelection; -import org.eclipse.jface.text.TextSelection; -import org.eclipse.jface.text.TextViewer; - - -/** - * A selection provider for view parts with more that one viewer. Tracks the - * focus of the viewers to provide the correct selection. - * - * This is a modified version of - * org.eclipse.jdt.internal.ui.viewsupport.SelectionProviderMediator - */ -public class CompareEditorSelectionProvider implements IPostSelectionProvider { - - private class InternalListener implements ISelectionChangedListener, FocusListener { - /* - * @see ISelectionChangedListener#selectionChanged - */ - public void selectionChanged(SelectionChangedEvent event) { - doSelectionChanged(event); - } - - /* - * @see FocusListener#focusGained - */ - public void focusGained(FocusEvent e) { - // expecting a StyledText widget here - doFocusChanged(e.widget); - } - - /* - * @see FocusListener#focusLost - */ - public void focusLost(FocusEvent e) { - // do not reset due to focus behavior on GTK - //fViewerInFocus= null; - } - } - - private class InternalPostSelectionListener implements ISelectionChangedListener { - public void selectionChanged(SelectionChangedEvent event) { - doPostSelectionChanged(event); - } - - } - - private TextViewer[] fViewers; - - private TextViewer fViewerInFocus; - private ListenerList fSelectionChangedListeners; - private ListenerList fPostSelectionChangedListeners; - - public CompareEditorSelectionProvider() { - fSelectionChangedListeners = new ListenerList(); - fPostSelectionChangedListeners = new ListenerList(); - // nothing more to do here, Compare Editor is initializing - } - - /** - * @param viewers All viewers that can provide a selection - * @param viewerInFocus the viewer currently in focus or <code>null</code> - */ - public void setViewers(TextViewer[] viewers, TextViewer viewerInFocus) { - Assert.isNotNull(viewers); - fViewers= viewers; - InternalListener listener= new InternalListener(); - fViewerInFocus= viewerInFocus; - - for (int i= 0; i < fViewers.length; i++) { - TextViewer viewer= fViewers[i]; - viewer.addSelectionChangedListener(listener); - viewer.addPostSelectionChangedListener(new InternalPostSelectionListener()); - StyledText textWidget = viewer.getTextWidget(); - textWidget.addFocusListener(listener); - } - } - - private void doFocusChanged(Widget control) { - for (int i= 0; i < fViewers.length; i++) { - if (fViewers[i].getTextWidget() == control) { - propagateFocusChanged(fViewers[i]); - return; - } - } - } - - final void doPostSelectionChanged(SelectionChangedEvent event) { - ISelectionProvider provider= event.getSelectionProvider(); - if (provider == fViewerInFocus) { - firePostSelectionChanged(); - } - } - - final void doSelectionChanged(SelectionChangedEvent event) { - ISelectionProvider provider= event.getSelectionProvider(); - if (provider == fViewerInFocus) { - fireSelectionChanged(); - } - } - - final void propagateFocusChanged(TextViewer viewer) { - if (viewer != fViewerInFocus) { // OK to compare by identity - fViewerInFocus= viewer; - fireSelectionChanged(); - firePostSelectionChanged(); - } - } - - private void fireSelectionChanged() { - if (fSelectionChangedListeners != null) { - SelectionChangedEvent event= new SelectionChangedEvent(this, getSelection()); - - Object[] listeners= fSelectionChangedListeners.getListeners(); - for (int i= 0; i < listeners.length; i++) { - ISelectionChangedListener listener= (ISelectionChangedListener) listeners[i]; - listener.selectionChanged(event); - } - } - } - - private void firePostSelectionChanged() { - if (fPostSelectionChangedListeners != null) { - SelectionChangedEvent event= new SelectionChangedEvent(this, getSelection()); - - Object[] listeners= fPostSelectionChangedListeners.getListeners(); - for (int i= 0; i < listeners.length; i++) { - ISelectionChangedListener listener= (ISelectionChangedListener) listeners[i]; - listener.selectionChanged(event); - } - } - } - - /* - * @see ISelectionProvider#addSelectionChangedListener - */ - public void addSelectionChangedListener(ISelectionChangedListener listener) { - fSelectionChangedListeners.add(listener); - } - - /* - * @see ISelectionProvider#removeSelectionChangedListener - */ - public void removeSelectionChangedListener(ISelectionChangedListener listener) { - fSelectionChangedListeners.remove(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.IPostSelectionProvider#addPostSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) - */ - public void addPostSelectionChangedListener(ISelectionChangedListener listener) { - fPostSelectionChangedListeners.add(listener); - } - - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.IPostSelectionProvider#removePostSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) - */ - public void removePostSelectionChangedListener(ISelectionChangedListener listener) { - fPostSelectionChangedListeners.remove(listener); - } - - /* - * @see ISelectionProvider#getSelection - */ - public ISelection getSelection() { - if (fViewerInFocus != null) { - return fViewerInFocus.getSelection(); - } - return TextSelection.emptySelection(); - } - - /* - * @see ISelectionProvider#setSelection - */ - public void setSelection(ISelection selection) { - setSelection(selection, true); - } - - public void setSelection(ISelection selection, boolean reveal) { - if (fViewerInFocus != null) { - if (reveal && !isSelectionInsideVisibleRegion(fViewerInFocus, selection)) - resetVisibleRegion(); - fViewerInFocus.setSelection(selection, reveal); - } - } - - /** - * Resets the visible region for all text viewers of this selection provider. - * - * @since 3.6 - */ - private void resetVisibleRegion() { - if (fViewers == null) - return; - - for (int i= 0; i < fViewers.length; i++) - fViewers[i].setVisibleRegion(0, fViewers[i].getDocument().getLength()); - } - - /** - * Tells whether the given selection is inside the text viewer's visible region. - * - * @param textViewer the text viewer - * @param selection the selection - * @return <code>true</code> if the selection is inside the text viewer's visible region - * @since 3.6 - */ - private static boolean isSelectionInsideVisibleRegion(TextViewer textViewer, ISelection selection) { - if (!(selection instanceof ITextSelection)) - return false; - - ITextSelection textSelection= (ITextSelection)selection; - IRegion visibleRegion= textViewer.getVisibleRegion(); - - return textSelection.getOffset() >= visibleRegion.getOffset() && textSelection.getOffset() + textSelection.getLength() <= visibleRegion.getOffset() + visibleRegion.getLength(); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java deleted file mode 100644 index 3a17994be..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java +++ /dev/null @@ -1,397 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 com.ibm.icu.text.MessageFormat; -import java.util.StringTokenizer; - -import org.eclipse.core.resources.*; -import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.runtime.IStatus; - - -public class CompareFilter { - private static final char[][] NO_CHAR_CHAR= new char[0][]; - - private char[][] fExtraResourceFileFilters; - private String[] fExtraResourceFolderFilters; - - - public CompareFilter() { - // nothing to do - } - - /* - * Returns true if path matches filter, that is if path should be filtered. - */ - public boolean filter(String path0, boolean folder, boolean isArchive) { - if (!folder && fExtraResourceFileFilters != null) { - char[] name= path0.toCharArray(); - for (int i= 0, l= fExtraResourceFileFilters.length; i < l; i++) - if (match(fExtraResourceFileFilters[i], name, true)) - return true; - } - if (folder && fExtraResourceFolderFilters != null) { - for (int i= 0, l= fExtraResourceFolderFilters.length; i < l; i++) - if (fExtraResourceFolderFilters[i].equals(path0)) - return true; - } - return false; - } - - public static String validateResourceFilters(String text) { - IWorkspace workspace= ResourcesPlugin.getWorkspace(); - String[] filters= getTokens(text, ","); //$NON-NLS-1$ - for (int i= 0; i < filters.length; i++) { - String fileName= filters[i].replace('*', 'x'); - int resourceType= IResource.FILE; - int lastCharacter= fileName.length() - 1; - if (lastCharacter >= 0 && fileName.charAt(lastCharacter) == '/') { - fileName= fileName.substring(0, lastCharacter); - resourceType= IResource.FOLDER; - } - IStatus status= workspace.validateName(fileName, resourceType); - if (status.matches(IStatus.ERROR)) { - String format= Utilities.getString("ComparePreferencePage.filter.invalidsegment.error"); //$NON-NLS-1$ - return MessageFormat.format(format, new String[] { status.getMessage() } ); - } - } - return null; - } - - public void setFilters(String filterSequence) { - char[][] filters= filterSequence != null && filterSequence.length() > 0 - ? splitAndTrimOn(',', filterSequence.toCharArray()) - : null; - if (filters == null) { - fExtraResourceFileFilters= null; - fExtraResourceFolderFilters= null; - } else { - int fileCount= 0, folderCount= 0; - for (int i= 0, l= filters.length; i < l; i++) { - char[] f= filters[i]; - if (f.length == 0) - continue; - if (f[f.length - 1] == '/') - folderCount++; - else - fileCount++; - } - fExtraResourceFileFilters= new char[fileCount][]; - fExtraResourceFolderFilters= new String[folderCount]; - for (int i= 0, l= filters.length; i < l; i++) { - char[] f= filters[i]; - if (f.length == 0) - continue; - if (f[f.length - 1] == '/') - fExtraResourceFolderFilters[--folderCount]= new String(subarray(f, 0, f.length - 1)); - else - fExtraResourceFileFilters[--fileCount]= f; - } - } - } - - ///////// - - private static String[] getTokens(String text, String separator) { - StringTokenizer tok= new StringTokenizer(text, separator); - int nTokens= tok.countTokens(); - String[] res= new String[nTokens]; - for (int i= 0; i < res.length; i++) - res[i]= tok.nextToken().trim(); - return res; - } - - /** - * Answers true if the pattern matches the given name, false otherwise. - * This char[] pattern matching accepts wild-cards '*' and '?'. - * - * When not case sensitive, the pattern is assumed to already be - * lowercased, the name will be lowercased character per character as - * comparing. If name is null, the answer is false. If pattern is null, the - * answer is true if name is not null. <br><br>For example: - * <ol> - * <li> - * - * <pre> - * pattern = { '?', 'b', '*' } name = { 'a', 'b', 'c' , 'd' } isCaseSensitive = true result => true - * </pre> - * - * - * </li> - * <li> - * - * <pre> - * pattern = { '?', 'b', '?' } name = { 'a', 'b', 'c' , 'd' } isCaseSensitive = true result => false - * </pre> - * - * - * </li> - * <li> - * - * <pre> - * pattern = { 'b', '*' } name = { 'a', 'b', 'c' , 'd' } isCaseSensitive = true result => false - * </pre> - * - * - * </li> - * </ol> - * - * @param pattern - * the given pattern - * @param name - * the given name - * @param isCaseSensitive - * flag to know whether or not the matching should be case - * sensitive - * @return true if the pattern matches the given name, false otherwise - */ - private boolean match(char[] pattern, char[] name, boolean isCaseSensitive) { - if (name == null) - return false; // null name cannot match - if (pattern == null) - return true; // null pattern is equivalent to '*' - return match(pattern, 0, pattern.length, name, 0, name.length, isCaseSensitive); - } - - /** - * Answers true if the a sub-pattern matches the subpart of the given name, - * false otherwise. char[] pattern matching, accepting wild-cards '*' and - * '?'. Can match only subset of name/pattern. end positions are - * non-inclusive. The subpattern is defined by the patternStart and - * pattternEnd positions. When not case sensitive, the pattern is assumed - * to already be lowercased, the name will be lowercased character per - * character as comparing. <br><br>For example: - * <ol> - * <li> - * - * <pre> - * pattern = { '?', 'b', '*' } patternStart = 1 patternEnd = 3 name = { 'a', 'b', 'c' , 'd' } nameStart = 1 nameEnd = 4 isCaseSensitive = true result => true - * </pre> - * - * - * </li> - * <li> - * - * <pre> - * pattern = { '?', 'b', '*' } patternStart = 1 patternEnd = 2 name = { 'a', 'b', 'c' , 'd' } nameStart = 1 nameEnd = 2 isCaseSensitive = true result => false - * </pre> - * - * - * </li> - * </ol> - * - * @param pattern - * the given pattern - * @param patternStart - * the given pattern start - * @param patternEnd - * the given pattern end - * @param name - * the given name - * @param nameStart - * the given name start - * @param nameEnd - * the given name end - * @param isCaseSensitive - * flag to know if the matching should be case sensitive - * @return true if the a sub-pattern matches the subpart of the given name, - * false otherwise - */ - private boolean match(char[] pattern, int patternStart, int patternEnd, char[] name, int nameStart, int nameEnd, - boolean isCaseSensitive) { - if (name == null) - return false; // null name cannot match - if (pattern == null) - return true; // null pattern is equivalent to '*' - int iPattern= patternStart; - int iName= nameStart; - if (patternEnd < 0) - patternEnd= pattern.length; - if (nameEnd < 0) - nameEnd= name.length; - /* check first segment */ - char patternChar= 0; - while ((iPattern < patternEnd) && (patternChar= pattern[iPattern]) != '*') { - if (iName == nameEnd) - return false; - if (patternChar != (isCaseSensitive ? name[iName] : Character.toLowerCase(name[iName])) && patternChar != '?') { - return false; - } - iName++; - iPattern++; - } - /* check sequence of star+segment */ - int segmentStart; - if (patternChar == '*') { - segmentStart= ++iPattern; // skip star - } else { - segmentStart= 0; // force iName check - } - int prefixStart= iName; - checkSegment : while (iName < nameEnd) { - if (iPattern == patternEnd) { - iPattern= segmentStart; // mismatch - restart current segment - iName= ++prefixStart; - continue checkSegment; - } - /* segment is ending */ - if ((patternChar= pattern[iPattern]) == '*') { - segmentStart= ++iPattern; // skip start - if (segmentStart == patternEnd) { - return true; - } - prefixStart= iName; - continue checkSegment; - } - /* check current name character */ - if ((isCaseSensitive ? name[iName] : Character.toLowerCase(name[iName])) != patternChar && patternChar != '?') { - iPattern= segmentStart; // mismatch - restart current segment - iName= ++prefixStart; - continue checkSegment; - } - iName++; - iPattern++; - } - return (segmentStart == patternEnd) || (iName == nameEnd && iPattern == patternEnd) - || (iPattern == patternEnd - 1 && pattern[iPattern] == '*'); - } - - /** - * Return a new array which is the split of the given array using the given - * divider and triming each subarray to remove whitespaces equals to ' '. - * <br><br>For example: - * <ol> - * <li> - * - * <pre> - * divider = 'b' array = { 'a' , 'b', 'b', 'a', 'b', 'a' } result => { { 'a' }, { }, { 'a' }, { 'a' } } - * </pre> - * - * - * </li> - * <li> - * - * <pre> - * divider = 'c' array = { 'a' , 'b', 'b', 'a', 'b', 'a' } result => { { 'a', 'b', 'b', 'a', 'b', 'a' } } - * </pre> - * - * - * </li> - * <li> - * - * <pre> - * divider = 'b' array = { 'a' , ' ', 'b', 'b', 'a', 'b', 'a' } result => { { 'a' }, { }, { 'a' }, { 'a' } } - * </pre> - * - * - * </li> - * <li> - * - * <pre> - * divider = 'c' array = { ' ', ' ', 'a' , 'b', 'b', 'a', 'b', 'a', ' ' } result => { { 'a', 'b', 'b', 'a', 'b', 'a' } } - * </pre> - * - * - * </li> - * </ol> - * - * @param divider - * the given divider - * @param array - * the given array - * @return a new array which is the split of the given array using the - * given divider and triming each subarray to remove whitespaces - * equals to ' ' - */ - private char[][] splitAndTrimOn(char divider, char[] array) { - int length= array == null ? 0 : array.length; - if (length == 0) - return NO_CHAR_CHAR; - int wordCount= 1; - for (int i= 0; i < length; i++) - if (array[i] == divider) - wordCount++; - char[][] split= new char[wordCount][]; - int last= 0, currentWord= 0; - for (int i= 0; i < length; i++) { - if (array[i] == divider) { - int start= last, end= i - 1; - while (start < i && array[start] == ' ') - start++; - while (end > start && array[end] == ' ') - end--; - split[currentWord]= new char[end - start + 1]; - System.arraycopy(array, start, split[currentWord++], 0, end - start + 1); - last= i + 1; - } - } - int start= last, end= length - 1; - while (start < length && array[start] == ' ') - start++; - while (end > start && array[end] == ' ') - end--; - split[currentWord]= new char[end - start + 1]; - System.arraycopy(array, start, split[currentWord++], 0, end - start + 1); - return split; - } - - /** - * Answers a new array which is a copy of the given array starting at the - * given start and ending at the given end. The given start is inclusive - * and the given end is exclusive. Answers null if start is greater than - * end, if start is lower than 0 or if end is greater than the length of - * the given array. If end equals -1, it is converted to the array length. - * <br><br>For example: - * <ol> - * <li> - * - * <pre> - * array = { 'a' , 'b' } start = 0 end = 1 result => { 'a' } - * </pre> - * - * - * </li> - * <li> - * - * <pre> - * array = { 'a', 'b' } start = 0 end = -1 result => { 'a' , 'b' } - * </pre> - * - * - * </li> - * </ol> - * - * @param array - * the given array - * @param start - * the given starting index - * @param end - * the given ending index - * @return a new array which is a copy of the given array starting at the - * given start and ending at the given end - * @exception NullPointerException - * if the given array is null - */ - private char[] subarray(char[] array, int start, int end) { - if (end == -1) - end= array.length; - if (start > end) - return null; - if (start < 0) - return null; - if (end > array.length) - return null; - char[] result= new char[end - start]; - System.arraycopy(array, start, result, 0, end - start); - return result; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareHandlerService.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareHandlerService.java deleted file mode 100644 index 809e79d21..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareHandlerService.java +++ /dev/null @@ -1,153 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 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.util.ArrayList; -import java.util.List; - -import org.eclipse.compare.ICompareContainer; -import org.eclipse.core.expressions.Expression; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.commands.ActionHandler; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.*; -import org.eclipse.ui.handlers.IHandlerActivation; -import org.eclipse.ui.handlers.IHandlerService; -import org.eclipse.ui.services.IServiceLocator; - -public class CompareHandlerService { - - private final List fActivations = new ArrayList(); - private final Expression fExpression; - private ICompareContainer fContainer; - private boolean fDisposed; - private List fPaneActivations = new ArrayList(); - private IHandlerService fHandlerService; - - public static CompareHandlerService createFor(ICompareContainer container, Shell shell) { - IServiceLocator serviceLocator = container.getServiceLocator(); - if (serviceLocator != null) { - IHandlerService service = (IHandlerService)serviceLocator.getService(IHandlerService.class); - if (service != null) - return new CompareHandlerService(container, null); - } - if (container.getWorkbenchPart() == null && shell != null) { - // We're in a dialog so we can use an active shell expression - IHandlerService service = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class); - if (service != null) { - Expression e = new ActiveShellExpression(shell); - return new CompareHandlerService(container, e); - } - } - return new CompareHandlerService(null, null); - } - - private CompareHandlerService(ICompareContainer container, - Expression expression) { - fContainer = container; - fExpression = expression; - initialize(); - } - - public void registerAction(IAction action, String commandId) { - IHandlerService handlerService = getHandlerService(); - if (handlerService == null) - return; - action.setActionDefinitionId(commandId); - IHandlerActivation activation; - if (fExpression == null) { - activation = handlerService.activateHandler(commandId, new ActionHandler(action)); - } else { - activation = handlerService.activateHandler(commandId, new ActionHandler(action), fExpression); - } - if (activation != null) { - fActivations .add(activation); - } - } - - private IHandlerService getHandlerService() { - if (fDisposed) - return null; - return fHandlerService; - } - - private void initialize() { - if (fHandlerService == null) { - IServiceLocator serviceLocator = fContainer.getServiceLocator(); - if (serviceLocator != null) { - IHandlerService service = (IHandlerService)serviceLocator.getService(IHandlerService.class); - if (service != null) - fHandlerService = service; - } - if (fHandlerService == null && fContainer.getWorkbenchPart() == null && fExpression != null) { - // We're in a dialog so we can use an active shell expression - IHandlerService service = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class); - if (service != null) { - fHandlerService = service; - } - } - } - } - - public void setGlobalActionHandler(String actionId, IAction actionHandler) { - IActionBars bars = getActionBars(); - if (bars != null) { - bars.setGlobalActionHandler(actionId, actionHandler); - return; - } else if (fExpression != null && actionHandler != null && actionHandler.getActionDefinitionId() != null) { - IHandlerService service = getHandlerService(); - if (service != null) { - IHandlerActivation activation = service.activateHandler(actionHandler.getActionDefinitionId(), new ActionHandler(actionHandler), fExpression); - fPaneActivations.add(activation); - return; - } - } - // Remove the action definition id since we won't get key bindings - if (actionHandler != null) - actionHandler.setActionDefinitionId(null); - } - - private void updateActionBars() { - IActionBars bars = getActionBars(); - if (bars != null) - bars.updateActionBars(); - } - - private void clearPaneActionHandlers() { - if (!fPaneActivations.isEmpty()) { - IHandlerService service = getHandlerService(); - if (service != null) { - service.deactivateHandlers(fPaneActivations); - fPaneActivations.clear(); - } - } - } - - private IActionBars getActionBars() { - return fContainer.getActionBars(); - } - - public void dispose() { - clearPaneActionHandlers(); - IHandlerService service = getHandlerService(); - if (service == null) - return; - service.deactivateHandlers(fActivations); - fActivations.clear(); - fDisposed = true; - } - - public void updatePaneActionHandlers(Runnable runnable) { - clearPaneActionHandlers(); - runnable.run(); - updateActionBars(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.java deleted file mode 100644 index 6be02f6ff..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.java +++ /dev/null @@ -1,135 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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 - * Matt McCutchen (hashproduct+eclipse@gmail.com) - Bug 35390 Three-way compare cannot select (mis-selects) )ancestor resource - * Aleksandra Wozniak (aleksandra.k.wozniak@gmail.com) - Bug 239959, Bug 73923 - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.osgi.util.NLS; - -public final class CompareMessages extends NLS { - - private static final String BUNDLE_NAME = "org.eclipse.compare.internal.CompareMessages";//$NON-NLS-1$ - - private CompareMessages() { - // Do not instantiate - } - - public static String CompareContainer_0; - public static String CompareDialog_commit_button; - public static String CompareDialog_error_message; - public static String CompareDialog_error_title; - public static String CompareEditor_0; - public static String CompareEditor_1; - public static String CompareEditor_2; - public static String DocumentMerger_0; - public static String DocumentMerger_1; - public static String DocumentMerger_2; - public static String DocumentMerger_3; - public static String CompareEditorInput_0; - public static String ComparePlugin_internal_error; - public static String ComparePreferencePage_0; - public static String ComparePreferencePage_1; - public static String ComparePreferencePage_2; - public static String ComparePreferencePage_3; - public static String ComparePreferencePage_4; - public static String CompareUIPlugin_0; - public static String CompareUIPlugin_1; - public static String ContentMergeViewer_resource_changed_description; - public static String ContentMergeViewer_resource_changed_title; - public static String ExceptionDialog_seeErrorLogMessage; - public static String CompareViewerSwitchingPane_Titleformat; - public static String NavigationEndDialog_0; - public static String NavigationEndDialog_1; - public static String ShowWhitespaceAction_0; - public static String StructureDiffViewer_0; - public static String StructureDiffViewer_1; - public static String StructureDiffViewer_2; - public static String StructureDiffViewer_3; - public static String StructureDiffViewer_NoStructuralDifferences; - public static String StructureDiffViewer_StructureError; - public static String TextMergeViewer_0; - public static String TextMergeViewer_1; - public static String TextMergeViewer_10; - public static String TextMergeViewer_11; - public static String TextMergeViewer_12; - public static String TextMergeViewer_13; - public static String TextMergeViewer_14; - public static String TextMergeViewer_15; - public static String TextMergeViewer_16; - public static String TextMergeViewer_17; - public static String TextMergeViewer_2; - public static String TextMergeViewer_3; - public static String TextMergeViewer_4; - public static String TextMergeViewer_5; - public static String TextMergeViewer_6; - public static String TextMergeViewer_7; - public static String TextMergeViewer_8; - public static String TextMergeViewer_9; - public static String TextMergeViewer_accessible_ancestor; - public static String TextMergeViewer_accessible_left; - public static String TextMergeViewer_accessible_right; - public static String TextMergeViewer_cursorPosition_format; - public static String TextMergeViewer_beforeLine_format; - public static String TextMergeViewer_range_format; - public static String TextMergeViewer_changeType_addition; - public static String TextMergeViewer_changeType_deletion; - public static String TextMergeViewer_changeType_change; - public static String TextMergeViewer_direction_outgoing; - public static String TextMergeViewer_direction_incoming; - public static String TextMergeViewer_direction_conflicting; - public static String TextMergeViewer_diffType_format; - public static String TextMergeViewer_diffDescription_noDiff_format; - public static String TextMergeViewer_diffDescription_diff_format; - public static String TextMergeViewer_statusLine_format; - public static String TextMergeViewer_atEnd_title; - public static String TextMergeViewer_atEnd_message; - public static String TextMergeViewer_atBeginning_title; - public static String TextMergeViewer_atBeginning_message; - public static String CompareNavigator_atEnd_title; - public static String CompareNavigator_atEnd_message; - public static String CompareNavigator_atBeginning_title; - public static String CompareNavigator_atBeginning_message; - public static String WorkerJob_0; - public static String SelectAncestorDialog_title; - public static String SelectAncestorDialog_message; - public static String SelectAncestorDialog_option; - public static String CompareWithOtherResourceDialog_ancestor; - public static String CompareWithOtherResourceDialog_rightPanel; - public static String CompareWithOtherResourceDialog_leftPanel; - public static String CompareWithOtherResourceDialog_dialogTitle; - public static String CompareWithOtherResourceDialog_dialogMessage; - public static String CompareWithOtherResourceDialog_error_not_comparable; - public static String CompareWithOtherResourceDialog_error_empty; - public static String CompareWithOtherResourceDialog_clear; - public static String CompareWithOtherResourceDialog_info; - public static String CompareWithOtherResourceDialog_externalFile_errorTitle; - public static String CompareWithOtherResourceDialog_externalFile_errorMessage; - public static String CompareWithOtherResourceDialog_externalFileMainButton; - public static String CompareWithOtherResourceDialog_externalFileRadioButton; - public static String CompareWithOtherResourceDialog_externalFolderMainButton; - public static String CompareWithOtherResourceDialog_externalFolderRadioButton; - public static String CompareWithOtherResourceDialog_workspaceMainButton; - public static String CompareWithOtherResourceDialog_workspaceRadioButton; - public static String CompareContentViewerSwitchingPane_defaultViewer; - public static String CompareContentViewerSwitchingPane_switchButtonTooltip; - public static String CompareContentViewerSwitchingPane_discoveredLabel; - public static String CompareContentViewerSwitchingPane_optimized; - public static String CompareContentViewerSwitchingPane_optimizedTooltip; - public static String CompareStructureViewerSwitchingPane_defaultViewer; - public static String CompareStructureViewerSwitchingPane_switchButtonTooltip; - public static String CompareStructureViewerSwitchingPane_discoveredLabel; - - public static String ReaderCreator_fileIsNotAccessible; - - static { - NLS.initializeMessages(BUNDLE_NAME, CompareMessages.class); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.properties deleted file mode 100644 index 451ac3bb6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.properties +++ /dev/null @@ -1,143 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2010 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 -# Matt McCutchen (hashproduct+eclipse@gmail.com) - Bug 35390 Three-way compare cannot select (mis-selects) )ancestor resource -# Aleksandra Wozniak (aleksandra.k.wozniak@gmail.com) - Bug 239959, Bug 73923 -############################################################################### - -ComparePlugin_internal_error= Internal Error -ExceptionDialog_seeErrorLogMessage= See error log for details. - -# -# Title format for CompareViewerSwitchingPane -# -CompareViewerSwitchingPane_Titleformat= {0} ({1}) - -# -# Title message for StructureDiffViewer if no structural differences could be found -# -StructureDiffViewer_NoStructuralDifferences= No Structural Differences -StructureDiffViewer_StructureError= Cannot Compare Structures -StructureDiffViewer_0=Generating Structure Differences -StructureDiffViewer_1=Computing Structure Differences -StructureDiffViewer_2=Generating Structure Differences -StructureDiffViewer_3=Refresh Canceled - -# -# TextMergeViewer -# -TextMergeViewer_cursorPosition_format= {0} : {1} - -TextMergeViewer_beforeLine_format= before line {0} -TextMergeViewer_range_format= {0} : {1} - -TextMergeViewer_changeType_addition= addition -TextMergeViewer_changeType_deletion= deletion -TextMergeViewer_changeType_change= change - -TextMergeViewer_direction_outgoing= outgoing -TextMergeViewer_direction_incoming= incoming -TextMergeViewer_direction_conflicting= conflicting - -TextMergeViewer_diffType_format= {0} {1} -TextMergeViewer_accessible_left=Left: {0} - -TextMergeViewer_diffDescription_noDiff_format= no diff -TextMergeViewer_diffDescription_diff_format= {0} #{1} (Left: {2}, Right: {3}) -TextMergeViewer_statusLine_format= Left: {0}, Right: {1}, {2} - -TextMergeViewer_atEnd_title= Go to Next Difference -TextMergeViewer_0=End Reached -TextMergeViewer_1=You have reached the end of the currently displayed element. What would you like to do? -TextMergeViewer_2=&Go to the beginning of this element -TextMergeViewer_3=&Display the next element -TextMergeViewer_4=Beginning Reached -TextMergeViewer_5=You have reached the beginning of the currently displayed element. What would you like to do? -TextMergeViewer_6=&Go to the end of this element -TextMergeViewer_7=&Display the previous element -TextMergeViewer_8=End Reached -TextMergeViewer_9=You have reached the last difference. Would you like go to the beginning of this element? -TextMergeViewer_10=Beginning Reached -TextMergeViewer_11=You have reached the first difference. Would you like to go to the end of this element? -TextMergeViewer_12=Element is Read Only -TextMergeViewer_13=The element being edited is read-only -TextMergeViewer_14=Element is Read Only -TextMergeViewer_15=The element being edited is read-only -TextMergeViewer_16=Show &Line Numbers -TextMergeViewer_17=Do ¬hing -TextMergeViewer_atEnd_message= End of document reached. Continue from beginning? - -TextMergeViewer_atBeginning_title= Go to Previous Difference -TextMergeViewer_accessible_right=Right: {0} -TextMergeViewer_atBeginning_message= Beginning of document reached. Continue from end? -TextMergeViewer_accessible_ancestor=Ancestor: {0} - -CompareNavigator_atEnd_title= End Reached -CompareDialog_commit_button=C&ommit -CompareDialog_error_title=Error Saving Changes -ComparePreferencePage_0=When the end/beginning is reached while navigating an element -ComparePreferencePage_1=Pro&mpt -ComparePreferencePage_2=G&o to the beginning/end of the element -ComparePreferencePage_3=Disp&lay the next/previous element -ComparePreferencePage_4=Do ¬hing -CompareDialog_error_message=The changes were not saved: {0} -CompareNavigator_atEnd_message= You have reached the last difference. - -CompareNavigator_atBeginning_title= Beginning Reached -CompareNavigator_atBeginning_message= You have reached the first difference. -ContentMergeViewer_resource_changed_title=Resources Changed -ContentMergeViewer_resource_changed_description=The resources being compared have changed outside the compare editor. Do you want to save your changes? Any unsaved changes will be discarded. -NavigationEndDialog_0=Remember decision -NavigationEndDialog_1=Navigation Options -CompareUIPlugin_0=Opening Compare Editor -CompareUIPlugin_1=Opening Compare Dialog -CompareContainer_0=Updating Comparison State -CompareEditor_0=Initializing Compare Editor for {0} -CompareEditor_1=Initializing... -CompareEditor_2=Update comparison {0} -DocumentMerger_0=Computing Differences... -DocumentMerger_1=Too many differences found -DocumentMerger_2=Finding Differences... -DocumentMerger_3=Too many differences found -CompareEditorInput_0=&Select -WorkerJob_0=Multiple errors occurred while processing compare editor events - -SelectAncestorDialog_title=Select Common Ancestor -SelectAncestorDialog_message=Which resource would you like to use as the common ancestor in the three-way compare? -SelectAncestorDialog_option=''{0}'' -ShowWhitespaceAction_0=Show &Whitespace Characters - -CompareWithOtherResourceDialog_ancestor=Ancestor -CompareWithOtherResourceDialog_rightPanel=Right -CompareWithOtherResourceDialog_leftPanel=Left -CompareWithOtherResourceDialog_dialogTitle=Compare with Other Resource -CompareWithOtherResourceDialog_dialogMessage=Select resources to compare -CompareWithOtherResourceDialog_error_not_comparable=Selected resources are not comparable. -CompareWithOtherResourceDialog_error_empty=Both left and right panel must contain a valid path. -CompareWithOtherResourceDialog_clear=&Clear -CompareWithOtherResourceDialog_info=Drag files from a view or between dialog's fields. -CompareWithOtherResourceDialog_externalFile_errorTitle=Compare With Other Resource Error -CompareWithOtherResourceDialog_externalFile_errorMessage=Cannot create a link to an external resource. -CompareWithOtherResourceDialog_externalFileMainButton=Browse... -CompareWithOtherResourceDialog_externalFileRadioButton=&External file -CompareWithOtherResourceDialog_externalFolderMainButton=Browse... -CompareWithOtherResourceDialog_externalFolderRadioButton=External folder -CompareWithOtherResourceDialog_workspaceMainButton=&Browse... -CompareWithOtherResourceDialog_workspaceRadioButton=&Workspace - -CompareContentViewerSwitchingPane_defaultViewer=Default Compare -CompareContentViewerSwitchingPane_switchButtonTooltip=Switch Compare Viewer -CompareContentViewerSwitchingPane_discoveredLabel={0} Compare -CompareContentViewerSwitchingPane_optimized=Differences shown might not be optimal -CompareContentViewerSwitchingPane_optimizedTooltip=To avoid long computation time a faster comparison algorithm has been used. As a result, the differences highlighted in the viewer may be larger than necessary. -CompareStructureViewerSwitchingPane_defaultViewer=Default Structure Compare -CompareStructureViewerSwitchingPane_switchButtonTooltip=Switch Structure Compare Viewer -CompareStructureViewerSwitchingPane_discoveredLabel={0} Structure Compare - -ReaderCreator_fileIsNotAccessible=Cannot create a reader because the file is inaccessible. diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareOutlinePage.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareOutlinePage.java deleted file mode 100644 index 0c7b8c27b..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareOutlinePage.java +++ /dev/null @@ -1,157 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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 org.eclipse.compare.*; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.*; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.ui.part.IPageSite; -import org.eclipse.ui.part.Page; -import org.eclipse.ui.views.contentoutline.IContentOutlinePage; - -/** - */ -public class CompareOutlinePage extends Page implements IContentOutlinePage, IPropertyChangeListener { - - private CompareEditor fCompareEditor; - private Control fControl; - private CompareViewerSwitchingPane fStructurePane; - private OutlineViewerCreator fCreator; - - CompareOutlinePage(CompareEditor editor) { - fCompareEditor= editor; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite) - */ - public void createControl(Composite parent) { - final Splitter h= new Splitter(parent, SWT.HORIZONTAL); - fStructurePane= new CompareViewerSwitchingPane(h, SWT.BORDER | SWT.FLAT, true) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - if (input instanceof ICompareInput) - return findStructureViewer(oldViewer, (ICompareInput)input, this); - return null; - } - }; - h.setVisible(fStructurePane, true); - fControl = h; - IPageSite site = getSite(); - site.setSelectionProvider(fStructurePane); - h.layout(); - reset(); - } - - private Viewer findStructureViewer(Viewer oldViewer, ICompareInput input, Composite parent) { - OutlineViewerCreator creator = getCreator(); - if (creator != null) - return creator.findStructureViewer(oldViewer, input, parent, getCompareConfiguration()); - return null; - } - - private CompareConfiguration getCompareConfiguration() { - return fCompareEditor.getCompareConfiguration(); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.IPage#getControl() - */ - public Control getControl() { - return fControl; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.IPage#setFocus() - */ - public void setFocus() { - if (fStructurePane != null) - fStructurePane.setFocus(); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) - */ - public void addSelectionChangedListener(ISelectionChangedListener listener) { - if (fStructurePane != null) - fStructurePane.addSelectionChangedListener(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() - */ - public ISelection getSelection() { - if (fStructurePane != null) - return fStructurePane.getSelection(); - return StructuredSelection.EMPTY; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) - */ - public void removeSelectionChangedListener(ISelectionChangedListener listener) { - if (fStructurePane != null) - fStructurePane.removeSelectionChangedListener(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection) - */ - public void setSelection(ISelection selection) { - if (fStructurePane != null) - fStructurePane.setSelection(selection); - } - - private void setInput(Object input) { - if (fStructurePane != null) { - fStructurePane.setInput(input); - ((Splitter)fControl).layout(); - } - } - - public OutlineViewerCreator getCreator() { - if (fCreator == null) { - fCreator = (OutlineViewerCreator)Utilities.getAdapter(fCompareEditor, OutlineViewerCreator.class); - if (fCreator != null) - fCreator.addPropertyChangeListener(this); - } - return fCreator; - } - - public void propertyChange(PropertyChangeEvent event) { - if (event.getProperty().equals(OutlineViewerCreator.PROP_INPUT)) { - fStructurePane.setInput(event.getNewValue()); - ((Splitter)fControl).layout(); - } - } - - public void dispose() { - super.dispose(); - if (fCreator != null) - fCreator.removePropertyChangeListener(this); - fCreator = null; - } - - public void reset() { - if (fCreator != null) - fCreator.removePropertyChangeListener(this); - fCreator = null; - OutlineViewerCreator creator = getCreator(); - if (creator != null) - setInput(creator.getInput()); - else - setInput(null); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferenceInitializer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferenceInitializer.java deleted file mode 100644 index 23162e562..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferenceInitializer.java +++ /dev/null @@ -1,27 +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.internal; - -import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer; -import org.eclipse.jface.preference.IPreferenceStore; - -public class ComparePreferenceInitializer extends AbstractPreferenceInitializer { - - public ComparePreferenceInitializer() { - // Nothing to do - } - - public void initializeDefaultPreferences() { - IPreferenceStore store = CompareUIPlugin.getDefault().getPreferenceStore(); - ComparePreferencePage.initDefaults(store); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java deleted file mode 100644 index f4fe72b73..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java +++ /dev/null @@ -1,489 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.TabFolder; -import org.eclipse.swt.widgets.TabItem; -import org.eclipse.swt.widgets.Text; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.preference.PreferencePage; -import org.eclipse.jface.preference.RadioGroupFieldEditor; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; - -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchPreferencePage; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.dialogs.PreferenceLinkArea; -import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.IEncodedStreamContentAccessor; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.contentmergeviewer.TextMergeViewer; -import org.eclipse.compare.internal.core.ComparePlugin; -import org.eclipse.compare.structuremergeviewer.DiffNode; -import org.eclipse.compare.structuremergeviewer.Differencer; - - -public class ComparePreferencePage extends PreferencePage implements IWorkbenchPreferencePage { - - class FakeInput implements ITypedElement, IEncodedStreamContentAccessor { - static final String UTF_16= "UTF-16"; //$NON-NLS-1$ - String fContent; - - FakeInput(String name) { - fContent= loadPreviewContentFromFile(name); - } - public Image getImage() { - return null; - } - public String getName() { - return "no name"; //$NON-NLS-1$ - } - public String getType() { - return "no type"; //$NON-NLS-1$ - } - public InputStream getContents() { - return new ByteArrayInputStream(Utilities.getBytes(fContent, UTF_16)); - } - public String getCharset() { - return UTF_16; - } - } - - private static final String PREFIX= CompareUIPlugin.PLUGIN_ID + "."; //$NON-NLS-1$ - public static final String OPEN_STRUCTURE_COMPARE= PREFIX + "OpenStructureCompare"; //$NON-NLS-1$ - public static final String USE_OUTLINE_VIEW= PREFIX + "UseOutlineView"; //$NON-NLS-1$ - public static final String SYNCHRONIZE_SCROLLING= PREFIX + "SynchronizeScrolling"; //$NON-NLS-1$ - public static final String SHOW_PSEUDO_CONFLICTS= PREFIX + "ShowPseudoConflicts"; //$NON-NLS-1$ - public static final String INITIALLY_SHOW_ANCESTOR_PANE= PREFIX + "InitiallyShowAncestorPane"; //$NON-NLS-1$ - public static final String PREF_SAVE_ALL_EDITORS= PREFIX + "SaveAllEditors"; //$NON-NLS-1$ - public static final String IGNORE_WHITESPACE= PREFIX + "IgnoreWhitespace"; //$NON-NLS-1$ - - //public static final String USE_SPLINES= PREFIX + "UseSplines"; //$NON-NLS-1$ - public static final String USE_SINGLE_LINE= PREFIX + "UseSingleLine"; //$NON-NLS-1$ - public static final String HIGHLIGHT_TOKEN_CHANGES= PREFIX + "HighlightTokenChanges"; //$NON-NLS-1$ - //public static final String USE_RESOLVE_UI= PREFIX + "UseResolveUI"; //$NON-NLS-1$ - public static final String CAPPING_DISABLED= PREFIX + "CappingDisable"; //$NON-NLS-1$ - public static final String PATH_FILTER= PREFIX + "PathFilter"; //$NON-NLS-1$ - public static final String ADDED_LINES_REGEX= PREFIX + "AddedLinesRegex"; //$NON-NLS-1$ - public static final String REMOVED_LINES_REGEX= PREFIX + "RemovedLinesRegex"; //$NON-NLS-1$ - - - private TextMergeViewer fPreviewViewer; - private IPropertyChangeListener fPreferenceChangeListener; - private CompareConfiguration fCompareConfiguration; - private OverlayPreferenceStore fOverlayStore; - private Map fCheckBoxes= new HashMap(); - private Text fFilters; - private Text addedLinesRegex; - private Text removedLinesRegex; - private SelectionListener fCheckBoxListener; - - - public final OverlayPreferenceStore.OverlayKey[] fKeys= new OverlayPreferenceStore.OverlayKey[] { - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, OPEN_STRUCTURE_COMPARE), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, USE_OUTLINE_VIEW), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, SYNCHRONIZE_SCROLLING), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, SHOW_PSEUDO_CONFLICTS), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_SHOW_ANCESTOR_PANE), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, IGNORE_WHITESPACE), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PREF_SAVE_ALL_EDITORS), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ADDED_LINES_REGEX), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, REMOVED_LINES_REGEX), - //new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, USE_SPLINES), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, USE_SINGLE_LINE), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, HIGHLIGHT_TOKEN_CHANGES), - //new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, USE_RESOLVE_UI), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, CAPPING_DISABLED), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PATH_FILTER), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICompareUIConstants.PREF_NAVIGATION_END_ACTION), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL), - }; - private RadioGroupFieldEditor editor; - - - public static void initDefaults(IPreferenceStore store) { - store.setDefault(OPEN_STRUCTURE_COMPARE, true); - store.setDefault(USE_OUTLINE_VIEW, false); - store.setDefault(SYNCHRONIZE_SCROLLING, true); - store.setDefault(SHOW_PSEUDO_CONFLICTS, false); - store.setDefault(INITIALLY_SHOW_ANCESTOR_PANE, false); - store.setDefault(IGNORE_WHITESPACE, false); - store.setDefault(PREF_SAVE_ALL_EDITORS, false); - store.setDefault(ADDED_LINES_REGEX, ""); //$NON-NLS-1$ - store.setDefault(REMOVED_LINES_REGEX, ""); //$NON-NLS-1$ - //store.setDefault(USE_SPLINES, false); - store.setDefault(USE_SINGLE_LINE, true); - store.setDefault(HIGHLIGHT_TOKEN_CHANGES, true); - //store.setDefault(USE_RESOLVE_UI, false); - store.setDefault(CAPPING_DISABLED, false); - store.setDefault(PATH_FILTER, ""); //$NON-NLS-1$ - store.setDefault(ICompareUIConstants.PREF_NAVIGATION_END_ACTION, ICompareUIConstants.PREF_VALUE_PROMPT); - store.setDefault(ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL, ICompareUIConstants.PREF_VALUE_LOOP); - } - - public ComparePreferencePage() { - - //setDescription(Utilities.getString("ComparePreferencePage.description")); //$NON-NLS-1$ - - setPreferenceStore(CompareUIPlugin.getDefault().getPreferenceStore()); - - fOverlayStore= new OverlayPreferenceStore(getPreferenceStore(), fKeys); - fPreferenceChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - String key= event.getProperty(); - if (key.equals(INITIALLY_SHOW_ANCESTOR_PANE)) { - boolean b= fOverlayStore.getBoolean(INITIALLY_SHOW_ANCESTOR_PANE); - if (fCompareConfiguration != null) { - fCompareConfiguration.setProperty(INITIALLY_SHOW_ANCESTOR_PANE, new Boolean(b)); - } - } - } - }; - fOverlayStore.addPropertyChangeListener(fPreferenceChangeListener); - } - - /* - * @see IWorkbenchPreferencePage#init() - */ - public void init(IWorkbench workbench) { - // empty - } - - /* - * @see PreferencePage#performOk() - */ - public boolean performOk() { - fOverlayStore.setValue(ADDED_LINES_REGEX, addedLinesRegex.getText()); - fOverlayStore.setValue(REMOVED_LINES_REGEX, removedLinesRegex.getText()); - - editor.store(); - fOverlayStore.propagate(); - - ComparePlugin.getDefault().setCappingDisabled( - getPreferenceStore().getBoolean( - ComparePreferencePage.CAPPING_DISABLED)); - return true; - } - - /* - * @see PreferencePage#performDefaults() - */ - protected void performDefaults() { - - fOverlayStore.loadDefaults(); - initializeFields(); - - super.performDefaults(); - } - - /* - * @see DialogPage#dispose() - */ - public void dispose() { - - if (fOverlayStore != null) { - if (fPreferenceChangeListener != null) { - fOverlayStore.removePropertyChangeListener(fPreferenceChangeListener); - fPreferenceChangeListener= null; - } - fOverlayStore.stop(); - fOverlayStore= null; - } - - super.dispose(); - } - - static public boolean getSaveAllEditors() { - IPreferenceStore store= CompareUIPlugin.getDefault().getPreferenceStore(); - return store.getBoolean(PREF_SAVE_ALL_EDITORS); - } - - static public void setSaveAllEditors(boolean value) { - IPreferenceStore store= CompareUIPlugin.getDefault().getPreferenceStore(); - store.setValue(PREF_SAVE_ALL_EDITORS, value); - } - - /* - * @see PreferencePage#createContents(Composite) - */ - protected Control createContents(Composite parent) { - - PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, ICompareContextIds.COMPARE_PREFERENCE_PAGE); - - fOverlayStore.load(); - fOverlayStore.start(); - - TabFolder folder= new TabFolder(parent, SWT.NONE); - folder.setLayout(new TabFolderLayout()); - folder.setLayoutData(new GridData(GridData.FILL_BOTH)); - - TabItem item= new TabItem(folder, SWT.NONE); - item.setText(Utilities.getString("ComparePreferencePage.generalTab.label")); //$NON-NLS-1$ - //item.setImage(JavaPluginImages.get(JavaPluginImages.IMG_OBJS_CFILE)); - item.setControl(createGeneralPage(folder)); - - item= new TabItem(folder, SWT.NONE); - item.setText(Utilities.getString("ComparePreferencePage.textCompareTab.label")); //$NON-NLS-1$ - //item.setImage(JavaPluginImages.get(JavaPluginImages.IMG_OBJS_CFILE)); - item.setControl(createTextComparePage(folder)); - - initializeFields(); - Dialog.applyDialogFont(folder); - return folder; - } - - private Control createGeneralPage(Composite parent) { - Composite composite= new Composite(parent, SWT.NULL); - GridLayout layout= new GridLayout(); - layout.numColumns= 1; - composite.setLayout(layout); - - addCheckBox(composite, "ComparePreferencePage.structureCompare.label", OPEN_STRUCTURE_COMPARE, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.structureOutline.label", USE_OUTLINE_VIEW, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.ignoreWhitespace.label", IGNORE_WHITESPACE, 0); //$NON-NLS-1$ - - // a spacer - new Label(composite, SWT.NONE); - - addCheckBox(composite, "ComparePreferencePage.saveBeforePatching.label", PREF_SAVE_ALL_EDITORS, 0); //$NON-NLS-1$ - - // a spacer - new Label(composite, SWT.NONE); - - Label l= new Label(composite, SWT.WRAP); - l.setText(Utilities.getString("ComparePreferencePage.regex.description")); //$NON-NLS-1$ - - Composite c2= new Composite(composite, SWT.NONE); - c2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - layout= new GridLayout(2, false); - layout.marginWidth= 0; - c2.setLayout(layout); - - l= new Label(c2, SWT.NONE); - l.setText(Utilities.getString("ComparePreferencePage.regexAdded.label")); //$NON-NLS-1$ - addedLinesRegex = new Text(c2, SWT.BORDER); - addedLinesRegex.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - addedLinesRegex.setText(fOverlayStore.getString(ADDED_LINES_REGEX)); - - l= new Label(c2, SWT.NONE); - l.setText(Utilities.getString("ComparePreferencePage.regexRemoved.label")); //$NON-NLS-1$ - removedLinesRegex = new Text(c2, SWT.BORDER); - removedLinesRegex.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - removedLinesRegex.setText(fOverlayStore.getString(REMOVED_LINES_REGEX)); - - // a spacer - new Label(composite, SWT.NONE); - - l= new Label(composite, SWT.WRAP); - l.setText(Utilities.getString("ComparePreferencePage.filter.description")); //$NON-NLS-1$ - - Composite c3= new Composite(composite, SWT.NONE); - c3.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - layout= new GridLayout(2, false); - layout.marginWidth= 0; - c3.setLayout(layout); - - l= new Label(c3, SWT.NONE); - l.setText(Utilities.getString("ComparePreferencePage.filter.label")); //$NON-NLS-1$ - - fFilters= new Text(c3, SWT.BORDER); - fFilters.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - fFilters.setText(fOverlayStore.getString(PATH_FILTER)); - fFilters.addModifyListener( - new ModifyListener() { - public void modifyText(ModifyEvent e) { - String filters= fFilters.getText(); - String message= CompareFilter.validateResourceFilters(filters); - setValid(message == null); - setMessage(null); - setErrorMessage(message); - fOverlayStore.setValue(PATH_FILTER, filters); - } - } - ); - - return composite; - } - - private Control createTextComparePage(Composite parent) { - - Composite composite= new Composite(parent, SWT.NULL); - GridLayout layout= new GridLayout(); - layout.numColumns= 1; - composite.setLayout(layout); - - addCheckBox(composite, "ComparePreferencePage.synchronizeScrolling.label", SYNCHRONIZE_SCROLLING, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.initiallyShowAncestorPane.label", INITIALLY_SHOW_ANCESTOR_PANE, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.showPseudoConflicts.label", SHOW_PSEUDO_CONFLICTS, 0); //$NON-NLS-1$ - - //addCheckBox(composite, "ComparePreferencePage.useSplines.label", USE_SPLINES, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.useSingleLine.label", USE_SINGLE_LINE, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.highlightTokenChanges.label", HIGHLIGHT_TOKEN_CHANGES, 0); //$NON-NLS-1$ - //addCheckBox(composite, "ComparePreferencePage.useResolveUI.label", USE_RESOLVE_UI, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.disableCapping.label", CAPPING_DISABLED, 0); //$NON-NLS-1$ - - Composite radioGroup = new Composite(composite, SWT.NULL); - radioGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - editor = new RadioGroupFieldEditor(ICompareUIConstants.PREF_NAVIGATION_END_ACTION, CompareMessages.ComparePreferencePage_0, 1, - new String[][] { - new String[] { CompareMessages.ComparePreferencePage_1, ICompareUIConstants.PREF_VALUE_PROMPT }, - new String[] { CompareMessages.ComparePreferencePage_2, ICompareUIConstants.PREF_VALUE_LOOP }, - new String[] { CompareMessages.ComparePreferencePage_3, ICompareUIConstants.PREF_VALUE_NEXT }, - new String[] { CompareMessages.ComparePreferencePage_4, ICompareUIConstants.PREF_VALUE_DO_NOTHING} - }, - radioGroup, true); - editor.setPreferenceStore(fOverlayStore); - editor.fillIntoGrid(radioGroup, 1); - - // a spacer - Label separator= new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); - separator.setVisible(false); - - Label previewLabel= new Label(composite, SWT.NULL); - previewLabel.setText(Utilities.getString("ComparePreferencePage.preview.label")); //$NON-NLS-1$ - - Control previewer= createPreviewer(composite); - GridData gd= new GridData(GridData.FILL_BOTH); - gd.widthHint= convertWidthInCharsToPixels(60); - gd.heightHint= convertHeightInCharsToPixels(13); - previewer.setLayoutData(gd); - - PreferenceLinkArea area = new PreferenceLinkArea(composite, SWT.NONE, - "org.eclipse.ui.preferencePages.ColorsAndFonts", Utilities.getString("ComparePreferencePage.colorAndFontLink"), //$NON-NLS-1$ //$NON-NLS-2$ - (IWorkbenchPreferenceContainer)getContainer(), "selectCategory:org.eclipse.compare.contentmergeviewer.TextMergeViewer"); //$NON-NLS-1$ - - GridData data= new GridData(SWT.FILL, SWT.CENTER, false, false); - area.getControl().setLayoutData(data); - - return composite; - } - - private Control createPreviewer(Composite parent) { - - fCompareConfiguration= new CompareConfiguration(fOverlayStore); - fCompareConfiguration.setAncestorLabel(Utilities.getString("ComparePreferencePage.ancestor.label")); //$NON-NLS-1$ - - fCompareConfiguration.setLeftLabel(Utilities.getString("ComparePreferencePage.left.label")); //$NON-NLS-1$ - fCompareConfiguration.setLeftEditable(false); - - fCompareConfiguration.setRightLabel(Utilities.getString("ComparePreferencePage.right.label")); //$NON-NLS-1$ - fCompareConfiguration.setRightEditable(false); - - fPreviewViewer= new TextMergeViewer(parent, SWT.BORDER, fCompareConfiguration); - - fPreviewViewer.setInput( - new DiffNode(Differencer.CONFLICTING, - new FakeInput("ComparePreferencePage.previewAncestor"), //$NON-NLS-1$ - new FakeInput("ComparePreferencePage.previewLeft"), //$NON-NLS-1$ - new FakeInput("ComparePreferencePage.previewRight") //$NON-NLS-1$ - ) - ); - - Control c= fPreviewViewer.getControl(); - c.addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fCompareConfiguration != null) - fCompareConfiguration.dispose(); - } - }); - - return c; - } - - private void initializeFields() { - - Iterator e= fCheckBoxes.keySet().iterator(); - while (e.hasNext()) { - Button b= (Button) e.next(); - String key= (String) fCheckBoxes.get(b); - b.setSelection(fOverlayStore.getBoolean(key)); - } - - if (fFilters != null) - fFilters.setText(fOverlayStore.getString(PATH_FILTER)); - if (addedLinesRegex != null) - addedLinesRegex.setText(fOverlayStore.getString(ADDED_LINES_REGEX)); - if (removedLinesRegex != null) - removedLinesRegex.setText(fOverlayStore.getString(REMOVED_LINES_REGEX)); - - editor.load(); - } - - // overlay stuff - - private Button addCheckBox(Composite parent, String labelKey, String key, int indentation) { - - String label= Utilities.getString(labelKey); - - Button checkBox= new Button(parent, SWT.CHECK); - checkBox.setText(label); - - GridData gd= new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalIndent= indentation; - gd.horizontalSpan= 2; - checkBox.setLayoutData(gd); - - if (fCheckBoxListener == null) { - fCheckBoxListener= new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - Button button= (Button) e.widget; - fOverlayStore.setValue((String) fCheckBoxes.get(button), button.getSelection()); - } - }; - } - checkBox.addSelectionListener(fCheckBoxListener); - - fCheckBoxes.put(checkBox, key); - - return checkBox; - } - - private String loadPreviewContentFromFile(String key) { - - String preview= Utilities.getString(key); - String separator= System.getProperty("line.separator"); //$NON-NLS-1$ - StringBuffer buffer= new StringBuffer(); - for (int i= 0; i < preview.length(); i++) { - char c= preview.charAt(i); - if (c == '\n') - buffer.append(separator); - else - buffer.append(c); - } - return buffer.toString(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareStructureViewerSwitchingPane.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareStructureViewerSwitchingPane.java deleted file mode 100644 index 04bfdf3c5..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareStructureViewerSwitchingPane.java +++ /dev/null @@ -1,256 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2010 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.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.compare.CompareViewerSwitchingPane; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CLabel; -import org.eclipse.swt.events.MenuAdapter; -import org.eclipse.swt.events.MenuEvent; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.RowLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; -import org.eclipse.swt.widgets.ToolBar; -import org.eclipse.swt.widgets.ToolItem; -import org.eclipse.ui.PlatformUI; - -public class CompareStructureViewerSwitchingPane extends - CompareViewerSwitchingPane { - - private CompareEditorInput fCompareEditorInput; - - private ViewerDescriptor fSelectedViewerDescriptor; - - private ToolBar toolBar; - - public CompareStructureViewerSwitchingPane(Composite parent, int style, - boolean visibility, CompareEditorInput cei) { - super(parent, style, visibility); - fCompareEditorInput = cei; - } - - private CompareConfiguration getCompareConfiguration() { - return fCompareEditorInput.getCompareConfiguration(); - } - - protected Viewer getViewer(Viewer oldViewer, Object input) { - if (input instanceof ICompareInput) { - if (fSelectedViewerDescriptor != null) { - ViewerDescriptor[] array = CompareUIPlugin.getDefault().findStructureViewerDescriptor( - oldViewer, (ICompareInput)input, getCompareConfiguration()); - List list = array != null ? Arrays.asList(array) - : Collections.EMPTY_LIST; - if (list.contains(fSelectedViewerDescriptor)) { - // use selected viewer only when appropriate for the new input - fCompareEditorInput - .setStructureViewerDescriptor(fSelectedViewerDescriptor); - Viewer viewer = fCompareEditorInput.findStructureViewer( - oldViewer, (ICompareInput) input, this); - return viewer; - } - // fallback to default otherwise - fSelectedViewerDescriptor = null; - } - - fCompareEditorInput.setStructureViewerDescriptor(null); - Viewer viewer = fCompareEditorInput.findStructureViewer(oldViewer, - (ICompareInput) input, this); - fCompareEditorInput.setStructureViewerDescriptor(fSelectedViewerDescriptor); - return viewer; - } - return null; - } - - protected Control createTopLeft(Composite p) { - final Composite composite = new Composite(p, SWT.NONE) { - public Point computeSize(int wHint, int hHint, boolean changed) { - return super.computeSize(wHint, Math.max(24, hHint), changed); - } - }; - - RowLayout layout = new RowLayout(); - layout.marginTop = 0; - composite.setLayout(layout); - - CLabel cl = new CLabel(composite, SWT.NONE); - cl.setText(null); - - toolBar = new ToolBar(composite, SWT.FLAT); - toolBar.setVisible(false); // hide by default - final ToolItem toolItem = new ToolItem(toolBar, SWT.PUSH, 0); - toolItem.setImage(PlatformUI.getWorkbench().getSharedImages().getImage( - /* IWorkbenchGraphicConstants */"IMG_LCL_VIEW_MENU")); //$NON-NLS-1$ - toolItem - .setToolTipText(CompareMessages.CompareStructureViewerSwitchingPane_switchButtonTooltip); - toolItem.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - showMenu(); - } - }); - toolBar.addMouseListener(new MouseAdapter() { - public void mouseDown(MouseEvent e) { - showMenu(); - } - }); - return composite; - } - - protected boolean inputChanged(Object input) { - return getInput() != input - || fCompareEditorInput.getStructureViewerDescriptor() != fSelectedViewerDescriptor; - } - - public void setInput(Object input) { - super.setInput(input); - if (getViewer() == null || !Utilities.okToUse(getViewer().getControl())) - return; - ViewerDescriptor[] vd = null; - if (getInput() instanceof ICompareInput) { - vd = CompareUIPlugin.getDefault().findStructureViewerDescriptor( - getViewer(), (ICompareInput) getInput(), - getCompareConfiguration()); - } - toolBar.setVisible(vd != null && vd.length > 1); - } - - private void showMenu() { - if (!(getInput() instanceof ICompareInput)) - return; - - ViewerDescriptor[] vd = CompareUIPlugin.getDefault() - .findStructureViewerDescriptor(getViewer(), - (ICompareInput) getInput(), getCompareConfiguration()); - - // 1. create - final Menu menu = new Menu(getShell(), SWT.POP_UP); - - // add default - String label = CompareMessages.CompareStructureViewerSwitchingPane_defaultViewer; - MenuItem defaultItem = new MenuItem(menu, SWT.RADIO); - defaultItem.setText(label); - defaultItem.addSelectionListener(createSelectionListener(null)); - defaultItem.setSelection(fSelectedViewerDescriptor == null); - - new MenuItem(menu, SWT.SEPARATOR); - - // add others - for (int i = 0; i < vd.length; i++) { - final ViewerDescriptor vdi = vd[i]; - label = vdi.getLabel(); - if (label == null || label.equals("")) { //$NON-NLS-1$ - String l = CompareUIPlugin.getDefault().findStructureTypeNameOrType((ICompareInput) getInput(), vdi, getCompareConfiguration()); - if (l == null) - // couldn't figure out the label, skip the viewer - continue; - label = NLS.bind(CompareMessages.CompareStructureViewerSwitchingPane_discoveredLabel, new Object[] {l}); - } - MenuItem item = new MenuItem(menu, SWT.RADIO); - item.setText(label); - item.addSelectionListener(createSelectionListener(vdi)); - item.setSelection(vdi == fSelectedViewerDescriptor); - } - - // 2. show - Rectangle bounds = toolBar.getItem(0).getBounds(); - Point topLeft = new Point(bounds.x, bounds.y + bounds.height); - topLeft = toolBar.toDisplay(topLeft); - menu.setLocation(topLeft.x, topLeft.y); - menu.setVisible(true); - - // 3. dispose on close - menu.addMenuListener(new MenuAdapter() { - public void menuHidden(MenuEvent e) { - e.display.asyncExec(new Runnable() { - public void run() { - menu.dispose(); - } - }); - } - }); - } - - private SelectionListener createSelectionListener(final ViewerDescriptor vd) { - return new SelectionListener() { - public void widgetSelected(SelectionEvent e) { - MenuItem mi = (MenuItem) e.widget; - if (mi.getSelection()) { - Viewer oldViewer = getViewer(); - fSelectedViewerDescriptor = vd; - CompareStructureViewerSwitchingPane.this.setInput(oldViewer - .getInput()); - } - } - - public void widgetDefaultSelected(SelectionEvent e) { - // nothing to do - } - }; - } - - public void setText(String label) { - Composite c = (Composite) getTopLeft(); - Control[] children = c.getChildren(); - for (int i = 0; i < children.length; i++) { - if (children[i] instanceof CLabel) { - CLabel cl = (CLabel) children[i]; - if (cl != null && !cl.isDisposed()) { - cl.setText(label); - c.layout(); - } - return; - } - } - } - - public void setImage(Image image) { - Composite c = (Composite) getTopLeft(); - Control[] children = c.getChildren(); - for (int i = 0; i < children.length; i++) { - if (children[i] instanceof CLabel) { - CLabel cl = (CLabel) children[i]; - if (cl != null && !cl.isDisposed()) - cl.setImage(image); - return; - } - } - } - - public void addMouseListener(MouseListener listener) { - Composite c = (Composite) getTopLeft(); - Control[] children = c.getChildren(); - for (int i = 0; i < children.length; i++) { - if (children[i] instanceof CLabel) { - CLabel cl = (CLabel) children[i]; - cl.addMouseListener(listener); - } - } - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareUIPlugin.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareUIPlugin.java deleted file mode 100644 index 4e32e94e9..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareUIPlugin.java +++ /dev/null @@ -1,1421 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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.internal; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.ResourceBundle; -import java.util.Set; -import java.util.StringTokenizer; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.compare.IStreamContentAccessor; -import org.eclipse.compare.IStreamMerger; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.internal.core.ComparePlugin; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.compare.structuremergeviewer.IStructureCreator; -import org.eclipse.compare.structuremergeviewer.StructureDiffViewer; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.FileLocator; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.core.runtime.IExtensionRegistry; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.content.IContentType; -import org.eclipse.core.runtime.content.IContentTypeManager; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.operation.IRunnableContext; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IEditorRegistry; -import org.eclipse.ui.IReusableEditor; -import org.eclipse.ui.ISharedImages; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.model.IWorkbenchAdapter; -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; - -/** - * The Compare UI plug-in defines the entry point to initiate a configurable - * compare operation on arbitrary resources. The result of the compare - * is opened into a compare editor where the details can be browsed and - * edited in dynamically selected structure and content viewers. - * <p> - * The Compare UI provides a registry for content and structure compare viewers, - * which is initialized from extensions contributed to extension points - * declared by this plug-in. - * <p> - * This class is the plug-in runtime class for the - * <code>"org.eclipse.compare"</code> plug-in. - * </p> - */ -public final class CompareUIPlugin extends AbstractUIPlugin { - - static class CompareRegistry { - - private final static String ID_ATTRIBUTE= "id"; //$NON-NLS-1$ - private final static String EXTENSIONS_ATTRIBUTE= "extensions"; //$NON-NLS-1$ - private final static String CONTENT_TYPE_ID_ATTRIBUTE= "contentTypeId"; //$NON-NLS-1$ - - private HashMap fIdMap; // maps ids to data - private HashMap fExtensionMap; // multimap: maps extensions to list of data - private HashMap fContentTypeBindings; // multimap: maps content type bindings to list of data - - - void register(IConfigurationElement element, Object data) { - String id= element.getAttribute(ID_ATTRIBUTE); - if (id != null) { - if (fIdMap == null) - fIdMap= new HashMap(); - fIdMap.put(id, data); - } - - String types= element.getAttribute(EXTENSIONS_ATTRIBUTE); - if (types != null) { - if (fExtensionMap == null) - fExtensionMap= new HashMap(); - StringTokenizer tokenizer= new StringTokenizer(types, ","); //$NON-NLS-1$ - while (tokenizer.hasMoreElements()) { - String extension= tokenizer.nextToken().trim(); - List l = (List) fExtensionMap.get(normalizeCase(extension)); - if (l == null) - fExtensionMap.put(normalizeCase(extension), l = new ArrayList()); - l.add(data); - } - } - } - - void createBinding(IConfigurationElement element, String idAttributeName) { - String type= element.getAttribute(CONTENT_TYPE_ID_ATTRIBUTE); - String id= element.getAttribute(idAttributeName); - if (id == null) - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.targetIdAttributeMissing", idAttributeName)); //$NON-NLS-1$ - if (type != null && id != null && fIdMap != null) { - Object o= fIdMap.get(id); - if (o != null) { - IContentType ct= fgContentTypeManager.getContentType(type); - if (ct != null) { - if (fContentTypeBindings == null) - fContentTypeBindings= new HashMap(); - List l = (List) fContentTypeBindings.get(ct); - if (l == null) - fContentTypeBindings.put(ct, l = new ArrayList()); - l.add(o); - } else { - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.contentTypeNotFound", type)); //$NON-NLS-1$ - } - } else { - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.targetNotFound", id)); //$NON-NLS-1$ - } - } - } - - Object search(IContentType type) { - List list = searchAll(type); - return list != null ? list.get(0) : null; - } - - List searchAll(IContentType type) { - if (fContentTypeBindings != null) { - for (; type != null; type= type.getBaseType()) { - List data= (List) fContentTypeBindings.get(type); - if (data != null) - return data; - } - } - return null; - } - - Object search(String extension) { - List list = searchAll(extension); - return list != null ? list.get(0) : null; - } - - List searchAll(String extension) { - if (fExtensionMap != null) - return (List) fExtensionMap.get(normalizeCase(extension)); - return null; - } - } - - /** Status code describing an internal error */ - public static final int INTERNAL_ERROR= 1; - - private static boolean NORMALIZE_CASE= true; - - public static final String PLUGIN_ID= "org.eclipse.compare"; //$NON-NLS-1$ - - private static final String BINARY_TYPE= "binary"; //$NON-NLS-1$ - - private static final String STREAM_MERGER_EXTENSION_POINT= "streamMergers"; //$NON-NLS-1$ - private static final String STREAM_MERGER= "streamMerger"; //$NON-NLS-1$ - private static final String STREAM_MERGER_ID_ATTRIBUTE= "streamMergerId"; //$NON-NLS-1$ - private static final String STRUCTURE_CREATOR_EXTENSION_POINT= "structureCreators"; //$NON-NLS-1$ - private static final String STRUCTURE_CREATOR= "structureCreator"; //$NON-NLS-1$ - private static final String STRUCTURE_CREATOR_ID_ATTRIBUTE= "structureCreatorId"; //$NON-NLS-1$ - - private static final String VIEWER_TAG= "viewer"; //$NON-NLS-1$ - private static final String STRUCTURE_MERGE_VIEWER_EXTENSION_POINT= "structureMergeViewers"; //$NON-NLS-1$ - private static final String STRUCTURE_MERGE_VIEWER_ID_ATTRIBUTE= "structureMergeViewerId"; //$NON-NLS-1$ - private static final String CONTENT_MERGE_VIEWER_EXTENSION_POINT= "contentMergeViewers"; //$NON-NLS-1$ - private static final String CONTENT_MERGE_VIEWER_ID_ATTRIBUTE= "contentMergeViewerId"; //$NON-NLS-1$ - private static final String CONTENT_VIEWER_EXTENSION_POINT= "contentViewers"; //$NON-NLS-1$ - private static final String CONTENT_VIEWER_ID_ATTRIBUTE= "contentViewerId"; //$NON-NLS-1$ - - private static final String CONTENT_TYPE_BINDING= "contentTypeBinding"; //$NON-NLS-1$ - - - private static final String COMPARE_EDITOR= PLUGIN_ID + ".CompareEditor"; //$NON-NLS-1$ - - private static final String STRUCTUREVIEWER_ALIASES_PREFERENCE_NAME= "StructureViewerAliases"; //$NON-NLS-1$ - - // content type - private static final IContentTypeManager fgContentTypeManager= Platform.getContentTypeManager(); - - public static final int NO_DIFFERENCE = 10000; - - /** - * The plugin singleton. - */ - private static CompareUIPlugin fgComparePlugin; - - /** Maps type to icons */ - private static Map fgImages= new Hashtable(10); - /** Maps type to ImageDescriptors */ - private static Map fgImageDescriptors= new Hashtable(10); - /** Maps ImageDescriptors to Images */ - private static Map fgImages2= new Hashtable(10); - - private static List fgDisposeOnShutdownImages= new ArrayList(); - - private ResourceBundle fResourceBundle; - - private boolean fRegistriesInitialized; - private CompareRegistry fStreamMergers= new CompareRegistry(); - private CompareRegistry fStructureCreators= new CompareRegistry(); - private CompareRegistry fStructureMergeViewers= new CompareRegistry(); - private CompareRegistry fContentViewers= new CompareRegistry(); - private CompareRegistry fContentMergeViewers= new CompareRegistry(); - - private Map fStructureViewerAliases; - private CompareFilter fFilter; - private IPropertyChangeListener fPropertyChangeListener; - - /** - * Creates the <code>CompareUIPlugin</code> object and registers all - * structure creators, content merge viewers, and structure merge viewers - * contributed to this plug-in's extension points. - * <p> - * Note that instances of plug-in runtime classes are automatically created - * by the platform in the course of plug-in activation. - */ - public CompareUIPlugin() { - super(); - Assert.isTrue(fgComparePlugin == null); - fgComparePlugin= this; - } - - public void start(BundleContext context) throws Exception { - super.start(context); - - ComparePlugin.getDefault().setCappingDisabled( - getPreferenceStore().getBoolean( - ComparePreferencePage.CAPPING_DISABLED)); - } - - public void stop(BundleContext context) throws Exception { - - IPreferenceStore ps= getPreferenceStore(); - rememberAliases(ps); - if (fPropertyChangeListener != null) { - ps.removePropertyChangeListener(fPropertyChangeListener); - fPropertyChangeListener= null; - } - - super.stop(context); - - if (fgDisposeOnShutdownImages != null) { - Iterator i= fgDisposeOnShutdownImages.iterator(); - while (i.hasNext()) { - Image img= (Image) i.next(); - if (!img.isDisposed()) - img.dispose(); - } - fgImages= null; - } - } - - /** - * Returns the singleton instance of this plug-in runtime class. - * - * @return the compare plug-in instance - */ - public static CompareUIPlugin getDefault() { - return fgComparePlugin; - } - - /** - * Returns this plug-in's resource bundle. - * - * @return the plugin's resource bundle - */ - public ResourceBundle getResourceBundle() { - if (fResourceBundle == null) - fResourceBundle= Platform.getResourceBundle(getBundle()); - return fResourceBundle; - } - - /** - * Returns this plug-in's unique identifier. - * - * @return the plugin's unique identifier - */ - public static String getPluginId() { - return getDefault().getBundle().getSymbolicName(); - } - - private void initializeRegistries() { - if (!fRegistriesInitialized) { - registerExtensions(); - fRegistriesInitialized= true; - } - } - - /** - * Registers all stream mergers, structure creators, content merge viewers, and structure merge viewers - * that are found in the XML plugin files. - */ - private void registerExtensions() { - IExtensionRegistry registry= Platform.getExtensionRegistry(); - - // collect all IStreamMergers - IConfigurationElement[] elements= registry.getConfigurationElementsFor(PLUGIN_ID, STREAM_MERGER_EXTENSION_POINT); - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (STREAM_MERGER.equals(element.getName())) - fStreamMergers.register(element, new StreamMergerDescriptor(element)); - } - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (CONTENT_TYPE_BINDING.equals(element.getName())) - fStreamMergers.createBinding(element, STREAM_MERGER_ID_ATTRIBUTE); - } - - // collect all IStructureCreators - elements= registry.getConfigurationElementsFor(PLUGIN_ID, STRUCTURE_CREATOR_EXTENSION_POINT); - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - String name= element.getName(); - if (!CONTENT_TYPE_BINDING.equals(name)) { - if (!STRUCTURE_CREATOR.equals(name)) - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.unexpectedTag", name, STRUCTURE_CREATOR)); //$NON-NLS-1$ - fStructureCreators.register(element, new StructureCreatorDescriptor(element)); - } - } - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (CONTENT_TYPE_BINDING.equals(element.getName())) - fStructureCreators.createBinding(element, STRUCTURE_CREATOR_ID_ATTRIBUTE); - } - - // collect all viewers which define the structure merge viewer extension point - elements= registry.getConfigurationElementsFor(PLUGIN_ID, STRUCTURE_MERGE_VIEWER_EXTENSION_POINT); - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - String name= element.getName(); - if (!CONTENT_TYPE_BINDING.equals(name)) { - if (!VIEWER_TAG.equals(name)) - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.unexpectedTag", name, VIEWER_TAG)); //$NON-NLS-1$ - fStructureMergeViewers.register(element, new ViewerDescriptor(element)); - } - } - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (CONTENT_TYPE_BINDING.equals(element.getName())) - fStructureMergeViewers.createBinding(element, STRUCTURE_MERGE_VIEWER_ID_ATTRIBUTE); - } - - // collect all viewers which define the content merge viewer extension point - elements= registry.getConfigurationElementsFor(PLUGIN_ID, CONTENT_MERGE_VIEWER_EXTENSION_POINT); - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - String name= element.getName(); - if (!CONTENT_TYPE_BINDING.equals(name)) { - if (!VIEWER_TAG.equals(name)) - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.unexpectedTag", name, VIEWER_TAG)); //$NON-NLS-1$ - fContentMergeViewers.register(element, new ViewerDescriptor(element)); - } - } - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (CONTENT_TYPE_BINDING.equals(element.getName())) - fContentMergeViewers.createBinding(element, CONTENT_MERGE_VIEWER_ID_ATTRIBUTE); - } - - // collect all viewers which define the content viewer extension point - elements= registry.getConfigurationElementsFor(PLUGIN_ID, CONTENT_VIEWER_EXTENSION_POINT); - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - String name= element.getName(); - if (!CONTENT_TYPE_BINDING.equals(name)) { - if (!VIEWER_TAG.equals(name)) - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.unexpectedTag", name, VIEWER_TAG)); //$NON-NLS-1$ - fContentViewers.register(element, new ViewerDescriptor(element)); - } - } - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (CONTENT_TYPE_BINDING.equals(element.getName())) - fContentViewers.createBinding(element, CONTENT_VIEWER_ID_ATTRIBUTE); - } - } - - public static IWorkbench getActiveWorkbench() { - CompareUIPlugin plugin= getDefault(); - if (plugin == null) - return null; - return plugin.getWorkbench(); - } - - public static IWorkbenchWindow getActiveWorkbenchWindow() { - IWorkbench workbench= getActiveWorkbench(); - if (workbench == null) - return null; - return workbench.getActiveWorkbenchWindow(); - } - - /** - * Returns the active workbench page or <code>null</code> if - * no active workbench page can be determined. - * - * @return the active workbench page or <code>null</code> if - * no active workbench page can be determined - */ - private static IWorkbenchPage getActivePage() { - IWorkbenchWindow window= getActiveWorkbenchWindow(); - if (window == null) - return null; - return window.getActivePage(); - } - - /** - * Returns the SWT Shell of the active workbench window or <code>null</code> if - * no workbench window is active. - * - * @return the SWT Shell of the active workbench window, or <code>null</code> if - * no workbench window is active - */ - public static Shell getShell() { - IWorkbenchWindow window= getActiveWorkbenchWindow(); - if (window == null) - return null; - return window.getShell(); - } - - /** - * Registers the given image for being disposed when this plug-in is shutdown. - * - * @param image the image to register for disposal - */ - public static void disposeOnShutdown(Image image) { - if (image != null) - fgDisposeOnShutdownImages.add(image); - } - - /** - * Performs the comparison described by the given input and opens a compare - * editor on the result. - * - * @param input - * the input on which to open the compare editor - * @param page - * the workbench page on which to create a new compare editor - * @param editor - * if not null the input is opened in this editor - * @param activate - * if <code>true</code> the editor will be activated - * @see IWorkbenchPage#openEditor(org.eclipse.ui.IEditorInput, String, - * boolean) - * @see CompareEditorInput - */ - public void openCompareEditor(final CompareEditorInput input, - final IWorkbenchPage page, final IReusableEditor editor, - final boolean activate) { - CompareConfiguration configuration = input.getCompareConfiguration(); - if (configuration != null) { - IPreferenceStore ps= configuration.getPreferenceStore(); - if (ps != null) - configuration.setProperty( - CompareConfiguration.USE_OUTLINE_VIEW, - Boolean.valueOf(ps.getBoolean(ComparePreferencePage.USE_OUTLINE_VIEW))); - } - if (input.canRunAsJob()) { - openEditorInBackground(input, page, editor, activate); - } else { - if (compareResultOK(input, null)) { - internalOpenEditor(input, page, editor, activate); - } - } - } - - private void openEditorInBackground(final CompareEditorInput input, - final IWorkbenchPage page, final IReusableEditor editor, - final boolean activate) { - internalOpenEditor(input, page, editor, activate); - } - - private void internalOpenEditor(final CompareEditorInput input, - final IWorkbenchPage wp, final IReusableEditor editor, - final boolean activate) { - Runnable runnable = new Runnable() { - public void run() { - if (editor != null && !editor.getSite().getShell().isDisposed()) { // reuse the given editor - editor.setInput(input); - return; - } - - IWorkbenchPage page = wp; - if (page == null) - page= getActivePage(); - if (page != null) { - // open new CompareEditor on page - try { - page.openEditor(input, COMPARE_EDITOR, activate); - } catch (PartInitException e) { - MessageDialog.openError(getShell(), Utilities.getString("CompareUIPlugin.openEditorError"), e.getMessage()); //$NON-NLS-1$ - } - } else { - MessageDialog.openError(getShell(), - Utilities.getString("CompareUIPlugin.openEditorError"), //$NON-NLS-1$ - Utilities.getString("CompareUIPlugin.noActiveWorkbenchPage")); //$NON-NLS-1$ - } - } - }; - syncExec(runnable); - } - - /** - * Performs the comparison described by the given input and opens a - * compare dialog on the result. - * - * @param input the input on which to open the compare editor - * @see CompareEditorInput - */ - public void openCompareDialog(final CompareEditorInput input) { - // We don't ever open dialogs in the background - if (compareResultOK(input, null)) { - internalOpenDialog(input); - } - } - - public IStatus prepareInput(CompareEditorInput input, IProgressMonitor monitor) { - try { - input.run(monitor); - String message= input.getMessage(); - if (message != null) { - return new Status(IStatus.ERROR, CompareUIPlugin.PLUGIN_ID, 0, message, null); - } - if (input.getCompareResult() == null) { - return new Status(IStatus.ERROR, CompareUIPlugin.PLUGIN_ID, NO_DIFFERENCE, Utilities.getString("CompareUIPlugin.noDifferences"), null); //$NON-NLS-1$ - } - return Status.OK_STATUS; - } catch (InterruptedException e) { - throw new OperationCanceledException(); - } catch (InvocationTargetException e) { - return new Status(IStatus.ERROR, CompareUIPlugin.PLUGIN_ID, 0, Utilities.getString("CompareUIPlugin.compareFailed"), e.getTargetException()); //$NON-NLS-1$ - } - } - - /* - * @return <code>true</code> if compare result is OK to show, <code>false</code> otherwise - */ - public boolean compareResultOK(CompareEditorInput input, IRunnableContext context) { - final Shell shell= getShell(); - try { - - // run operation in separate thread and make it cancelable - if (context == null) - context = PlatformUI.getWorkbench().getProgressService(); - context.run(true, true, input); - - String message= input.getMessage(); - if (message != null) { - MessageDialog.openError(shell, Utilities.getString("CompareUIPlugin.compareFailed"), message); //$NON-NLS-1$ - return false; - } - - if (input.getCompareResult() == null) { - MessageDialog.openInformation(shell, Utilities.getString("CompareUIPlugin.dialogTitle"), Utilities.getString("CompareUIPlugin.noDifferences")); //$NON-NLS-2$ //$NON-NLS-1$ - return false; - } - - return true; - - } catch (InterruptedException x) { - // canceled by user - } catch (InvocationTargetException x) { - MessageDialog.openError(shell, Utilities.getString("CompareUIPlugin.compareFailed"), x.getTargetException().getMessage()); //$NON-NLS-1$ - } - return false; - } - - /* - * Registers an image for the given type. - */ - private static void registerImage(String type, Image image, boolean dispose) { - fgImages.put(normalizeCase(type), image); - if (image != null && dispose) { - fgDisposeOnShutdownImages.add(image); - } - } - - /** - * Registers an image descriptor for the given type. - * - * @param type the type - * @param descriptor the image descriptor - */ - public static void registerImageDescriptor(String type, ImageDescriptor descriptor) { - fgImageDescriptors.put(normalizeCase(type), descriptor); - } - - public static ImageDescriptor getImageDescriptor(String relativePath) { - if (fgComparePlugin == null) - return null; - IPath path= Utilities.getIconPath(null).append(relativePath); - URL url= FileLocator.find(fgComparePlugin.getBundle(), path, null); - if (url == null) - return null; - return ImageDescriptor.createFromURL(url); - } - - /** - * Returns a shared image for the given type, or a generic image if none - * has been registered for the given type. - * <p> - * Note: Images returned from this method will be automatically disposed - * of when this plug-in shuts down. Callers must not dispose of these - * images themselves. - * </p> - * - * @param type the type - * @return the image - */ - public static Image getImage(String type) { - - type= normalizeCase(type); - - boolean dispose= false; - Image image= null; - if (type != null) - image= (Image) fgImages.get(type); - if (image == null) { - ImageDescriptor id= (ImageDescriptor) fgImageDescriptors.get(type); - if (id != null) { - image= id.createImage(); - dispose= true; - } - - if (image == null) { - if (fgComparePlugin != null) { - if (ITypedElement.FOLDER_TYPE.equals(type)) { - image= getDefault().getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER); - //image= SharedImages.getImage(ISharedImages.IMG_OBJ_FOLDER); - } else { - image= createWorkbenchImage(type); - dispose= true; - } - } else { - id= (ImageDescriptor) fgImageDescriptors.get(normalizeCase("file")); //$NON-NLS-1$ - image= id.createImage(); - dispose= true; - } - } - if (image != null) - registerImage(type, image, dispose); - } - return image; - } - - /** - * Returns a shared image for the given adaptable. - * This convenience method queries the given adaptable - * for its <code>IWorkbenchAdapter.getImageDescriptor</code>, which it - * uses to create an image if it does not already have one. - * <p> - * Note: Images returned from this method will be automatically disposed - * of when this plug-in shuts down. Callers must not dispose of these - * images themselves. - * </p> - * - * @param adaptable the adaptable for which to find an image - * @return an image - */ - public static Image getImage(IAdaptable adaptable) { - if (adaptable != null) { - Object o= adaptable.getAdapter(IWorkbenchAdapter.class); - if (o instanceof IWorkbenchAdapter) { - ImageDescriptor id= ((IWorkbenchAdapter) o).getImageDescriptor(adaptable); - if (id != null) { - Image image= (Image)fgImages2.get(id); - if (image == null) { - image= id.createImage(); - try { - fgImages2.put(id, image); - } catch (NullPointerException ex) { - // NeedWork - } - fgDisposeOnShutdownImages.add(image); - - } - return image; - } - } - } - return null; - } - - private static Image createWorkbenchImage(String type) { - IEditorRegistry er= getDefault().getWorkbench().getEditorRegistry(); - ImageDescriptor id= er.getImageDescriptor("foo." + type); //$NON-NLS-1$ - return id.createImage(); - } - - /** - * Returns an structure creator descriptor for the given type. - * - * @param type the type for which to find a descriptor - * @return a descriptor for the given type, or <code>null</code> if no - * descriptor has been registered - */ - public StructureCreatorDescriptor getStructureCreator(String type) { - initializeRegistries(); - return (StructureCreatorDescriptor) fStructureCreators.search(type); - } - - /** - * Returns a stream merger for the given type. - * - * @param type the type for which to find a stream merger - * @return a stream merger for the given type, or <code>null</code> if no - * stream merger has been registered - */ - public IStreamMerger createStreamMerger(String type) { - initializeRegistries(); - StreamMergerDescriptor descriptor= (StreamMergerDescriptor) fStreamMergers.search(type); - if (descriptor != null) - return descriptor.createStreamMerger(); - return null; - } - - /** - * Returns a stream merger for the given content type. - * - * @param type the type for which to find a stream merger - * @return a stream merger for the given type, or <code>null</code> if no - * stream merger has been registered - */ - public IStreamMerger createStreamMerger(IContentType type) { - initializeRegistries(); - StreamMergerDescriptor descriptor= (StreamMergerDescriptor) fStreamMergers.search(type); - if (descriptor != null) - return descriptor.createStreamMerger(); - return null; - } - - public ViewerDescriptor[] findStructureViewerDescriptor(Viewer oldViewer, - ICompareInput input, CompareConfiguration configuration) { - if (input == null) - return null; - // we don't show the structure of additions or deletions - if (input == null || input.getLeft() == null || input.getRight() == null) - return null; - - Set result = new LinkedHashSet(); - - // content type search - IContentType ctype= getCommonType(input); - if (ctype != null) { - initializeRegistries(); - List list = fStructureMergeViewers.searchAll(ctype); - if (list != null) - result.addAll(list); - } - - // old style search - String[] types= getTypes(input); - String type= null; - if (isHomogenous(types)) { - type= normalizeCase(types[0]); - initializeRegistries(); - List list = fStructureMergeViewers.searchAll(type); - if (list != null) - result.addAll(list); - String alias= getStructureViewerAlias(type); - if (alias != null) { - list = fStructureMergeViewers.searchAll(alias); - if (list != null) - result.addAll(list); - } - } - - return result.size() > 0 ? (ViewerDescriptor[]) result - .toArray(new ViewerDescriptor[0]) : null; - } - - /** - * Returns a structure compare viewer based on an old viewer and an input object. - * If the old viewer is suitable for showing the input, the old viewer - * is returned. Otherwise, the input's type is used to find a viewer descriptor in the registry - * which in turn is used to create a structure compare viewer under the given parent composite. - * If no viewer descriptor can be found <code>null</code> is returned. - * - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a structure viewer - * @param parent the SWT parent composite under which the new viewer is created - * @param configuration a configuration which is passed to a newly created viewer - * @return the compare viewer which is suitable for the given input object or <code>null</code> - */ - public Viewer findStructureViewer(Viewer oldViewer, ICompareInput input, Composite parent, - CompareConfiguration configuration) { - ViewerDescriptor[] descriptors = findStructureViewerDescriptor(oldViewer, input, configuration); - if (descriptors == null || descriptors.length == 0) { - // we didn't found any viewer so far. - // now we try to find a structure creator for the generic StructureDiffViewer - IContentType ctype= getCommonType(input); - - String[] types= getTypes(input); - String type= null; - if (isHomogenous(types)) { - type= normalizeCase(types[0]); - } - - StructureCreatorDescriptor scc= null; - initializeRegistries(); - Object desc= fStructureCreators.search(ctype); // search for content type - if (desc instanceof StructureCreatorDescriptor) - scc= (StructureCreatorDescriptor) desc; - if (scc == null && type != null) - scc= getStructureCreator(type); // search for old-style type scheme - if (scc != null) { - IStructureCreator sc= scc.createStructureCreator(); - if (sc != null) { - StructureDiffViewer sdv= new StructureDiffViewer(parent, configuration); - sdv.setStructureCreator(sc); - return sdv; - } - } - return null; - } - return getViewer(descriptors[0], oldViewer, parent, configuration); - } - - public ViewerDescriptor[] findContentViewerDescriptor(Viewer oldViewer, Object in, CompareConfiguration cc) { - Set result = new LinkedHashSet(); - if (in instanceof IStreamContentAccessor) { - String type= ITypedElement.TEXT_TYPE; - - if (in instanceof ITypedElement) { - ITypedElement tin= (ITypedElement) in; - - IContentType ct= getContentType(tin); - if (ct != null) { - initializeRegistries(); - List list = fContentViewers.searchAll(ct); - if (list != null) - result.addAll(list); - } - - String ty= tin.getType(); - if (ty != null) - type= ty; - } - - initializeRegistries(); - List list = fContentViewers.searchAll(type); - if (list != null) - result.addAll(list); - // fallback - result.add(fContentViewers.search(Platform.getContentTypeManager().getContentType(IContentTypeManager.CT_TEXT))); - return (ViewerDescriptor[]) result.toArray(new ViewerDescriptor[0]); - } - - if (!(in instanceof ICompareInput)) - return null; - - ICompareInput input= (ICompareInput) in; - - IContentType ctype = getCommonType(input); - if (ctype != null) { - initializeRegistries(); - List list = fContentMergeViewers.searchAll(ctype); - if (list != null) - result.addAll(list); - } - - String[] types= getTypes(input); - String type= null; - if (isHomogenous(types)) - type= types[0]; - - if (ITypedElement.FOLDER_TYPE.equals(type)) - return null; - - if (type == null) { - int n= 0; - for (int i= 0; i < types.length; i++) - if (!ITypedElement.UNKNOWN_TYPE.equals(types[i])) { - n++; - if (type == null) - type= types[i]; // remember the first known type - } - if (n > 1) // don't use the type if there were more than one - type= null; - } - - if (type != null) { - initializeRegistries(); - List list = fContentMergeViewers.searchAll(type); - if (list != null) - result.addAll(list); - } - - // fallback - String leftType= guessType(input.getLeft()); - String rightType= guessType(input.getRight()); - - if (leftType != null || rightType != null) { - boolean right_text = rightType != null - && ITypedElement.TEXT_TYPE.equals(rightType); - boolean left_text = leftType != null - && ITypedElement.TEXT_TYPE.equals(leftType); - initializeRegistries(); - if ((rightType != null && !right_text) - || (leftType != null && !left_text)) { - List list = fContentMergeViewers.searchAll(BINARY_TYPE); - if (list != null) - result.addAll(list); - } - List list = fContentMergeViewers.searchAll(ITypedElement.TEXT_TYPE); - if (list != null) - result.addAll(list); - - return (ViewerDescriptor[]) result.toArray(new ViewerDescriptor[0]); - } - return null; - } - - /** - * Returns a content compare viewer based on an old viewer and an input object. - * If the old viewer is suitable for showing the input the old viewer - * is returned. Otherwise the input's type is used to find a viewer descriptor in the registry - * which in turn is used to create a content compare viewer under the given parent composite. - * If no viewer descriptor can be found <code>null</code> is returned. - * - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param in the input object for which to find a content viewer - * @param parent the SWT parent composite under which the new viewer is created - * @param cc a configuration which is passed to a newly created viewer - * @return the compare viewer which is suitable for the given input object or <code>null</code> - */ - public Viewer findContentViewer(Viewer oldViewer, Object in, - Composite parent, CompareConfiguration cc) { - ViewerDescriptor[] descriptors = findContentViewerDescriptor(oldViewer, in, cc); - return getViewer(descriptors != null ? descriptors[0] : null, oldViewer, parent, cc); - } - - private static Viewer getViewer(Object descriptor, Viewer oldViewer, Composite parent, CompareConfiguration cc) { - if (descriptor instanceof IViewerDescriptor) - return ((IViewerDescriptor)descriptor).createViewer(oldViewer, parent, cc); - return null; - } - - private static String[] getTypes(ICompareInput input) { - ITypedElement ancestor= input.getAncestor(); - ITypedElement left= input.getLeft(); - ITypedElement right= input.getRight(); - - ArrayList tmp= new ArrayList(); - if (ancestor != null) { - String type= ancestor.getType(); - if (type != null) - tmp.add(normalizeCase(type)); - } - if (left != null) { - String type= left.getType(); - if (type != null) - tmp.add(normalizeCase(type)); - } - if (right != null) { - String type= right.getType(); - if (type != null) - tmp.add(normalizeCase(type)); - } - return (String[]) tmp.toArray(new String[tmp.size()]); - } - - private static IContentType getContentType(ITypedElement element) { - if (element == null) - return null; - String name= element.getName(); - IContentType ct= null; - if (element instanceof IStreamContentAccessor) { - IStreamContentAccessor isa= (IStreamContentAccessor) element; - try { - InputStream is= isa.getContents(); - if (is != null) { - InputStream bis= new BufferedInputStream(is); - try { - ct= fgContentTypeManager.findContentTypeFor(is, name); - } catch (IOException e) { - // silently ignored - } finally { - try { - bis.close(); - } catch (IOException e2) { - // silently ignored - } - } - } - } catch (CoreException e1) { - // silently ignored - } - } - if (ct == null) - ct= fgContentTypeManager.findContentTypeFor(name); - return ct; - } - - /* - * Returns true if the given types are homogeneous. - */ - private static boolean isHomogenous(String[] types) { - switch (types.length) { - case 1: - return true; - case 2: - return types[0].equals(types[1]); - case 3: - return types[0].equals(types[1]) && types[1].equals(types[2]); - } - return false; - } - - /* - * Returns the most specific content type that is common to the given inputs or null. - */ - private static IContentType getCommonType(ICompareInput input) { - - ITypedElement ancestor= input.getAncestor(); - ITypedElement left= input.getLeft(); - ITypedElement right= input.getRight(); - - int n= 0; - IContentType[] types= new IContentType[3]; - IContentType type= null; - - if (ancestor != null) { - type= getContentType(ancestor); - if (type != null) - types[n++]= type; - } - type= getContentType(left); - if (type != null) - types[n++]= type; - else - return null; - type= getContentType(right); - if (type != null) - types[n++]= type; - else - return null; - - IContentType result= null; - IContentType[] s0, s1, s2; - switch (n) { - case 0: - return null; - case 1: - return types[0]; - case 2: - if (types[0].equals(types[1])) - return types[0]; - s0= toFullPath(types[0]); - s1= toFullPath(types[1]); - for (int i= 0; i < Math.min(s0.length, s1.length); i++) { - if (!s0[i].equals(s1[i])) - break; - result= s0[i]; - } - return result; - case 3: - if (types[0].equals(types[1]) && types[1].equals(types[2])) - return types[0]; - s0= toFullPath(types[0]); - s1= toFullPath(types[1]); - s2= toFullPath(types[2]); - for (int i= 0; i < Math.min(Math.min(s0.length, s1.length), s2.length); i++) { - if (!s0[i].equals(s1[i]) || !s1[i].equals(s2[i])) - break; - result= s0[i]; - } - return result; - } - return null; - } - - private static IContentType[] toFullPath(IContentType ct) { - List l= new ArrayList(); - for (; ct != null; ct= ct.getBaseType()) - l.add(0, ct); - return (IContentType[]) l.toArray(new IContentType[l.size()]); - } - - /* - * Guesses the file type of the given input. - * Returns ITypedElement.TEXT_TYPE if none of the first 10 lines is longer than 1000 bytes. - * Returns ITypedElement.UNKNOWN_TYPE otherwise. - * Returns <code>null</code> if the input isn't an <code>IStreamContentAccessor</code>. - */ - private static String guessType(ITypedElement input) { - if (input instanceof IStreamContentAccessor) { - IStreamContentAccessor sca= (IStreamContentAccessor) input; - InputStream is= null; - try { - is= sca.getContents(); - if (is == null) - return null; - int lineLength= 0; - int lines= 0; - while (lines < 10) { - int c= is.read(); - if (c == -1) // EOF - break; - if (c == '\n' || c == '\r') { // reset line length - lineLength= 0; - lines++; - } else - lineLength++; - if (lineLength > 1000) - return ITypedElement.UNKNOWN_TYPE; - } - return ITypedElement.TEXT_TYPE; - } catch (CoreException ex) { - // be silent and return UNKNOWN_TYPE - } catch (IOException ex) { - // be silent and return UNKNOWN_TYPE - } finally { - if (is != null) { - try { - is.close(); - } catch (IOException ex) { - // silently ignored - } - } - } - return ITypedElement.UNKNOWN_TYPE; - } - return null; - } - - private static String normalizeCase(String s) { - if (NORMALIZE_CASE && s != null) - return s.toUpperCase(); - return s; - } - - //---- alias management - - private String getStructureViewerAlias(String type) { - return (String) getStructureViewerAliases().get(type); - } - - public void addStructureViewerAlias(String type, String alias) { - getStructureViewerAliases().put(normalizeCase(alias), normalizeCase(type)); - } - - private Map getStructureViewerAliases() { - if (fStructureViewerAliases == null) { - fStructureViewerAliases= new Hashtable(10); - String aliases= getPreferenceStore().getString(STRUCTUREVIEWER_ALIASES_PREFERENCE_NAME); - if (aliases != null && aliases.length() > 0) { - StringTokenizer st= new StringTokenizer(aliases, " "); //$NON-NLS-1$ - while (st.hasMoreTokens()) { - String pair= st.nextToken(); - int pos= pair.indexOf('.'); - if (pos > 0) { - String key= pair.substring(0, pos); - String alias= pair.substring(pos+1); - fStructureViewerAliases.put(key, alias); - } - } - } - } - return fStructureViewerAliases; - } - - public void removeAllStructureViewerAliases(String type) { - if (fStructureViewerAliases == null) - return; - String t= normalizeCase(type); - Set entrySet= fStructureViewerAliases.entrySet(); - for (Iterator iter= entrySet.iterator(); iter.hasNext(); ) { - Map.Entry entry= (Map.Entry)iter.next(); - if (entry.getValue().equals(t)) - iter.remove(); - } - } - - /* - * Converts the aliases into a single string before they are stored - * in the preference store. - * The format is: - * <key> '.' <alias> ' ' <key> '.' <alias> ... - */ - private void rememberAliases(IPreferenceStore ps) { - if (fStructureViewerAliases == null) - return; - StringBuffer buffer= new StringBuffer(); - Iterator iter= fStructureViewerAliases.keySet().iterator(); - while (iter.hasNext()) { - String key= (String) iter.next(); - String alias= (String) fStructureViewerAliases.get(key); - buffer.append(key); - buffer.append('.'); - buffer.append(alias); - buffer.append(' '); - } - ps.setValue(STRUCTUREVIEWER_ALIASES_PREFERENCE_NAME, buffer.toString()); - } - - //---- filters - - public boolean filter(String name, boolean isFolder, boolean isArchive) { - if (fFilter == null) { - fFilter= new CompareFilter(); - final IPreferenceStore ps= getPreferenceStore(); - fFilter.setFilters(ps.getString(ComparePreferencePage.PATH_FILTER)); - fPropertyChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - if (ComparePreferencePage.PATH_FILTER.equals(event.getProperty())) - fFilter.setFilters(ps.getString(ComparePreferencePage.PATH_FILTER)); - } - }; - ps.addPropertyChangeListener(fPropertyChangeListener); - } - return fFilter.filter(name, isFolder, isArchive); - } - - private void internalOpenDialog(final CompareEditorInput input) { - Runnable runnable = new Runnable() { - public void run() { - CompareDialog dialog= new CompareDialog(getShell(), input); - dialog.open(); - } - }; - syncExec(runnable); - } - - private void syncExec(Runnable runnable) { - if (Display.getCurrent() == null) { - Display.getDefault().syncExec(runnable); - } else { - runnable.run(); - } - } - - //---- more utilities - - protected void handleNoDifference() { - Runnable runnable = new Runnable() { - public void run() { - MessageDialog.openInformation(getShell(), Utilities.getString("CompareUIPlugin.dialogTitle"), Utilities.getString("CompareUIPlugin.noDifferences")); //$NON-NLS-1$//$NON-NLS-2$ - } - }; - syncExec(runnable); - } - - /** - * Returns an array of all editors that have an unsaved content. If the identical content is - * presented in more than one editor, only one of those editor parts is part of the result. - * - * @return an array of all dirty editor parts. - */ - public static IEditorPart[] getDirtyEditors() { - Set inputs= new HashSet(); - List result= new ArrayList(0); - IWorkbench workbench= getDefault().getWorkbench(); - IWorkbenchWindow[] windows= workbench.getWorkbenchWindows(); - for (int i= 0; i < windows.length; i++) { - IWorkbenchPage[] pages= windows[i].getPages(); - for (int x= 0; x < pages.length; x++) { - IEditorPart[] editors= pages[x].getDirtyEditors(); - for (int z= 0; z < editors.length; z++) { - IEditorPart ep= editors[z]; - IEditorInput input= ep.getEditorInput(); - if (!inputs.contains(input)) { - inputs.add(input); - result.add(ep); - } - } - } - } - return (IEditorPart[])result.toArray(new IEditorPart[result.size()]); - } - - public static void logErrorMessage(String message) { - if (message == null) - message= ""; //$NON-NLS-1$ - log(new Status(IStatus.ERROR, getPluginId(), INTERNAL_ERROR, message, null)); - } - - public static void log(Throwable e) { - log(new Status(IStatus.ERROR, getPluginId(), INTERNAL_ERROR, CompareMessages.ComparePlugin_internal_error, e)); - } - - public static void log(IStatus status) { - getDefault().getLog().log(status); - } - - String findContentTypeNameOrType(ICompareInput input, ViewerDescriptor vd, CompareConfiguration cc) { - IContentType ctype= getCommonType(input); - if (ctype != null) { - initializeRegistries(); - List list = fContentMergeViewers.searchAll(ctype); - if (list != null) - if (list.contains(vd)) - return ctype.getName(); - } - - String[] types= getTypes(input); - String type= null; - if (isHomogenous(types)) - type= types[0]; - - if (ITypedElement.FOLDER_TYPE.equals(type)) - return null; - - if (type == null) { - int n= 0; - for (int i= 0; i < types.length; i++) - if (!ITypedElement.UNKNOWN_TYPE.equals(types[i])) { - n++; - if (type == null) - type= types[i]; // remember the first known type - } - if (n > 1) // don't use the type if there were more than one - type= null; - } - - if (type != null) { - initializeRegistries(); - List list = fContentMergeViewers.searchAll(type); - if (list != null) - if (list.contains(vd)) - return type; - } - - // fallback - String leftType= guessType(input.getLeft()); - String rightType= guessType(input.getRight()); - - if (leftType != null || rightType != null) { - boolean right_text = rightType != null - && ITypedElement.TEXT_TYPE.equals(rightType); - boolean left_text = leftType != null - && ITypedElement.TEXT_TYPE.equals(leftType); - initializeRegistries(); - if ((rightType != null && !right_text) - || (leftType != null && !left_text)) { - List list = fContentMergeViewers.searchAll(BINARY_TYPE); - if (list != null) - if (list.contains(vd)) - return type; - } - List list = fContentMergeViewers.searchAll(ITypedElement.TEXT_TYPE); - if (list != null) - if (list.contains(vd)) - return type; - } - return null; - } - - String findStructureTypeNameOrType(ICompareInput input, ViewerDescriptor vd, CompareConfiguration cc) { - if (input == null) - return null; - // we don't show the structure of additions or deletions - if (input == null || input.getLeft() == null || input.getRight() == null) - return null; - - // content type search - IContentType ctype= getCommonType(input); - if (ctype != null) { - initializeRegistries(); - List list = fStructureMergeViewers.searchAll(ctype); - if (list != null) - if (list.contains(vd)) - return ctype.getName(); - } - - // old style search - String[] types= getTypes(input); - String type= null; - if (isHomogenous(types)) { - type= normalizeCase(types[0]); - initializeRegistries(); - List list = fStructureMergeViewers.searchAll(type); - if (list != null) - if (list.contains(vd)) - return type; - String alias= getStructureViewerAlias(type); - if (alias != null) { - list = fStructureMergeViewers.searchAll(alias); - if (list != null) - if (list.contains(vd)) - return alias; - } - } - - return null; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.java deleted file mode 100644 index 771aef90e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.java +++ /dev/null @@ -1,20 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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; - -public class CompareWithEditionAction extends EditionAction { - - public CompareWithEditionAction() { - super(false, "org.eclipse.compare.internal.CompareWithEditionAction"); //$NON-NLS-1$ - this.fHelpContextId= ICompareContextIds.COMPARE_WITH_EDITION_DIALOG; - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.properties deleted file mode 100644 index ad6aec79f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.properties +++ /dev/null @@ -1,38 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2006 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 -############################################################################### - -# @(#)CompareWithEditionAction.properties -# -# Resources for CompareWithEditionAction.java - -title= Compare with Local History - -treeTitleFormat= Local History of ''{0}'' -dateIcon= obj16/day_obj.gif -timeIcon= obj16/resource_obj.gif - -treeFormat= {0} -workspaceTreeFormat= {0} (Workspace File) -parseErrorFormat= {0} (Parse Error) - -editionLabel= Local History ({0}) -workspaceEditionLabel= Workspace File - -targetLabel= Editor Buffer -workspaceTargetLabel= Workspace File - -todayFormat= Today ({0}) -yesterdayFormat= Yesterday ({0}) -dayFormat= {0} - -closeButton.label=Close - -noLocalHistoryError= No local history available for selected resource. diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithOtherResourceAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithOtherResourceAction.java deleted file mode 100644 index e6899c1bf..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithOtherResourceAction.java +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Aleksandra Wozniak 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: - * Aleksandra Wozniak (aleksandra.k.wozniak@gmail.com) - initial implementation - * IBM Corporation - maintenance - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; - -/** - * The "Compare with other resource" action. - * - * @deprecated Temporarily replaced by CompareWithOtherResourceHandler. See bug - * 264498. - */ -public class CompareWithOtherResourceAction extends CompareAction { - - public void run(ISelection selection) { - // Show CompareWithOtherResourceDialog which return resources to compare - // and ancestor if specified. Don't need to display the other dialog - showSelectAncestorDialog = false; - super.run(selection); - } - - protected boolean isEnabled(ISelection selection) { - int selectionSize = 0; - if (selection instanceof IStructuredSelection) { - selectionSize = ((IStructuredSelection) selection).toArray().length; - } - // enable for a single selection - return super.isEnabled(selection) || selectionSize == 1; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithOtherResourceDialog.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithOtherResourceDialog.java deleted file mode 100644 index b5debc26f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithOtherResourceDialog.java +++ /dev/null @@ -1,838 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Aleksandra Wozniak 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: - * Aleksandra Wozniak (aleksandra.k.wozniak@gmail.com) - initial implementation - * IBM Corporation - Bug 73923 (major refactoring and adjustments) - * IBM Corporation - Bug 241649 - [Dialogs] Resizing of the "compare with other" dialog - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.io.FileOutputStream; -import java.io.IOException; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareUI; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IFolder; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IProjectDescription; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IWorkspaceRoot; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.IMessageProvider; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.dialogs.TitleAreaDialog; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.swt.SWT; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.DragSource; -import org.eclipse.swt.dnd.DragSourceEvent; -import org.eclipse.swt.dnd.DragSourceListener; -import org.eclipse.swt.dnd.DropTarget; -import org.eclipse.swt.dnd.DropTargetEvent; -import org.eclipse.swt.dnd.DropTargetListener; -import org.eclipse.swt.dnd.TextTransfer; -import org.eclipse.swt.dnd.Transfer; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.DirectoryDialog; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.forms.events.ExpansionAdapter; -import org.eclipse.ui.forms.events.ExpansionEvent; -import org.eclipse.ui.forms.widgets.ExpandableComposite; -import org.eclipse.ui.part.ResourceTransfer; - -/** - * This is a dialog that can invoke the compare editor on chosen files. - */ -public class CompareWithOtherResourceDialog extends TitleAreaDialog { - - private int MIN_WIDTH = 320; - private int MIN_HEIGHT_WITH_ANCESTOR = 320; - private int MIN_HEIGHT_WITHOUT_ANCESTOR = 238; - - private class FileTextDragListener implements DragSourceListener { - - private ContentTypeElement element; - - public FileTextDragListener(ContentTypeElement element) { - this.element = element; - } - - public void dragFinished(DragSourceEvent event) { - element.setText(""); //$NON-NLS-1$ - } - - public void dragSetData(DragSourceEvent event) { - event.data = element.getText(); - } - - public void dragStart(DragSourceEvent event) { - if (element.getText() == null) - event.doit = false; - } - } - - private class FileTextDropListener implements DropTargetListener { - - private ContentTypeElement element; - private ResourceTransfer resourceTransfer; - private TextTransfer textTransfer; - - public FileTextDropListener(ContentTypeElement element) { - this.element = element; - resourceTransfer = ResourceTransfer.getInstance(); - textTransfer = TextTransfer.getInstance(); - } - - public void dragEnter(DropTargetEvent event) { - - if (event.detail == DND.DROP_DEFAULT) { - if ((event.operations & DND.DROP_COPY) != 0) - event.detail = DND.DROP_COPY; - else - event.detail = DND.DROP_NONE; - } - - for (int i = 0; i < event.dataTypes.length; i++) { - if (resourceTransfer.isSupportedType(event.dataTypes[i]) - || textTransfer.isSupportedType(event.dataTypes[i])) { - event.currentDataType = event.dataTypes[i]; - if (event.detail != DND.DROP_COPY) - event.detail = DND.DROP_NONE; - break; - } - } - } - - public void dragLeave(DropTargetEvent event) { - // intentionally empty - } - - public void dragOperationChanged(DropTargetEvent event) { - - if (event.detail == DND.DROP_DEFAULT) { - if ((event.operations & DND.DROP_COPY) != 0) - event.detail = DND.DROP_COPY; - else - event.detail = DND.DROP_NONE; - } else if (resourceTransfer.isSupportedType(event.currentDataType)) { - if (event.detail != DND.DROP_COPY) - event.detail = DND.DROP_NONE; - } - } - - public void dragOver(DropTargetEvent event) { - // intentionally empty - } - - public void drop(DropTargetEvent event) { - - if (textTransfer.isSupportedType(event.currentDataType)) { - String txt = (String) event.data; - IResource r = ResourcesPlugin.getWorkspace().getRoot().findMember(txt); - if (r != null) - element.setResource(r); - } else if (resourceTransfer.isSupportedType(event.currentDataType)) { - IResource[] files = (IResource[]) event.data; - if (files.length > 0) - element.setResource(files[0]); - } - - } - - public void dropAccept(DropTargetEvent event) { - // intentionally empty - } - - } - - private abstract class ContentTypeElement { - - private Button radioButton; - protected Button mainButton; - protected Text text; - private String type; - protected InternalSection section; - private IResource resource; - - public ContentTypeElement(Composite parent, String type, InternalSection section) { - this.type = type; - this.section = section; - createContents(parent); - } - - private void createContents(Composite parent) { - createRadioButton(parent); - createText(parent); - createMainButton(parent); - } - - private void createRadioButton(Composite parent) { - radioButton = new Button(parent, SWT.RADIO); - radioButton.setText(type); - } - - protected void createText(Composite parent) { - text = new Text(parent, SWT.BORDER); - text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - text.setEditable(false); - } - - protected void createMainButton(Composite parent) { - mainButton = new Button(parent, SWT.PUSH); - mainButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); - } - - protected Button getRadioButton() { - return radioButton; - } - - protected String getText() { - return text.getText(); - } - - protected void setText(String string) { - text.setText(string); - } - - protected void setEnabled(boolean enabled) { - radioButton.setSelection(enabled); - mainButton.setEnabled(enabled); - text.setEnabled(enabled); - } - - protected void setResource(IResource resource) { - this.resource = resource; - section.setResource(resource); - } - - public IResource getResource() { - return resource; - } - - void clearResource() { - resource = null; - text.setText(""); //$NON-NLS-1$ - } - - } - - private class WorkspaceContent extends ContentTypeElement { - - public WorkspaceContent(Composite parent, InternalSection section) { - super(parent, CompareMessages.CompareWithOtherResourceDialog_workspaceRadioButton, section); - } - - protected void createMainButton(Composite parent) { - super.createMainButton(parent); - mainButton.setText(CompareMessages.CompareWithOtherResourceDialog_workspaceMainButton); - // temporarily hide this button. For more information about supporting for browsing workspace see bug 243744. - mainButton.setVisible(false); - } - - protected void createText(Composite parent) { - - super.createText(parent); - text.setEditable(true); - - text.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent e) { - section.setResource(text.getText()); - updateErrorInfo(); - } - }); - - text.addSelectionListener(new SelectionListener() { - public void widgetDefaultSelected(SelectionEvent e) { - widgetSelected(e); - } - public void widgetSelected(SelectionEvent e) { - section.setResource(text.getText()); - updateErrorInfo(); - } - }); - - initDrag(); - initDrop(); - } - - protected void setResource(IResource resource) { - super.setResource(resource); - text.setText(resource.getFullPath().toOSString()); - } - - protected void initDrag() { - DragSource source = new DragSource(text, DND.DROP_MOVE - | DND.DROP_COPY | DND.DROP_DEFAULT); - Transfer[] types = new Transfer[] { TextTransfer.getInstance(), - ResourceTransfer.getInstance() }; - source.setTransfer(types); - source.addDragListener(new FileTextDragListener(this)); - } - - protected void initDrop() { - DropTarget target = new DropTarget(text, DND.DROP_MOVE - | DND.DROP_COPY | DND.DROP_DEFAULT); - Transfer[] types = new Transfer[] { TextTransfer.getInstance(), - ResourceTransfer.getInstance() }; - target.setTransfer(types); - target.addDropListener(new FileTextDropListener(this)); - } - - } - - private class ExternalFileContent extends ContentTypeElement { - - public ExternalFileContent(Composite parent, InternalSection section) { - super(parent, CompareMessages.CompareWithOtherResourceDialog_externalFileRadioButton, section); - } - - protected void createMainButton(Composite parent) { - super.createMainButton(parent); - mainButton.setText(CompareMessages.CompareWithOtherResourceDialog_externalFileMainButton); - mainButton.addSelectionListener(new SelectionListener() { - public void widgetDefaultSelected(SelectionEvent e) { - widgetSelected(e); - } - public void widgetSelected(SelectionEvent e) { - IResource r = tmpProject.getExternalFile(); - if (r == null) - return; - setResource(r); - } - }); - } - - protected void setResource(IResource resource) { - super.setResource(resource); - text.setText(resource.getLocation().toOSString()); - } - - } - - private class ExternalFolderContent extends ContentTypeElement { - - public ExternalFolderContent(Composite parent, InternalSection section) { - super(parent, CompareMessages.CompareWithOtherResourceDialog_externalFolderRadioButton, section); - } - - protected void createMainButton(Composite parent) { - super.createMainButton(parent); - mainButton.setText(CompareMessages.CompareWithOtherResourceDialog_externalFolderMainButton); - mainButton.addSelectionListener(new SelectionListener() { - public void widgetDefaultSelected(SelectionEvent e) { - widgetSelected(e); - } - public void widgetSelected(SelectionEvent e) { - IResource r = tmpProject.getExternalFolder(); - if (r == null) - return; - setResource(r); - } - }); - } - - protected void setResource(IResource resource) { - super.setResource(resource); - text.setText(resource.getLocation().toOSString()); - } - - } - - private abstract class InternalSection { - - // there is no "enum" support in Java 1.4. Sigh... - public static final int WORKSPACE = 0; - public static final int EXTERNAL_FILE = 1; - public static final int EXTERNAL_FOLDER = 2; - - protected Group group; - private IResource resource; - - ExternalFileContent externalFileContent; - ExternalFolderContent externalFolderContent; - WorkspaceContent workspaceContent; - - private InternalSection() { - // not to instantiate - } - - protected void createContents(Composite parent) { - - group = new Group(parent, SWT.NONE); - group.setLayout(new GridLayout(3, false)); - group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - - workspaceContent = new WorkspaceContent(group, this); - externalFileContent = new ExternalFileContent(group, this); - externalFolderContent = new ExternalFolderContent(group, this); - - addListenersToRadioButtons(); - } - - private void addListenersToRadioButtons() { - final ContentTypeElement[] elements = new ContentTypeElement[] { workspaceContent, - externalFileContent, externalFolderContent }; - for (int i = 0; i < elements.length; i++) { - elements[i].getRadioButton().addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - for (int j = 0; j < elements.length; j++) { - if (event.widget != elements[j].getRadioButton()) - elements[j].setEnabled(false); - else { - elements[j].setEnabled(true); - setResource(elements[j].getResource()); - } - } - } - }); - } - } - - protected IResource getResource() { - return resource; - } - - protected void setResource(IResource resource) { - this.resource = resource; - updateErrorInfo(); - } - - protected void setResource(String s) { - IResource tmp = ResourcesPlugin.getWorkspace().getRoot() - .findMember(s); - if (tmp instanceof IWorkspaceRoot) - resource = null; - else - resource = tmp; - updateErrorInfo(); - } - - protected void clearResource() { - resource = null; - workspaceContent.clearResource(); - externalFileContent.clearResource(); - externalFolderContent.clearResource(); - updateErrorInfo(); - } - - protected void setContentType(int type) { - switch(type) { - case WORKSPACE: - workspaceContent.setEnabled(true); - externalFileContent.setEnabled(false); - externalFolderContent.setEnabled(false); - break; - case EXTERNAL_FILE: - workspaceContent.setEnabled(false); - externalFileContent.setEnabled(true); - externalFolderContent.setEnabled(false); - break; - case EXTERNAL_FOLDER: - workspaceContent.setEnabled(false); - externalFileContent.setEnabled(false); - externalFolderContent.setEnabled(true); - } - } - } - - private class InternalGroup extends InternalSection { - - public InternalGroup(Composite parent) { - createContents(parent); - } - - public void setText(String text) { - group.setText(text); - } - - public void setLayoutData(GridData layoutData) { - group.setLayoutData(layoutData); - } - } - - private class InternalExpandable extends InternalSection { - - private ExpandableComposite expandable; - private Button clearButton; - - public InternalExpandable(Composite parent) { - createContents(parent); - } - - protected void createContents(Composite parent) { - final Composite p = parent; - expandable = new ExpandableComposite(parent, SWT.NONE, - ExpandableComposite.TREE_NODE | ExpandableComposite.TWISTIE); - super.createContents(expandable); - createClearButton(group); - expandable.setClient(group); - expandable.addExpansionListener(new ExpansionAdapter() { - public void expansionStateChanged(ExpansionEvent e) { - p.layout(); - adjustSize(e.getState()); - } - }); - } - - private void createClearButton(Composite parent) { - clearButton = new Button(parent, SWT.PUSH); - clearButton.setText(CompareMessages.CompareWithOtherResourceDialog_clear); - clearButton.addSelectionListener(new SelectionListener() { - public void widgetDefaultSelected(SelectionEvent e) { - widgetSelected(e); - } - public void widgetSelected(SelectionEvent e) { - clearResource(); - } - }); - } - - public void setText(String text) { - expandable.setText(text); - group.setText(text); - } - - public void setLayoutData(GridData layoutData) { - expandable.setLayoutData(layoutData); - } - } - - private class ExternalResourcesProject { - - // Implementation based on org.eclipse.jdt.internal.core.ExternalFoldersManager - - private int counter = 0; - - private static final String TMP_PROJECT_NAME = ".org.eclipse.compare.tmp"; //$NON-NLS-1$ - - private final static String TMP_PROJECT_FILE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" //$NON-NLS-1$ - + "<projectDescription>\n" //$NON-NLS-1$ - + "\t<name>" + TMP_PROJECT_NAME + "\t</name>\n" //$NON-NLS-1$ //$NON-NLS-2$ - + "\t<comment></comment>\n" //$NON-NLS-1$ - + "\t<projects>\n" //$NON-NLS-1$ - + "\t</projects>\n" //$NON-NLS-1$ - + "\t<buildSpec>\n" //$NON-NLS-1$ - + "\t</buildSpec>\n" //$NON-NLS-1$ - + "\t<natures>\n" + "\t</natures>\n" //$NON-NLS-1$//$NON-NLS-2$ - + "</projectDescription>"; //$NON-NLS-1$ - - private final static String TMP_FOLDER_NAME = "tmpFolder"; //$NON-NLS-1$ - - private ExternalResourcesProject() { - // nothing to do here - } - - private IProject createTmpProject() throws CoreException { - IProject project = getTmpProject(); - if (!project.isAccessible()) { - try { - IPath stateLocation = CompareUI.getPlugin().getStateLocation(); - if (!project.exists()) { - IProjectDescription desc = project.getWorkspace() - .newProjectDescription(project.getName()); - desc.setLocation(stateLocation.append(TMP_PROJECT_NAME)); - project.create(desc, null); - } - try { - project.open(null); - } catch (CoreException e) { // in case .project file or folder has been deleted - IPath projectPath = stateLocation.append(TMP_PROJECT_NAME); - projectPath.toFile().mkdirs(); - FileOutputStream output = new FileOutputStream( - projectPath.append(".project").toOSString()); //$NON-NLS-1$ - try { - output.write(TMP_PROJECT_FILE.getBytes()); - } finally { - output.close(); - } - project.open(null); - } - getTmpFolder(project); - } catch (IOException ioe) { - return project; - } catch (CoreException ce) { - throw new CoreException(ce.getStatus()); - } - } - project.setHidden(true); - return project; - } - - private IFolder getTmpFolder(IProject project) throws CoreException { - IFolder folder = project.getFolder(TMP_FOLDER_NAME); - if (!folder.exists()) - folder.create(IResource.NONE, true, null); - return folder; - } - - private IFile getExternalFile() { - FileDialog dialog = new FileDialog(getShell()); - String path = dialog.open(); - if (path != null) - return (IFile) linkResource(new Path(path)); - return null; - } - - private IFolder getExternalFolder() { - DirectoryDialog dialog = new DirectoryDialog(getShell()); - String path = dialog.open(); - if (path != null) - return (IFolder) linkResource(new Path(path)); - return null; - } - - private IResource linkResource(IPath path) { - IResource r = null; - String resourceName = path.lastSegment(); - try { - IProject project = createTmpProject(); - if (!project.isOpen()) - project.open(null); - if (path.toFile().isFile()) { - r = getTmpFolder(project).getFile(resourceName); - if (r.exists()) { // add a number to file's name when there already is a file with that name in a folder - String extension = path.getFileExtension(); - String fileName = path.removeFileExtension().lastSegment(); - r = getTmpFolder(project).getFile(getName(fileName, extension)); - } - ((IFile)r).createLink(path, IResource.REPLACE, null); - } else { // isDirectory - r = getTmpFolder(project).getFolder(resourceName); - if (r.exists()) { - r = getTmpFolder(project).getFolder(getName(resourceName, null)); - } - ((IFolder)r).createLink(path, IResource.REPLACE, null); - } - } catch (CoreException e) { - CompareUIPlugin.log(e); - MessageDialog.openError(getShell(), - CompareMessages.CompareWithOtherResourceDialog_externalFile_errorTitle, - CompareMessages.CompareWithOtherResourceDialog_externalFile_errorMessage); - } - return r; - } - - /** - * This method is used to prevent duplicating names of linked resources. - * It adds a suffix based on the <code>counter</code> value. - * - * @param name - * @param extension optional - * @return - */ - private String getName(String name, String extension) { - if (counter != 0) { - name = name + "-" + counter; //$NON-NLS-1$ - } - // at most 3 resources at the same time with the same name: - // left, right, ancestor - counter = (counter + 1) % 3; - if (extension != null) { - name += "." + extension; //$NON-NLS-1$ - } - // don't change the name if counter equals 0 - return name; - } - - private IProject getTmpProject() { - return ResourcesPlugin.getWorkspace().getRoot().getProject( - TMP_PROJECT_NAME); - } - } - - private Button okButton; - private InternalGroup rightPanel, leftPanel; - private InternalExpandable ancestorPanel; - private ISelection selection; - private ExternalResourcesProject tmpProject = new ExternalResourcesProject(); - - /** - * Creates the dialog. - * - * @param shell - * a shell - * @param selection - * if the selection is not null, it will be set as initial files - * for comparison - * @since 3.4 - */ - protected CompareWithOtherResourceDialog(Shell shell, ISelection selection) { - super(shell); - setShellStyle(SWT.MODELESS | SWT.RESIZE | SWT.MAX); - this.selection = selection; - } - - /* - * (non-Javadoc) - * - * @see - * org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets - * .Composite) - */ - protected Control createDialogArea(Composite parent) { - - Composite mainPanel = new Composite(parent, SWT.NULL); - mainPanel.setLayout(new GridLayout(1, true)); - mainPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - - ancestorPanel = new InternalExpandable(mainPanel); - ancestorPanel.setText(CompareMessages.CompareWithOtherResourceDialog_ancestor); - GridData ancestorGD = new GridData(SWT.FILL, SWT.FILL, true, false); - ancestorPanel.setLayoutData(ancestorGD); - - leftPanel = new InternalGroup(mainPanel); - leftPanel.setText(CompareMessages.CompareWithOtherResourceDialog_leftPanel); - leftPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - - rightPanel = new InternalGroup(mainPanel); - rightPanel.setText(CompareMessages.CompareWithOtherResourceDialog_rightPanel); - rightPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - - setSelection(selection); - getShell().setText(CompareMessages.CompareWithOtherResourceDialog_dialogTitle); - setTitle(CompareMessages.CompareWithOtherResourceDialog_dialogMessage); - adjustSize(ancestorPanel.expandable.isExpanded()); - - return mainPanel; - } - - private void adjustSize(boolean expanded) { - int minWidth = convertHorizontalDLUsToPixels(MIN_WIDTH); - int minHeight = convertVerticalDLUsToPixels(expanded ? MIN_HEIGHT_WITH_ANCESTOR - : MIN_HEIGHT_WITHOUT_ANCESTOR); - getShell().setMinimumSize(minWidth, minHeight); - } - - /* - * (non-Javadoc) - * - * @see - * org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse - * .swt.widgets.Composite) - */ - protected void createButtonsForButtonBar(Composite parent) { - super.createButtonsForButtonBar(parent); - okButton = getButton(IDialogConstants.OK_ID); - updateErrorInfo(); - setMessage(CompareMessages.CompareWithOtherResourceDialog_info); - } - - private void setSelection(ISelection selection) { - IResource[] selectedResources = Utilities.getResources(selection); - switch (selectedResources.length) { - case 1: - leftPanel.workspaceContent.setResource(selectedResources[0]); - break; - case 2: - leftPanel.workspaceContent.setResource(selectedResources[0]); - rightPanel.workspaceContent.setResource(selectedResources[1]); - break; - case 3: - ancestorPanel.workspaceContent.setResource(selectedResources[0]); - ancestorPanel.expandable.setExpanded(true); - leftPanel.workspaceContent.setResource(selectedResources[1]); - rightPanel.workspaceContent.setResource(selectedResources[2]); - break; - } - setInitialContentTypes(); - } - - private void setInitialContentTypes() { - ancestorPanel.setContentType(InternalSection.WORKSPACE); - leftPanel.setContentType(InternalSection.WORKSPACE); - rightPanel.setContentType(InternalSection.WORKSPACE); - } - - private boolean isComparePossible() { - IResource[] resources; - if (ancestorPanel.getResource() == null) - resources = new IResource[] { leftPanel.getResource(), - rightPanel.getResource() }; - else - resources = new IResource[] { ancestorPanel.getResource(), - leftPanel.getResource(), rightPanel.getResource() }; - - ResourceCompareInput r = new ResourceCompareInput( - new CompareConfiguration()); - return r.isEnabled(new StructuredSelection(resources)); - } - - private void updateErrorInfo() { - if (okButton != null) { - if (leftPanel.getResource() == null - || rightPanel.getResource() == null) { - setMessage(CompareMessages.CompareWithOtherResourceDialog_error_empty, - IMessageProvider.ERROR); - okButton.setEnabled(false); - } else if (!isComparePossible()) { - setMessage( - CompareMessages.CompareWithOtherResourceDialog_error_not_comparable, - IMessageProvider.ERROR); - okButton.setEnabled(false); - } else { - setMessage(CompareMessages.CompareWithOtherResourceDialog_info); - okButton.setEnabled(true); - } - } - } - - /** - * Returns table with selected resources. If any resource wasn't chosen in - * the ancestor panel, table has only two elements -- resources chosen in - * left and right panel. In the other case table contains all three - * resources. - * - * @return table with selected resources - */ - public IResource[] getResult() { - IResource[] resources; - IResource rightResource = rightPanel.getResource(); - IResource leftResource = leftPanel.getResource(); - IResource ancestorResource = ancestorPanel.getResource(); - if (ancestorResource == null) - resources = new IResource[] { leftResource, rightResource }; - else - resources = new IResource[] { ancestorResource, leftResource, - rightResource }; - return resources; - } - - /* - * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings() - */ - protected IDialogSettings getDialogBoundsSettings() { - String sectionName = getClass().getName() + "_dialogBounds"; //$NON-NLS-1$ - IDialogSettings settings = CompareUIPlugin.getDefault() - .getDialogSettings(); - IDialogSettings section = settings.getSection(sectionName); - if (section == null) - section = settings.addNewSection(sectionName); - return section; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithOtherResourceHandler.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithOtherResourceHandler.java deleted file mode 100644 index 43a55ee83..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithOtherResourceHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************* - * Copyright (c) 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.internal; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareUI; -import org.eclipse.core.commands.AbstractHandler; -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.handlers.HandlerUtil; - -/** - * This is a temporary replacement for CompareWithOtherResourceAction which was - * available from "Compare With > Other Resource...". See bug 264498. - */ -public class CompareWithOtherResourceHandler extends AbstractHandler { - - public Object execute(ExecutionEvent event) throws ExecutionException { - ISelection selection = HandlerUtil.getCurrentSelection(event); - IWorkbenchPage workbenchPage = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage(); - - // CompareAction#isEnabled(ISelection) - CompareConfiguration cc = new CompareConfiguration(); - cc.setProperty(CompareEditor.CONFIRM_SAVE_PROPERTY, new Boolean(false)); - ResourceCompareInput input = new ResourceCompareInput(cc); - - int selectionSize = 0; - if (selection instanceof IStructuredSelection) { - selectionSize = ((IStructuredSelection) selection).toArray().length; - } - if (input.isEnabled(selection) || selectionSize == 1) { - - // CompareAction#run(ISelection) - if (!input.setSelection(selection, workbenchPage.getWorkbenchWindow().getShell(), false)) - return null; - input.initializeCompareConfiguration(); - CompareUI.openCompareEditorOnPage(input, workbenchPage); - } - return null; - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ContentChangeNotifier.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ContentChangeNotifier.java deleted file mode 100644 index 9aee9c259..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ContentChangeNotifier.java +++ /dev/null @@ -1,91 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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 org.eclipse.compare.IContentChangeListener; -import org.eclipse.compare.IContentChangeNotifier; -import org.eclipse.core.runtime.ISafeRunnable; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.core.runtime.SafeRunner; -import org.eclipse.swt.widgets.Display; - -/** - * A helper class for managing content change notification. - */ -public class ContentChangeNotifier implements IContentChangeNotifier { - - private ListenerList fListenerList; - private final IContentChangeNotifier element; - - public ContentChangeNotifier(IContentChangeNotifier element) { - this.element = element; - } - - /* (non-Javadoc) - * see IContentChangeNotifier.addChangeListener - */ - public void addContentChangeListener(IContentChangeListener listener) { - if (fListenerList == null) - fListenerList= new ListenerList(); - fListenerList.add(listener); - } - - /* (non-Javadoc) - * see IContentChangeNotifier.removeChangeListener - */ - public void removeContentChangeListener(IContentChangeListener listener) { - if (fListenerList != null) { - fListenerList.remove(listener); - if (fListenerList.isEmpty()) - fListenerList= null; - } - } - - /** - * Notifies all registered <code>IContentChangeListener</code>s of a content change. - */ - public void fireContentChanged() { - if (isEmpty()) { - return; - } - // Legacy listeners may expect to be notified in the UI thread. - Runnable runnable = new Runnable() { - public void run() { - Object[] listeners= fListenerList.getListeners(); - for (int i= 0; i < listeners.length; i++) { - final IContentChangeListener contentChangeListener = (IContentChangeListener)listeners[i]; - SafeRunner.run(new ISafeRunnable() { - public void run() throws Exception { - contentChangeListener.contentChanged(element); - } - public void handleException(Throwable exception) { - // Logged by safe runner - } - }); - } - } - }; - if (Display.getCurrent() == null) { - Display.getDefault().syncExec(runnable); - } else { - runnable.run(); - } - } - - /** - * Return whether this notifier is empty (i.e. has no listeners). - * @return whether this notifier is empty - */ - public boolean isEmpty() { - return fListenerList == null || fListenerList.isEmpty(); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DiffImageDescriptor.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DiffImageDescriptor.java deleted file mode 100644 index a0ac41e04..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DiffImageDescriptor.java +++ /dev/null @@ -1,168 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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 org.eclipse.swt.graphics.*; - -import org.eclipse.jface.resource.CompositeImageDescriptor; -import org.eclipse.jface.resource.ImageDescriptor; - -/** - * Combines an image with an overlay. - */ -public class DiffImageDescriptor extends CompositeImageDescriptor { - - static final int HEIGHT= 16; - - private final ImageData fBaseImageData; - private final ImageDescriptor fOverlayImage; - private final int fWidth; - private final boolean fLeft; - private final int hashCode; - - public DiffImageDescriptor(Image base, ImageDescriptor overlay, int w, boolean onLeft) { - ImageData data = null; - if (base != null) { - data = base.getImageData(); - if (data == null) - data = DEFAULT_IMAGE_DATA; - } - fBaseImageData = data; - fOverlayImage= overlay; - fWidth= w; - fLeft= onLeft; - hashCode = calculateHashCode(); - } - - private int calculateHashCode() { - int h1 = 0; - int h2 = 0; - if (fBaseImageData != null) { - h1 = calculateHash(fBaseImageData); - } - if (fOverlayImage != null) { - h2 = fOverlayImage.hashCode(); - } - return h1 + h2 + fWidth; - } - - private int calculateHash(ImageData baseImageData) { - byte[] data = baseImageData.data; - int hash = baseImageData.width + baseImageData.height; - for (int i = 0; i < data.length; i++) { - byte b = data[i]; - hash >>>= 1; - hash ^= b; - } - return hash; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.resource.CompositeImageDescriptor#getSize() - */ - protected Point getSize() { - return new Point(fWidth, HEIGHT); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.resource.CompositeImageDescriptor#drawCompositeImage(int, int) - */ - protected void drawCompositeImage(int width, int height) { - if (fLeft) { - if (fBaseImageData != null) { - drawImage(fBaseImageData, fWidth - fBaseImageData.width, 0); - } - - if (fOverlayImage != null) { - ImageData overlay= fOverlayImage.getImageData(); - if (overlay == null) - overlay= DEFAULT_IMAGE_DATA; - drawImage(overlay, 0, (HEIGHT - overlay.height) / 2); - } - } else { - if (fBaseImageData != null) { - drawImage(fBaseImageData, 0, 0); - } - - if (fOverlayImage != null) { - ImageData overlay= fOverlayImage.getImageData(); - if (overlay == null) - overlay= DEFAULT_IMAGE_DATA; - drawImage(overlay, fWidth - overlay.width, (HEIGHT - overlay.height) / 2); - } - } - } - - /* (non-Javadoc) - * @see java.lang.Object#hashCode() - */ - public int hashCode() { - return hashCode; - } - - /* (non-Javadoc) - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object obj) { - if (obj == this) - return true; - if (obj instanceof DiffImageDescriptor) { - DiffImageDescriptor other = (DiffImageDescriptor) obj; - return (other.hashCode == hashCode - && isEqual(other.fOverlayImage, fOverlayImage) - && other.fWidth == fWidth - && other.fLeft == fLeft - && isEqual(other.fBaseImageData, fBaseImageData)); - } - return false; - } - - private boolean isEqual(ImageData i1, ImageData i2) { - if (isEqual((Object) i1, (Object) i2)) { - return true; - } - if (i1 == null || i2 == null) - return false; - return (i1.width == i2.width && i1.height == i2.height - && i1.depth == i2.depth && i1.scanlinePad == i2.scanlinePad - && i1.bytesPerLine == i2.bytesPerLine - /* && i1.palette == i2.palette */ - && i1.transparentPixel == i2.transparentPixel - && i1.maskPad == i2.maskPad - && i1.alpha == i2.alpha - && i1.type == i2.type && i1.x == i2.x && i1.y == i2.y - && i1.disposalMethod == i2.disposalMethod && i1.delayTime == i2.delayTime - && equals(i1.data,i2.data) && equals(i1.maskData, i2.maskData) - && equals(i1.alphaData, i2.alphaData)); - } - - private boolean equals(byte[] data, byte[] data2) { - if (isEqual(data, data2)) - return true; - if (data == null || data2 == null) - return false; - if (data.length != data2.length) - return false; - for (int i = 0; i < data2.length; i++) { - if (data[i] != data2[i]) - return false; - } - return true; - } - - private boolean isEqual(Object o1, Object o2) { - if (o1 == o2) - return true; - if (o1 == null || o2 == null) - return false; - return o1.equals(o2); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java deleted file mode 100644 index 8686bbbb3..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java +++ /dev/null @@ -1,202 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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.internal; - -import org.eclipse.jface.text.*; -import org.eclipse.compare.contentmergeviewer.ITokenComparator; -import org.eclipse.compare.rangedifferencer.IRangeComparator; - -/** - * Implements the <code>IRangeComparator</code> interface for lines in a document. - * A <code>DocLineComparator</code> is used as the input for the <code>RangeDifferencer</code> - * engine to perform a line oriented compare on documents. - * <p> - * A <code>DocLineComparator</code> doesn't know anything about line separators because - * its notion of lines is solely defined in the underlying <code>IDocument</code>. - */ -public class DocLineComparator implements ITokenComparator { - - private IDocument fDocument; - private int fLineOffset; - private int fLineCount; - private int fLength; - private boolean fIgnoreWhiteSpace; - - /** - * Creates a <code>DocLineComparator</code> for the given document range. - * ignoreWhiteSpace controls whether comparing lines (in method - * <code>rangesEqual<code>) should ignore whitespace. - * - * @param document the document from which the lines are taken - * @param region if non-<code>null</code> only lines within this range are taken - * @param ignoreWhiteSpace if <code>true</code> white space is ignored when comparing lines - */ - public DocLineComparator(IDocument document, IRegion region, - boolean ignoreWhiteSpace) { - fDocument = document; - fIgnoreWhiteSpace = ignoreWhiteSpace; - - fLineOffset = 0; - if (region != null) { - fLength = region.getLength(); - int start = region.getOffset(); - try { - fLineOffset = fDocument.getLineOfOffset(start); - } catch (BadLocationException ex) { - // silently ignored - } - - if (fLength == 0) { - // optimization, empty documents have one line - fLineCount = 1; - } else { - int endLine = fDocument.getNumberOfLines(); - try { - endLine = fDocument.getLineOfOffset(start + fLength); - } catch (BadLocationException ex) { - // silently ignored - } - fLineCount = endLine - fLineOffset + 1; - } - } else { - fLength = document.getLength(); - fLineCount = fDocument.getNumberOfLines(); - } - } - - /** - * Returns the number of lines in the document. - * - * @return number of lines - */ - public int getRangeCount() { - return fLineCount; - } - - /* (non Javadoc) - * see ITokenComparator.getTokenStart - */ - public int getTokenStart(int line) { - try { - IRegion r= fDocument.getLineInformation(fLineOffset + line); - return r.getOffset(); - } catch (BadLocationException ex) { - return fDocument.getLength(); - } - } - - /* (non Javadoc) - * Returns the length of the given line. - * see ITokenComparator.getTokenLength - */ - public int getTokenLength(int line) { - return getTokenStart(line+1) - getTokenStart(line); - } - - /** - * Returns <code>true</code> if a line given by the first index - * matches a line specified by the other <code>IRangeComparator</code> and index. - * - * @param thisIndex the number of the line within this range comparator - * @param otherComparator the range comparator to compare this with - * @param otherIndex the number of the line within the other comparator - * @return <code>true</code> if the lines are equal - */ - public boolean rangesEqual(int thisIndex, IRangeComparator otherComparator, int otherIndex) { - - if (otherComparator != null && otherComparator.getClass() == getClass()) { - DocLineComparator other= (DocLineComparator) otherComparator; - - if (fIgnoreWhiteSpace) { - String s1= extract(thisIndex); - String s2= other.extract(otherIndex); - //return s1.trim().equals(s2.trim()); - return compare(s1, s2); - } - - int tlen= getTokenLength(thisIndex); - int olen= other.getTokenLength(otherIndex); - if (tlen == olen) { - String s1= extract(thisIndex); - String s2= other.extract(otherIndex); - return s1.equals(s2); - } - } - return false; - } - - /** - * Aborts the comparison if the number of tokens is too large. - * - * @param length a number on which to base the decision whether to return - * <code>true</code> or <code>false</code> - * @param maxLength another number on which to base the decision whether to return - * <code>true</code> or <code>false</code> - * @param other the other <code>IRangeComparator</code> to compare with - * @return <code>true</code> to avoid a too lengthy range comparison - */ - public boolean skipRangeComparison(int length, int maxLength, IRangeComparator other) { - return false; - } - - //---- private methods - - /** - * Extract a single line from the underlying document without the line separator. - * - * @param line the number of the line to extract - * @return the contents of the line as a String - */ - private String extract(int line) { - if (line < fLineCount) { - try { - IRegion r= fDocument.getLineInformation(fLineOffset + line); - return fDocument.get(r.getOffset(), r.getLength()); - } catch(BadLocationException e) { - // silently ignored - } - } - return ""; //$NON-NLS-1$ - } - - private boolean compare(String s1, String s2) { - int l1= s1.length(); - int l2= s2.length(); - int c1= 0, c2= 0; - int i1= 0, i2= 0; - - while (c1 != -1) { - - c1= -1; - while (i1 < l1) { - char c= s1.charAt(i1++); - if (! Character.isWhitespace(c)) { - c1= c; - break; - } - } - - c2= -1; - while (i2 < l2) { - char c= s2.charAt(i2++); - if (! Character.isWhitespace(c)) { - c2= c; - break; - } - } - - if (c1 != c2) - return false; - } - return true; - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DocumentManager.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DocumentManager.java deleted file mode 100644 index 7f2dd3e9e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DocumentManager.java +++ /dev/null @@ -1,65 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.util.ArrayList; - -import org.eclipse.jface.text.IDocument; - -/** - * No API yet. - */ -public class DocumentManager { - - private static final boolean DEBUG= false; - - private static ArrayList fgKeys= new ArrayList(); - private static ArrayList fgValues= new ArrayList(); - - public static IDocument get(Object o) { - - for (int i= 0; i < fgKeys.size(); i++) { - if (fgKeys.get(i) == o) - return (IDocument) fgValues.get(i); - } - return null; - } - - public static void put(Object o, IDocument document) { - if (DEBUG) System.out.println("DocumentManager.put: " + document); //$NON-NLS-1$ - for (int i= 0; i < fgKeys.size(); i++) { - if (fgKeys.get(i) == o) { - fgValues.set(i, document); - return; - } - } - fgKeys.add(o); - fgValues.add(document); - } - - public static void remove(IDocument document) { - if (document != null) { - if (DEBUG) System.out.println("DocumentManager.remove: " + document); //$NON-NLS-1$ - for (int i= 0; i < fgValues.size(); i++) { - if (fgValues.get(i) == document) { - fgKeys.remove(i); - fgValues.remove(i); - return; - } - } - if (DEBUG) System.out.println("DocumentManager.remove: not found"); //$NON-NLS-1$ - } - } - - public static void dump() { - if (DEBUG) System.out.println("DocumentManager: managed docs:" + fgValues.size()); //$NON-NLS-1$ - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/EditionAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/EditionAction.java deleted file mode 100644 index f0adb2cb8..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/EditionAction.java +++ /dev/null @@ -1,237 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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; - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ExceptionHandler.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ExceptionHandler.java deleted file mode 100644 index 723d8cfbb..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ExceptionHandler.java +++ /dev/null @@ -1,133 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.StringWriter; -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.swt.widgets.Shell; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; - -import org.eclipse.jface.dialogs.ErrorDialog; -import org.eclipse.jface.dialogs.MessageDialog; - -/** - * The default exception handler shows an error dialog when one of its handle methods - * is called. If the passed exception is a <code>CoreException</code> an error dialog - * pops up showing the exception's status information. For a <code>InvocationTargetException</code> - * a normal message dialog pops up showing the exception's message. Additionally the exception - * is written to the platform log. - */ -public class ExceptionHandler { - - private static ExceptionHandler fgInstance= new ExceptionHandler(); - - /* - * Logs the given exception using the platform's logging mechanism. The exception is - * logged as an error with the error code <code>JavaStatusConstants.INTERNAL_ERROR</code>. - */ - public static void log(Throwable t, String message) { - CompareUIPlugin.log(new Status(IStatus.ERROR, CompareUIPlugin.getPluginId(), - CompareUIPlugin.INTERNAL_ERROR, message, t)); - } - - /** - * Handles the given <code>CoreException</code>. The workbench shell is used as a parent - * for the dialog window. - * - * @param e the <code>CoreException</code> to be handled - * @param title the dialog window's window title - * @param message message to be displayed by the dialog window - */ - public static void handle(CoreException e, String title, String message) { - handle(e, CompareUIPlugin.getShell(), title, message); - } - - /** - * Handles the given <code>CoreException</code>. - * - * @param e the <code>CoreException</code> to be handled - * @param parent the dialog window's parent shell - * @param title the dialog window's window title - * @param message message to be displayed by the dialog window - */ - public static void handle(CoreException e, Shell parent, String title, String message) { - fgInstance.perform(e, parent, title, message); - } - - /** - * Handles the given <code>InvocationTargetException</code>. The workbench shell is used - * as a parent for the dialog window. - * - * @param e the <code>InvocationTargetException</code> to be handled - * @param title the dialog window's window title - * @param message message to be displayed by the dialog window - */ - public static void handle(InvocationTargetException e, String title, String message) { - handle(e, CompareUIPlugin.getShell(), title, message); - } - - /** - * Handles the given <code>InvocationTargetException</code>. - * - * @param e the <code>InvocationTargetException</code> to be handled - * @param parent the dialog window's parent shell - * @param title the dialog window's window title - * @param message message to be displayed by the dialog window - */ - public static void handle(InvocationTargetException e, Shell parent, String title, String message) { - fgInstance.perform(e, parent, title, message); - } - - //---- Hooks for subclasses to control exception handling ------------------------------------ - - protected void perform(CoreException e, Shell shell, String title, String message) { - CompareUIPlugin.log(e); - IStatus status= e.getStatus(); - if (status != null) { - ErrorDialog.openError(shell, title, message, status); - } else { - displayMessageDialog(e, e.getMessage(), shell, title, message); - } - } - - protected void perform(InvocationTargetException e, Shell shell, String title, String message) { - Throwable target= e.getTargetException(); - if (target instanceof CoreException) { - perform((CoreException)target, shell, title, message); - } else { - CompareUIPlugin.log(e); - if (e.getMessage() != null && e.getMessage().length() > 0) { - displayMessageDialog(e, e.getMessage(), shell, title, message); - } else { - displayMessageDialog(e, target.getMessage(), shell, title, message); - } - } - } - - //---- Helper methods ----------------------------------------------------------------------- - - private void displayMessageDialog(Throwable t, String exceptionMessage, Shell shell, String title, String message) { - StringWriter msg= new StringWriter(); - if (message != null) { - msg.write(message); - msg.write("\n\n"); //$NON-NLS-1$ - } - if (exceptionMessage == null || exceptionMessage.length() == 0) - msg.write(CompareMessages.ExceptionDialog_seeErrorLogMessage); - else - msg.write(exceptionMessage); - MessageDialog.openError(shell, title, msg.toString()); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareContextIds.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareContextIds.java deleted file mode 100644 index e2b36a5bb..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareContextIds.java +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.compare.CompareUI; - -/** - * Help context ids for the Compare UI. - * <p> - * This interface contains constants only; it is not intended to be implemented - * or extended. - * </p> - * - */ -public interface ICompareContextIds { - - public static final String PREFIX= CompareUI.PLUGIN_ID + '.'; - - // Dialogs - public static final String EDITION_DIALOG= PREFIX + "edition_dialog_context"; //$NON-NLS-1$ - - public static final String COMPARE_EDITOR= PREFIX + "compare_editor_context"; //$NON-NLS-1$ - public static final String PATCH_INPUT_WIZARD_PAGE= PREFIX + "patch_input_wizard_page_context"; //$NON-NLS-1$ - public static final String PATCH_PREVIEW_WIZARD_PAGE= PREFIX + "patch_preview_wizard_page_context"; //$NON-NLS-1$ - public static final String ADD_FROM_HISTORY_DIALOG= PREFIX + "add_from_history_dialog_context"; //$NON-NLS-1$ - public static final String COMPARE_DIALOG= PREFIX + "compare_dialog_context"; //$NON-NLS-1$ - public static final String COMPARE_WITH_EDITION_DIALOG= PREFIX + "compare_with_edition_dialog_context"; //$NON-NLS-1$ - public static final String REPLACE_WITH_EDITION_DIALOG= PREFIX + "replace_with_edition_dialog_context"; //$NON-NLS-1$ - - // Viewer - public static final String TEXT_MERGE_VIEW= PREFIX + "text_merge_view_context"; //$NON-NLS-1$ - public static final String IMAGE_COMPARE_VIEW= PREFIX + "image_compare_view_context"; //$NON-NLS-1$ - public static final String BINARY_COMPARE_VIEW= PREFIX + "binary_compare_view_context"; //$NON-NLS-1$ - public static final String DIFF_VIEW= PREFIX + "diff_view_context"; //$NON-NLS-1$ - - // Actions - public static final String GLOBAL_NEXT_DIFF_ACTION= PREFIX + "global_next_diff_action_context"; //$NON-NLS-1$ - public static final String GLOBAL_PREVIOUS_DIFF_ACTION= PREFIX + "global_previous_diff_action_context"; //$NON-NLS-1$ - public static final String NEXT_DIFF_ACTION= PREFIX + "next_diff_action_context"; //$NON-NLS-1$ - public static final String PREVIOUS_DIFF_ACTION= PREFIX + "previous_diff_action_context"; //$NON-NLS-1$ - public static final String IGNORE_WHITESPACE_ACTION= PREFIX + "ignore_whitespace_action_context"; //$NON-NLS-1$ - - // Preference page - public static final String COMPARE_PREFERENCE_PAGE= PREFIX + "compare_preference_page_context"; //$NON-NLS-1$ -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareUIConstants.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareUIConstants.java deleted file mode 100644 index e36def063..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareUIConstants.java +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 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.internal; - - -public interface ICompareUIConstants { - public final String PREFIX = CompareUIPlugin.getPluginId() + "."; //$NON-NLS-1$ - - public static final String DTOOL_NEXT= "dlcl16/next_nav.gif"; //$NON-NLS-1$ - public static final String ETOOL_NEXT= "elcl16/next_nav.gif"; //$NON-NLS-1$ - public static final String CTOOL_NEXT= ETOOL_NEXT; - - public static final String DTOOL_PREV= "dlcl16/prev_nav.gif"; //$NON-NLS-1$ - public static final String ETOOL_PREV= "elcl16/prev_nav.gif"; //$NON-NLS-1$ - public static final String CTOOL_PREV= ETOOL_PREV; - - public static final String HUNK_OBJ = "obj16/hunk_obj.gif"; //$NON-NLS-1$ - - public static final String ERROR_OVERLAY= "ovr16/error_ov.gif"; //$NON-NLS-1$ - public static final String IS_MERGED_OVERLAY= "ovr16/merged_ov.gif"; //$NON-NLS-1$ - public static final String REMOVED_OVERLAY= "ovr16/removed_ov.gif"; //$NON-NLS-1$ - public static final String WARNING_OVERLAY= "ovr16/warning_ov.gif"; //$NON-NLS-1$ - - public static final String RETARGET_PROJECT= "eview16/compare_view.gif"; //$NON-NLS-1$ - - public static final String IGNORE_WHITESPACE_ENABLED= "etool16/ignorews_edit.gif"; //$NON-NLS-1$ - public static final String IGNORE_WHITESPACE_DISABLED= "dtool16/ignorews_edit.gif"; //$NON-NLS-1$ - - public static final String PROP_ANCESTOR_VISIBLE = PREFIX + "AncestorVisible"; //$NON-NLS-1$ - public static final String PROP_IGNORE_ANCESTOR = PREFIX + "IgnoreAncestor"; //$NON-NLS-1$ - public static final String PROP_TITLE = PREFIX + "Title"; //$NON-NLS-1$ - public static final String PROP_TITLE_IMAGE = PREFIX + "TitleImage"; //$NON-NLS-1$ - public static final String PROP_SELECTED_EDITION = PREFIX + "SelectedEdition"; //$NON-NLS-1$ - - public static final int COMPARE_IMAGE_WIDTH= 22; - - public static final String PREF_NAVIGATION_END_ACTION= PREFIX + "NavigationEndAction"; //$NON-NLS-1$ - public static final String PREF_NAVIGATION_END_ACTION_LOCAL= PREFIX + "NavigationEndActionLocal"; //$NON-NLS-1$ - public static final String PREF_VALUE_PROMPT = "prompt"; //$NON-NLS-1$ - public static final String PREF_VALUE_LOOP = "loop"; //$NON-NLS-1$ - public static final String PREF_VALUE_NEXT = "next"; //$NON-NLS-1$ - public static final String PREF_VALUE_DO_NOTHING = "doNothing"; //$NON-NLS-1$ - - public static final String COMMAND_IGNORE_WHITESPACE = PREFIX + "ignoreWhiteSpace"; //$NON-NLS-1$ -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IFlushable2.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IFlushable2.java deleted file mode 100644 index 47a5b735a..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IFlushable2.java +++ /dev/null @@ -1,28 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010 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 org.eclipse.compare.contentmergeviewer.IFlushable; -import org.eclipse.core.runtime.IProgressMonitor; - -/** - * Interface which provides the ability to flush the contents from the specified - * side of the viewer. - * - * @see IFlushable - * - * @since 3.7 - */ -public interface IFlushable2 { - void flushLeft(IProgressMonitor monitor); - - void flushRight(IProgressMonitor monitor); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IMergeViewerTestAdapter.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IMergeViewerTestAdapter.java deleted file mode 100644 index a790eaae6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IMergeViewerTestAdapter.java +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006 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 org.eclipse.jface.text.IDocument; - -/** - * An interface that provides access to the internals of a merge viewer for the purposes of testing. - * NOTE: This interface is not to be used for any other purpose. - */ -public interface IMergeViewerTestAdapter { - - /** - * Return the document for the given leg - * @param leg the leg (or side) - * @return the document for that leg of the comparison - */ - public IDocument getDocument(char leg); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ISavingSaveable.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ISavingSaveable.java deleted file mode 100644 index 287a78c33..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ISavingSaveable.java +++ /dev/null @@ -1,23 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010 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 org.eclipse.ui.Saveable; - -/** - * Interface defines API for checking if an object, preferably an instance of - * {@link Saveable}, is being saved. - * - * @since 3.7 - */ -public interface ISavingSaveable { - public boolean isSaving(); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IViewerDescriptor.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IViewerDescriptor.java deleted file mode 100644 index 69cbbbc77..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IViewerDescriptor.java +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.swt.widgets.Composite; - -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.compare.CompareConfiguration; - -/** - * A factory object for creating a <code>Viewer</code>s from a descriptor. - * <p> - * It is used when registering a viewer for a specific type - * in <code>CompareUIPlugin.registerContentViewerDescriptor</code> and - * in <code>CompareUIPlugin.registerStructureViewerDescriptor</code>. - * - * @see org.eclipse.compare.structuremergeviewer.IStructureCreator - * @see CompareUIPlugin - */ -public interface IViewerDescriptor { - - /** - * Creates a new viewer from this descriptor under the given STW parent control. - * If the current viewer has the same type as a new viewer - * the implementation of this method is free to return the current viewer instead. - * - * @param currentViewer the current viewer which is going to be replaced with a new viewer. - * @param parent the SWT parent control under which the new viewer has to be created. - * @param config a compare configuration the new viewer might be interested in. - * @return a new viewer or the current viewer. - */ - Viewer createViewer(Viewer currentViewer, Composite parent, CompareConfiguration config); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageCanvas.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageCanvas.java deleted file mode 100644 index 53d4165ac..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageCanvas.java +++ /dev/null @@ -1,139 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * A <code>Canvas</code> showing a single centered SWT <code>Image</code>. - * If the <code>Image</code> is larger than the <code>Canvas<code>, - * <code>Scrollbars</code> will appear. - */ -class ImageCanvas extends Canvas { - - private Image fImage; - - /* - * Create a new ImageCanvas with the given SWT stylebits. - * (SWT.H_SCROLL and SWT.V_SCROLL are automtically added). - */ - public ImageCanvas(Composite parent, int style) { - super(parent, style | SWT.H_SCROLL | SWT.V_SCROLL); - - ScrollBar sb= getHorizontalBar(); - sb.setIncrement(20); - sb.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event e) { - repaint(); - } - }); - - sb= getVerticalBar(); - sb.setIncrement(20); - sb.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event e) { - repaint(); - } - }); - - addListener(SWT.Resize, new Listener() { - public void handleEvent(Event e) { - updateScrollbars(); - } - }); - - addListener(SWT.Paint, new Listener() { - public void handleEvent(Event event) { - paint(event.gc); - } - }); - } - - /* - * Set the SWT Image to use as the ImageCanvas contents. - */ - public void setImage(Image img) { - fImage= img; - - if (!isDisposed()) { - getHorizontalBar().setSelection(0); - getVerticalBar().setSelection(0); - updateScrollbars(); - getParent().layout(); - redraw(); - } - } - - public void repaint() { - if (!isDisposed()) { - GC gc= new GC(this); - paint(gc); - gc.dispose(); - } - } - - void paint(GC gc) { - if (fImage != null) { - Rectangle bounds= fImage.getBounds(); - Rectangle clientArea= getClientArea(); - - int x; - if (bounds.width < clientArea.width) - x= (clientArea.width - bounds.width) / 2; - else - x= -getHorizontalBar().getSelection(); - - int y; - if (bounds.height < clientArea.height) - y= (clientArea.height - bounds.height) / 2; - else - y= -getVerticalBar().getSelection(); - - gc.drawImage(fImage, x, y); - } - } - - /** - * @private - */ - void updateScrollbars() { - Rectangle bounds= fImage != null ? fImage.getBounds() : new Rectangle(0, 0, 0, 0); - Point size= getSize(); - Rectangle clientArea= getClientArea(); - - ScrollBar horizontal= getHorizontalBar(); - if (bounds.width <= clientArea.width) { - horizontal.setVisible(false); - horizontal.setSelection(0); - } else { - horizontal.setPageIncrement(clientArea.width - horizontal.getIncrement()); - int max= bounds.width + (size.x - clientArea.width); - horizontal.setMaximum(max); - horizontal.setThumb(size.x > max ? max : size.x); - horizontal.setVisible(true); - } - - ScrollBar vertical= getVerticalBar(); - if (bounds.height <= clientArea.height) { - vertical.setVisible(false); - vertical.setSelection(0); - } else { - vertical.setPageIncrement(clientArea.height - vertical.getIncrement()); - int max= bounds.height + (size.y - clientArea.height); - vertical.setMaximum(max); - vertical.setThumb(size.y > max ? max : size.y); - vertical.setVisible(true); - } - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewer.java deleted file mode 100644 index c9cb53956..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewer.java +++ /dev/null @@ -1,144 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.InputStream; -import java.io.IOException; -import java.util.ResourceBundle; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.PlatformUI; -import org.eclipse.core.runtime.CoreException; - -import org.eclipse.compare.*; -import org.eclipse.compare.contentmergeviewer.ContentMergeViewer; - -/** - */ -public class ImageMergeViewer extends ContentMergeViewer { - - private static final String BUNDLE_NAME= "org.eclipse.compare.internal.ImageMergeViewerResources"; //$NON-NLS-1$ - - private Object fLeftImage; - private Object fRightImage; - - private ImageCanvas fAncestor; - private ImageCanvas fLeft; - private ImageCanvas fRight; - - - public ImageMergeViewer(Composite parent, int styles, CompareConfiguration mp) { - super(styles, ResourceBundle.getBundle(BUNDLE_NAME), mp); - - PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, ICompareContextIds.IMAGE_COMPARE_VIEW); - - buildControl(parent); - String title= Utilities.getString(getResourceBundle(), "title"); //$NON-NLS-1$ - getControl().setData(CompareUI.COMPARE_VIEWER_TITLE, title); - } - - protected void updateContent(Object ancestor, Object left, Object right) { - - setInput(fAncestor, ancestor); - - fLeftImage= left; - setInput(fLeft, left); - - fRightImage= right; - setInput(fRight, right); - } - - /* - * We can't modify the contents of either side we just return null. - */ - protected byte[] getContents(boolean left) { - return null; - } - - public void createControls(Composite composite) { - fAncestor= new ImageCanvas(composite, SWT.NO_FOCUS); - fLeft= new ImageCanvas(composite, SWT.NO_FOCUS); - fRight= new ImageCanvas(composite, SWT.NO_FOCUS); - } - - private static void setInput(ImageCanvas canvas, Object input) { - if (canvas != null) { - - InputStream stream= null; - if (input instanceof IStreamContentAccessor) { - IStreamContentAccessor sca= (IStreamContentAccessor) input; - if (sca != null) { - try { - stream= sca.getContents(); - } catch (CoreException ex) { - // NeedWork - } - } - } - - Image image= null; - Display display= canvas.getDisplay(); - if (stream != null) { - try { - image= new Image(display, stream); - } catch (SWTException ex) { - // silently ignored - } - } - - canvas.setImage(image); - if (image != null) { - canvas.setBackground(display.getSystemColor(SWT.COLOR_LIST_BACKGROUND)); - } else { - canvas.setBackground(null); - } - - if (stream != null) { - try { - stream.close(); - } catch (IOException ex) { - // silently ignored - } - } - } - } - - protected void handleResizeAncestor(int x, int y, int width, int height) { - if (width > 0) { - fAncestor.setVisible(true); - fAncestor.setBounds(x, y, width, height); - } else { - fAncestor.setVisible(false); - } - } - - protected void handleResizeLeftRight(int x, int y, int width1, int centerWidth, int width2, int height) { - fLeft.setBounds(x, y, width1, height); - fRight.setBounds(x+width1+centerWidth, y, width2, height); - } - - protected void copy(boolean leftToRight) { - if (leftToRight) { - fRightImage= fLeftImage; - setInput(fRight, fRightImage); - setRightDirty(true); - } else { - fLeftImage= fRightImage; - setInput(fLeft, fLeftImage); - setLeftDirty(true); - } - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerCreator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerCreator.java deleted file mode 100644 index d73a961c1..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerCreator.java +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; - -import org.eclipse.compare.*; -import org.eclipse.jface.viewers.Viewer; - -/** - * A factory object for the <code>ImageMergeViewer</code>. - * This indirection is necessary because only objects with a default - * constructor can be created via an extension point - * (this precludes Viewers). - */ -public class ImageMergeViewerCreator implements IViewerCreator { - - public Viewer createViewer(Composite parent, CompareConfiguration mp) { - return new ImageMergeViewer(parent, SWT.NULL, mp); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties deleted file mode 100644 index 7388f9c7a..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties +++ /dev/null @@ -1,32 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2006 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 -############################################################################### - -# @(#)ImageMergeViewerResources.properties -# -# Resource strings for ImageMergeViewer.java - -title= Image Compare - -##################################################### -# Actions -##################################################### - -action.CopyLeftToRight.label= Copy Left to Right -action.CopyLeftToRight.tooltip= Copy Image from Left to Right -action.CopyLeftToRight.image= elcl16/copy_r_co.gif - -action.CopyRightToLeft.label= Copy Right to Left -action.CopyRightToLeft.tooltip= Copy Image from Right to Left -action.CopyRightToLeft.image= elcl16/copy_l_co.gif - -action.EnableAncestor.label= Enable Ancestor Pane -action.EnableAncestor.tooltip= Control Visibility of Ancestor Pane -action.EnableAncestor.image= elcl16/ancestorpane_co.gif diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ListContentProvider.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ListContentProvider.java deleted file mode 100644 index 86a0d6d45..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ListContentProvider.java +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.util.List; - -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.Viewer; - -/** - * A specialized content provider to show a list of editor parts. - */ -public class ListContentProvider implements IStructuredContentProvider { - List fContents; - - public ListContentProvider() { - // nothing to do - } - - public Object[] getElements(Object input) { - if (fContents != null && fContents == input) - return fContents.toArray(); - return new Object[0]; - } - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - if (newInput instanceof List) - fContents= (List)newInput; - else - fContents= null; - // we use a fixed set. - } - - public void dispose() { - // empty default implementation - } - - public boolean isDeleted(Object o) { - return fContents != null && !fContents.contains(o); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeSourceViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeSourceViewer.java deleted file mode 100644 index 0f823fde2..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeSourceViewer.java +++ /dev/null @@ -1,1074 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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 - * Max Weninger (max.weninger@windriver.com) - Bug 131895 [Edit] Undo in compare - * Max Weninger (max.weninger@windriver.com) - Bug 72936 [Viewers] Show line numbers in comparision - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.ResourceBundle; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.StyledText; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; - -import org.eclipse.core.commands.Command; -import org.eclipse.core.commands.IHandler; -import org.eclipse.core.commands.operations.IOperationHistory; -import org.eclipse.core.commands.operations.IOperationHistoryListener; -import org.eclipse.core.commands.operations.IUndoContext; -import org.eclipse.core.commands.operations.OperationHistoryEvent; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IProgressMonitor; - -import org.eclipse.jface.action.GroupMarker; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.preference.PreferenceConverter; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; - -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.ITextListener; -import org.eclipse.jface.text.ITextOperationTarget; -import org.eclipse.jface.text.ITextSelection; -import org.eclipse.jface.text.ITextViewer; -import org.eclipse.jface.text.ITextViewerExtension5; -import org.eclipse.jface.text.IUndoManager; -import org.eclipse.jface.text.IUndoManagerExtension; -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.Region; -import org.eclipse.jface.text.TextEvent; -import org.eclipse.jface.text.source.CompositeRuler; -import org.eclipse.jface.text.source.IAnnotationModel; -import org.eclipse.jface.text.source.ISharedTextColors; -import org.eclipse.jface.text.source.IVerticalRuler; -import org.eclipse.jface.text.source.LineNumberRulerColumn; -import org.eclipse.jface.text.source.SourceViewer; -import org.eclipse.jface.text.source.SourceViewerConfiguration; - -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IEditorSite; -import org.eclipse.ui.IPropertyListener; -import org.eclipse.ui.IWorkbenchActionConstants; -import org.eclipse.ui.IWorkbenchCommandConstants; -import org.eclipse.ui.IWorkbenchPartSite; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.commands.ICommandService; -import org.eclipse.ui.menus.CommandContributionItem; -import org.eclipse.ui.menus.CommandContributionItemParameter; - -import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants; -import org.eclipse.ui.texteditor.ChangeEncodingAction; -import org.eclipse.ui.texteditor.FindReplaceAction; -import org.eclipse.ui.texteditor.IDocumentProvider; -import org.eclipse.ui.texteditor.IElementStateListener; -import org.eclipse.ui.texteditor.ITextEditor; - -import org.eclipse.ui.editors.text.EditorsUI; - -import org.eclipse.compare.ICompareContainer; - -/** - * Wraps a JFace SourceViewer and add some convenience methods. - */ -public class MergeSourceViewer implements ISelectionChangedListener, - ITextListener, IMenuListener, IOperationHistoryListener, IAdaptable { - - public static final String UNDO_ID= "undo"; //$NON-NLS-1$ - public static final String REDO_ID= "redo"; //$NON-NLS-1$ - public static final String CUT_ID= "cut"; //$NON-NLS-1$ - public static final String COPY_ID= "copy"; //$NON-NLS-1$ - public static final String PASTE_ID= "paste"; //$NON-NLS-1$ - public static final String DELETE_ID= "delete"; //$NON-NLS-1$ - public static final String SELECT_ALL_ID= "selectAll"; //$NON-NLS-1$ - public static final String FIND_ID= "find"; //$NON-NLS-1$ - public static final String GOTO_LINE_ID= "gotoLine"; //$NON-NLS-1$ - public static final String CHANGE_ENCODING_ID= "changeEncoding"; //$NON-NLS-1$ - - class TextOperationAction extends MergeViewerAction { - - private int fOperationCode; - - TextOperationAction(int operationCode, boolean mutable, boolean selection, boolean content) { - this(operationCode, null, mutable, selection, content); - } - - public TextOperationAction(int operationCode, String actionDefinitionId, boolean mutable, boolean selection, boolean content) { - super(mutable, selection, content); - if (actionDefinitionId != null) - setActionDefinitionId(actionDefinitionId); - fOperationCode= operationCode; - update(); - } - - public void run() { - if (isEnabled()) - getSourceViewer().doOperation(fOperationCode); - } - - public boolean isEnabled() { - return fOperationCode != -1 && getSourceViewer().canDoOperation(fOperationCode); - } - - public void update() { - this.setEnabled(isEnabled()); - } - } - - /** - * TODO: The only purpose of this class is to provide "Go to Line" action in - * TextMergeViewer. The adapter should be removed as soon as we implement - * embedded TextEditor in a similar way JDT has it done for Java compare. - */ - class TextEditorAdapter implements ITextEditor { - - public void close(boolean save) { - // defining interface method - } - - public void doRevertToSaved() { - // defining interface method - } - - public IAction getAction(String actionId) { - // defining interface method - return null; - } - - public IDocumentProvider getDocumentProvider() { - return new IDocumentProvider(){ - - public void aboutToChange(Object element) { - // defining interface method - } - - public void addElementStateListener( - IElementStateListener listener) { - // defining interface method - } - - public boolean canSaveDocument(Object element) { - // defining interface method - return false; - } - - public void changed(Object element) { - // defining interface method - } - - public void connect(Object element) throws CoreException { - // defining interface method - } - - public void disconnect(Object element) { - // defining interface method - } - - public IAnnotationModel getAnnotationModel(Object element) { - // defining interface method - return null; - } - - public IDocument getDocument(Object element) { - return MergeSourceViewer.this.getSourceViewer().getDocument(); - } - - public long getModificationStamp(Object element) { - // defining interface method - return 0; - } - - public long getSynchronizationStamp(Object element) { - // defining interface method - return 0; - } - - public boolean isDeleted(Object element) { - // defining interface method - return false; - } - - public boolean mustSaveDocument(Object element) { - // defining interface method - return false; - } - - public void removeElementStateListener( - IElementStateListener listener) { - // defining interface method - } - - public void resetDocument(Object element) throws CoreException { - // defining interface method - } - - public void saveDocument(IProgressMonitor monitor, - Object element, IDocument document, boolean overwrite) - throws CoreException { - // defining interface method - }}; - } - - public IRegion getHighlightRange() { - // defining interface method - return null; - } - - public ISelectionProvider getSelectionProvider() { - return MergeSourceViewer.this.getSourceViewer().getSelectionProvider(); - } - - public boolean isEditable() { - // defining interface method - return false; - } - - public void removeActionActivationCode(String actionId) { - // defining interface method - } - - public void resetHighlightRange() { - // defining interface method - } - - public void selectAndReveal(int start, int length) { - selectAndReveal(start, length, start, length); - } - - /* - * @see org.eclipse.ui.texteditor.AbstractTextEditor#selectAndReveal(int, int, int, int) - */ - private void selectAndReveal(int selectionStart, int selectionLength, int revealStart, int revealLength) { - - ISelection selection = getSelectionProvider().getSelection(); - if (selection instanceof ITextSelection) { - ITextSelection textSelection = (ITextSelection) selection; - if (textSelection.getOffset() != 0 || textSelection.getLength() != 0) - markInNavigationHistory(); - } - - StyledText widget= MergeSourceViewer.this.getSourceViewer().getTextWidget(); - widget.setRedraw(false); - { - adjustHighlightRange(revealStart, revealLength); - MergeSourceViewer.this.getSourceViewer().revealRange(revealStart, revealLength); - - MergeSourceViewer.this.getSourceViewer().setSelectedRange(selectionStart, selectionLength); - - markInNavigationHistory(); - } - widget.setRedraw(true); - } - - /* - * @see org.eclipse.ui.texteditor.AbstractTextEditor#markInNavigationHistory() - */ - private void markInNavigationHistory() { - getSite().getPage().getNavigationHistory().markLocation(this); - } - - /* - * @see org.eclipse.ui.texteditor.AbstractTextEditor#adjustHighlightRange(int, int) - */ - private void adjustHighlightRange(int offset, int length) { - - if (MergeSourceViewer.this instanceof ITextViewerExtension5) { - ITextViewerExtension5 extension= (ITextViewerExtension5) MergeSourceViewer.this; - extension.exposeModelRange(new Region(offset, length)); - } else if (!isVisible(MergeSourceViewer.this.getSourceViewer(), offset, length)) { - MergeSourceViewer.this.getSourceViewer().resetVisibleRegion(); - } - } - - /* - * @see org.eclipse.ui.texteditor.AbstractTextEditor#isVisible(ISourceViewer, int, int) - */ - private /*static*/ final boolean isVisible(ITextViewer viewer, int offset, int length) { - if (viewer instanceof ITextViewerExtension5) { - ITextViewerExtension5 extension= (ITextViewerExtension5) viewer; - IRegion overlap= extension.modelRange2WidgetRange(new Region(offset, length)); - return overlap != null; - } - return viewer.overlapsWithVisibleRegion(offset, length); - } - - public void setAction(String actionID, IAction action) { - // defining interface method - } - - public void setActionActivationCode(String actionId, - char activationCharacter, int activationKeyCode, - int activationStateMask) { - // defining interface method - } - - public void setHighlightRange(int offset, int length, boolean moveCursor) { - // defining interface method - } - - public void showHighlightRangeOnly(boolean showHighlightRangeOnly) { - // defining interface method - } - - public boolean showsHighlightRangeOnly() { - // defining interface method - return false; - } - - public IEditorInput getEditorInput() { - if (MergeSourceViewer.this.fContainer.getWorkbenchPart() instanceof IEditorPart) - return ((IEditorPart) MergeSourceViewer.this.fContainer.getWorkbenchPart()).getEditorInput(); - return null; - } - - public IEditorSite getEditorSite() { - // defining interface method - return null; - } - - public void init(IEditorSite site, IEditorInput input) - throws PartInitException { - // defining interface method - } - - public void addPropertyListener(IPropertyListener listener) { - // defining interface method - } - - public void createPartControl(Composite parent) { - // defining interface method - } - - public void dispose() { - // defining interface method - } - - public IWorkbenchPartSite getSite() { - return MergeSourceViewer.this.fContainer.getWorkbenchPart().getSite(); - } - - public String getTitle() { - // defining interface method - return null; - } - - public Image getTitleImage() { - // defining interface method - return null; - } - - public String getTitleToolTip() { - // defining interface method - return null; - } - - public void removePropertyListener(IPropertyListener listener) { - // defining interface method - } - - public void setFocus() { - // defining interface method - } - - public Object getAdapter(Class adapter) { - // defining interface method - return null; - } - - public void doSave(IProgressMonitor monitor) { - // defining interface method - } - - public void doSaveAs() { - // defining interface method - } - - public boolean isDirty() { - // defining interface method - return false; - } - - public boolean isSaveAsAllowed() { - // defining interface method - return false; - } - - public boolean isSaveOnCloseNeeded() { - // defining interface method - return false; - } - } - - private ResourceBundle fResourceBundle; - private ICompareContainer fContainer; - private SourceViewer fSourceViewer; - private Position fRegion; - private boolean fEnabled= true; - private HashMap fActions= new HashMap(); - private IDocument fRememberedDocument; - - private boolean fAddSaveAction= true; - private boolean isConfigured = false; - - // line number ruler support - private IPropertyChangeListener fPreferenceChangeListener; - private boolean fShowLineNumber=false; - private LineNumberRulerColumn fLineNumberColumn; - private List textActions = new ArrayList(); - private CommandContributionItem fSaveContributionItem; - - public MergeSourceViewer(SourceViewer sourceViewer, ResourceBundle bundle, ICompareContainer container) { - Assert.isNotNull(sourceViewer); - fSourceViewer= sourceViewer; - fResourceBundle= bundle; - fContainer = container; - - MenuManager menu= new MenuManager(); - menu.setRemoveAllWhenShown(true); - menu.addMenuListener(this); - StyledText te= getSourceViewer().getTextWidget(); - te.setMenu(menu.createContextMenu(te)); - fContainer.registerContextMenu(menu, getSourceViewer()); - - // for listening to editor show/hide line number preference value - fPreferenceChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - MergeSourceViewer.this.handlePropertyChangeEvent(event); - } - }; - EditorsUI.getPreferenceStore().addPropertyChangeListener(fPreferenceChangeListener); - fShowLineNumber= EditorsUI.getPreferenceStore().getBoolean(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER); - if(fShowLineNumber){ - updateLineNumberRuler(); - } - - IOperationHistory history = getHistory(); - if (history != null) - history.addOperationHistoryListener(this); - - // don't add save when in a dialog, IWorkbenchPart is null in dialog containers - fAddSaveAction = fContainer.getWorkbenchPart() != null; - } - - public void rememberDocument(IDocument doc) { -// if (doc != null && fRememberedDocument != null) { -// System.err.println("MergeSourceViewer.rememberDocument: fRememberedDocument != null: shouldn't happen"); //$NON-NLS-1$ -// } - fRememberedDocument= doc; - } - - public IDocument getRememberedDocument() { - return fRememberedDocument; - } - - public void hideSaveAction() { - fAddSaveAction= false; - } - - public void setFont(Font font) { - StyledText te= getSourceViewer().getTextWidget(); - if (te != null) - te.setFont(font); - if (fLineNumberColumn != null) { - fLineNumberColumn.setFont(font); - layoutViewer(); - } - } - - public void setBackgroundColor(Color color) { - StyledText te= getSourceViewer().getTextWidget(); - if (te != null) - te.setBackground(color); - if (fLineNumberColumn != null) - fLineNumberColumn.setBackground(color); - } - - public void setForegroundColor(Color color) { - StyledText te= getSourceViewer().getTextWidget(); - if (te != null) - te.setForeground(color); - } - - public void setEnabled(boolean enabled) { - if (enabled != fEnabled) { - fEnabled= enabled; - StyledText c= getSourceViewer().getTextWidget(); - if (c != null) { - c.setEnabled(enabled); - Display d= c.getDisplay(); - c.setBackground(enabled ? d.getSystemColor(SWT.COLOR_LIST_BACKGROUND) : null); - } - } - } - - public boolean getEnabled() { - return fEnabled; - } - - public void setRegion(Position region) { - fRegion= region; - } - - public Position getRegion() { - return fRegion; - } - - public boolean isControlOkToUse() { - StyledText t= getSourceViewer().getTextWidget(); - return t != null && !t.isDisposed(); - } - - public void setSelection(Position position) { - if (position != null) - getSourceViewer().setSelectedRange(position.getOffset(), position.getLength()); - } - - public void setLineBackground(Position position, Color c) { - StyledText t= getSourceViewer().getTextWidget(); - if (t != null && !t.isDisposed()) { - Point region= new Point(0, 0); - getLineRange(position, region); - - region.x-= getDocumentRegionOffset(); - - try { - t.setLineBackground(region.x, region.y, c); - } catch (IllegalArgumentException ex) { - // silently ignored - } - } - } - - public void resetLineBackground() { - StyledText t= getSourceViewer().getTextWidget(); - if (t != null && !t.isDisposed()) { - int lines= getLineCount(); - t.setLineBackground(0, lines, null); - } - } - - /* - * Returns number of lines in document region. - */ - public int getLineCount() { - IRegion region= getSourceViewer().getVisibleRegion(); - - int length= region.getLength(); - if (length == 0) - return 0; - - IDocument doc= getSourceViewer().getDocument(); - int startLine= 0; - int endLine= 0; - - int start= region.getOffset(); - try { - startLine= doc.getLineOfOffset(start); - } catch(BadLocationException ex) { - // silently ignored - } - try { - endLine= doc.getLineOfOffset(start+length); - } catch(BadLocationException ex) { - // silently ignored - } - - return endLine-startLine+1; - } - - public int getViewportLines() { - StyledText te= getSourceViewer().getTextWidget(); - Rectangle clArea= te.getClientArea(); - if (!clArea.isEmpty()) - return clArea.height / te.getLineHeight(); - return 0; - } - - public int getViewportHeight() { - StyledText te= getSourceViewer().getTextWidget(); - Rectangle clArea= te.getClientArea(); - if (!clArea.isEmpty()) - return clArea.height; - return 0; - } - - /* - * Returns lines - */ - public int getDocumentRegionOffset() { - int start= getSourceViewer().getVisibleRegion().getOffset(); - IDocument doc= getSourceViewer().getDocument(); - if (doc != null) { - try { - return doc.getLineOfOffset(start); - } catch(BadLocationException ex) { - // silently ignored - } - } - return 0; - } - - public int getVerticalScrollOffset() { - StyledText st= getSourceViewer().getTextWidget(); - int lineHeight= st.getLineHeight(); - return getSourceViewer().getTopInset() - ((getDocumentRegionOffset()*lineHeight) + st.getTopPixel()); - } - - /* - * Returns the start line and the number of lines which correspond to the given position. - * Starting line number is 0 based. - */ - public Point getLineRange(Position p, Point region) { - - IDocument doc= getSourceViewer().getDocument(); - - if (p == null || doc == null) { - region.x= 0; - region.y= 0; - return region; - } - - int start= p.getOffset(); - int length= p.getLength(); - - int startLine= 0; - try { - startLine= doc.getLineOfOffset(start); - } catch (BadLocationException e) { - // silently ignored - } - - int lineCount= 0; - - if (length == 0) { -// // if range length is 0 and if range starts a new line -// try { -// if (start == doc.getLineStartOffset(startLine)) { -// lines--; -// } -// } catch (BadLocationException e) { -// lines--; -// } - - } else { - int endLine= 0; - try { - endLine= doc.getLineOfOffset(start + length - 1); // why -1? - } catch (BadLocationException e) { - // silently ignored - } - lineCount= endLine-startLine+1; - } - - region.x= startLine; - region.y= lineCount; - return region; - } - - /* - * Scroll TextPart to the given line. - */ - public void vscroll(int line) { - - int srcViewSize= getLineCount(); - int srcExtentSize= getViewportLines(); - - if (srcViewSize > srcExtentSize) { - - if (line < 0) - line= 0; - - int cp= getSourceViewer().getTopIndex(); - if (cp != line) - getSourceViewer().setTopIndex(line + getDocumentRegionOffset()); - } - } - - public void addAction(String actionId, MergeViewerAction action) { - fActions.put(actionId, action); - } - - public IAction getAction(String actionId) { - IAction action= (IAction) fActions.get(actionId); - if (action == null) { - action= createAction(actionId); - if (action == null) - return null; - if (action instanceof MergeViewerAction) { - MergeViewerAction mva = (MergeViewerAction) action; - if (mva.isContentDependent()) - getSourceViewer().addTextListener(this); - if (mva.isSelectionDependent()) - getSourceViewer().addSelectionChangedListener(this); - - Utilities.initAction(action, fResourceBundle, "action." + actionId + "."); //$NON-NLS-1$ //$NON-NLS-2$ - } - addAction(actionId, action); - - } - if (action instanceof MergeViewerAction) { - MergeViewerAction mva = (MergeViewerAction) action; - if (mva.isEditableDependent() && !getSourceViewer().isEditable()) - return null; - } - return action; - } - - protected IAction createAction(String actionId) { - if (UNDO_ID.equals(actionId)) - return new TextOperationAction(ITextOperationTarget.UNDO, IWorkbenchCommandConstants.EDIT_UNDO, true, false, true); - if (REDO_ID.equals(actionId)) - return new TextOperationAction(ITextOperationTarget.REDO, IWorkbenchCommandConstants.EDIT_REDO, true, false, true); - if (CUT_ID.equals(actionId)) - return new TextOperationAction(ITextOperationTarget.CUT, IWorkbenchCommandConstants.EDIT_CUT, true, true, false); - if (COPY_ID.equals(actionId)) - return new TextOperationAction(ITextOperationTarget.COPY, IWorkbenchCommandConstants.EDIT_COPY, false, true, false); - if (PASTE_ID.equals(actionId)) - return new TextOperationAction(ITextOperationTarget.PASTE, IWorkbenchCommandConstants.EDIT_PASTE, true, false, false); - if (DELETE_ID.equals(actionId)) - return new TextOperationAction(ITextOperationTarget.DELETE, IWorkbenchCommandConstants.EDIT_DELETE, true, false, false); - if (SELECT_ALL_ID.equals(actionId)) - return new TextOperationAction(ITextOperationTarget.SELECT_ALL, IWorkbenchCommandConstants.EDIT_SELECT_ALL, false, false, false); - return null; - } - - public void selectionChanged(SelectionChangedEvent event) { - Iterator e= fActions.values().iterator(); - while (e.hasNext()) { - Object next = e.next(); - if (next instanceof MergeViewerAction) { - MergeViewerAction action = (MergeViewerAction) next; - if (action.isSelectionDependent()) - action.update(); - } - } - } - - public void textChanged(TextEvent event) { - updateContentDependantActions(); - } - - void updateContentDependantActions() { - Iterator e= fActions.values().iterator(); - while (e.hasNext()) { - Object next = e.next(); - if (next instanceof MergeViewerAction) { - MergeViewerAction action = (MergeViewerAction) next; - if (action.isContentDependent()) - action.update(); - } - } - } - - /* - * Allows the viewer to add menus and/or tools to the context menu. - */ - public void menuAboutToShow(IMenuManager menu) { - - menu.add(new Separator("undo")); //$NON-NLS-1$ - addMenu(menu, UNDO_ID); - addMenu(menu, REDO_ID); - menu.add(new GroupMarker("save")); //$NON-NLS-1$ - if (fAddSaveAction) - addSave(menu); - menu.add(new Separator("file")); //$NON-NLS-1$ - - menu.add(new Separator("ccp")); //$NON-NLS-1$ - addMenu(menu, CUT_ID); - addMenu(menu, COPY_ID); - addMenu(menu, PASTE_ID); - addMenu(menu, DELETE_ID); - addMenu(menu, SELECT_ALL_ID); - - menu.add(new Separator("edit")); //$NON-NLS-1$ - addMenu(menu, CHANGE_ENCODING_ID); - menu.add(new Separator("find")); //$NON-NLS-1$ - addMenu(menu, FIND_ID); - - menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - - menu.add(new Separator("text")); //$NON-NLS-1$ - for (Iterator iterator = textActions.iterator(); iterator.hasNext();) { - IAction action = (IAction) iterator.next(); - menu.add(action); - } - - menu.add(new Separator("rest")); //$NON-NLS-1$ - - // update all actions - // to get undo redo right - updateActions(); - } - - private void addMenu(IMenuManager menu, String actionId) { - IAction action= getAction(actionId); - if (action != null) - menu.add(action); - } - - private void addSave(IMenuManager menu) { - ICommandService commandService = (ICommandService) fContainer.getWorkbenchPart().getSite().getService(ICommandService.class); - final Command command= commandService.getCommand(IWorkbenchCommandConstants.FILE_SAVE); - - final IHandler handler = command.getHandler(); - if (handler != null) { - if (fSaveContributionItem == null) { - fSaveContributionItem = new CommandContributionItem( - new CommandContributionItemParameter(fContainer - .getWorkbenchPart().getSite(), null, command - .getId(), CommandContributionItem.STYLE_PUSH)); - } - // save is an editable dependent action, ie add only when edit - // is possible - if (handler.isHandled() && getSourceViewer().isEditable()) - menu.add(fSaveContributionItem); - } - } - - /** - * The viewer is no longer part of the UI, it's a wrapper only. The disposal - * doesn't take place while releasing the editor pane's children. The method - * have to be called it manually. The wrapped viewer is disposed as a - * regular viewer, while disposing the UI. - */ - public void dispose() { - getSourceViewer().removeTextListener(this); - getSourceViewer().removeSelectionChangedListener(this); - EditorsUI.getPreferenceStore().removePropertyChangeListener(fPreferenceChangeListener); - - IOperationHistory history = getHistory(); - if (history != null) - history.removeOperationHistoryListener(this); - } - - /** - * update all actions independent of their type - * - */ - public void updateActions() { - Iterator e= fActions.values().iterator(); - while (e.hasNext()) { - Object next = e.next(); - if (next instanceof MergeViewerAction) { - MergeViewerAction action = (MergeViewerAction) next; - action.update(); - } else if (next instanceof FindReplaceAction) { - FindReplaceAction action = (FindReplaceAction) next; - action.update(); - } else if (next instanceof ChangeEncodingAction) { - ChangeEncodingAction action = (ChangeEncodingAction) next; - action.update(); - } - } - } - - public void configure(SourceViewerConfiguration configuration) { - if (isConfigured ) - getSourceViewer().unconfigure(); - isConfigured = true; - getSourceViewer().configure(configuration); - } - - /** - * specific implementation to support a vertical ruler - * @param x - * @param y - * @param width - * @param height - */ - public void setBounds (int x, int y, int width, int height) { - if(getSourceViewer().getControl() instanceof Composite){ - ((Composite)getSourceViewer().getControl()).setBounds(x, y, width, height); - } else { - getSourceViewer().getTextWidget().setBounds(x, y, width, height); - } - } - - /** - * handle show/hide line numbers from editor preferences - * @param event - */ - protected void handlePropertyChangeEvent(PropertyChangeEvent event) { - - String key= event.getProperty(); - - if(key.equals(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER)){ - boolean b= EditorsUI.getPreferenceStore().getBoolean(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER); - if (b != fShowLineNumber){ - toggleLineNumberRuler(); - } - } else if (key.equals(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR)) { - updateLineNumberColumnPresentation(true); - } - } - - /** - * Hides or shows line number ruler column based of preference setting - */ - private void updateLineNumberRuler() - { - IVerticalRuler v= getVerticalRuler(getSourceViewer()); - if (v!=null && v instanceof CompositeRuler) { - CompositeRuler c= (CompositeRuler) v; - - if(!fShowLineNumber){ - if(fLineNumberColumn!=null){ - c.removeDecorator(fLineNumberColumn); - } - } else { - if(fLineNumberColumn==null){ - fLineNumberColumn = new LineNumberRulerColumn(); - updateLineNumberColumnPresentation(false); - } - c.addDecorator(0, fLineNumberColumn); - } - } - } - - /** - * Calls the <code>getVerticalRuler</code> method of the given viewer. - * - * TODO: don't use reflection - * - * @param viewer the viewer to call <code>getVerticalRuler</code> on - */ - private IVerticalRuler getVerticalRuler(SourceViewer viewer) { - try { - Method method= SourceViewer.class.getDeclaredMethod("getVerticalRuler", new Class[] {}); //$NON-NLS-1$ - method.setAccessible(true); - return (IVerticalRuler) method.invoke(viewer, new Object[] {}); - } catch (Throwable e) { - CompareUIPlugin.log(e); - } - return null; - } - - private void updateLineNumberColumnPresentation(boolean refresh) { - if (fLineNumberColumn == null) - return; - RGB rgb= getColorFromStore(EditorsUI.getPreferenceStore(), AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR); - if (rgb == null) - rgb= new RGB(0, 0, 0); - ISharedTextColors sharedColors= getSharedColors(); - fLineNumberColumn.setForeground(sharedColors.getColor(rgb)); - if (refresh) { - fLineNumberColumn.redraw(); - } - } - - private void layoutViewer() { - Control parent= getSourceViewer().getControl(); - if (parent instanceof Composite && !parent.isDisposed()) - ((Composite) parent).layout(true); - } - - private ISharedTextColors getSharedColors() { - return EditorsUI.getSharedTextColors(); - } - - private RGB getColorFromStore(IPreferenceStore store, String key) { - RGB rgb= null; - if (store.contains(key)) { - if (store.isDefault(key)) - rgb= PreferenceConverter.getDefaultColor(store, key); - else - rgb= PreferenceConverter.getColor(store, key); - } - return rgb; - } - - /** - * Toggles line number ruler column. - */ - private void toggleLineNumberRuler() - { - fShowLineNumber=!fShowLineNumber; - - updateLineNumberRuler(); - } - - public void addTextAction(IAction textEditorPropertyAction) { - textActions.add(textEditorPropertyAction); - } - - public void addAction(String id, IAction action) { - fActions.put(id, action); - } - - private IOperationHistory getHistory() { - if (PlatformUI.getWorkbench() == null) { - return null; - } - return PlatformUI.getWorkbench().getOperationSupport() - .getOperationHistory(); - } - - public void historyNotification(OperationHistoryEvent event) { - // This method updates the enablement of all content operations - // when the undo history changes. It could be localized to UNDO and REDO. - IUndoContext context = getUndoContext(); - if (context != null && event.getOperation().hasContext(context)) { - Display.getDefault().asyncExec(new Runnable() { - public void run() { - updateContentDependantActions(); - } - }); - } - } - - private IUndoContext getUndoContext() { - IUndoManager undoManager = getSourceViewer().getUndoManager(); - if (undoManager instanceof IUndoManagerExtension) - return ((IUndoManagerExtension)undoManager).getUndoContext(); - return null; - } - - /** - * @return the wrapped viewer - */ - public SourceViewer getSourceViewer() { - return fSourceViewer; - } - - public Object getAdapter(Class adapter) { - if (adapter == ITextEditor.class) { - return new TextEditorAdapter(); - } - return null; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerAction.java deleted file mode 100644 index b1b579c8e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerAction.java +++ /dev/null @@ -1,44 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.ui.texteditor.IUpdate; -import org.eclipse.jface.action.Action; - - -public abstract class MergeViewerAction extends Action implements IUpdate { - - private boolean fMutable; - private boolean fSelection; - private boolean fContent; - - public MergeViewerAction(boolean mutable, boolean selection, boolean content) { - fMutable= mutable; - fSelection= selection; - fContent= content; - } - - public boolean isSelectionDependent() { - return fSelection; - } - - public boolean isContentDependent() { - return fContent; - } - - public boolean isEditableDependent() { - return fMutable; - } - - public void update() { - // empty default implementation - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerContentProvider.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerContentProvider.java deleted file mode 100644 index a46445a28..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerContentProvider.java +++ /dev/null @@ -1,201 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.compare.*; -import org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider; -import org.eclipse.compare.structuremergeviewer.*; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.graphics.Image; - -/** - * Adapts any <code>ContentMergeViewer</code> to work on an <code>ICompareInput</code> - * e.g. a <code>DiffNode</code>. - */ -public class MergeViewerContentProvider implements IMergeViewerContentProvider { - - public static final char ANCESTOR_CONTRIBUTOR = 'A'; - public static final char RIGHT_CONTRIBUTOR = 'R'; - public static final char LEFT_CONTRIBUTOR = 'L'; - - private CompareConfiguration fCompareConfiguration; - private String fAncestorError; - private String fLeftError; - private String fRightError; - - public MergeViewerContentProvider(CompareConfiguration cc) { - fCompareConfiguration= cc; - } - - private boolean hasError() { - return fAncestorError != null || fLeftError != null || fRightError != null; - } - - public void dispose() { - // empty default implementation - } - - public void inputChanged(Viewer v, Object o1, Object o2) { - // we are not interested since we have no state - } - - //---- ancestor - - public void setAncestorError(String errorMessage) { - fAncestorError= errorMessage; - } - - public String getAncestorLabel(Object element) { - if (fAncestorError != null) - return fAncestorError; - return fCompareConfiguration.getAncestorLabel(element); - } - - public Image getAncestorImage(Object element) { - if (fAncestorError != null) - return null; - return fCompareConfiguration.getAncestorImage(element); - } - - public Object getAncestorContent(Object element) { - if (element instanceof ICompareInput) - return ((ICompareInput) element).getAncestor(); - return null; - } - - public boolean showAncestor(Object element) { - if (element instanceof ICompareInput) - return true; // fix for #45239: Show ancestor for incoming and outgoing changes - //return (((ICompareInput)element).getKind() & Differencer.DIRECTION_MASK) == Differencer.CONFLICTING; - return false; - } - - //---- left - - public void setLeftError(String errorMessage) { - fLeftError= errorMessage; - } - - public String getLeftLabel(Object element) { - if (fLeftError != null) - return fLeftError; - return fCompareConfiguration.getLeftLabel(element); - } - - public Image getLeftImage(Object element) { - if (fLeftError != null) - return null; - return fCompareConfiguration.getLeftImage(element); - } - - public Object getLeftContent(Object element) { - if (element instanceof ICompareInput) - return ((ICompareInput) element).getLeft(); - return null; - } - - public boolean isLeftEditable(Object element) { - if (hasError()) - return false; - if (element instanceof ICompareInput) { - Object left= ((ICompareInput) element).getLeft(); - if (left == null && element instanceof IDiffElement) { - IDiffElement parent= ((IDiffElement)element).getParent(); - if (parent instanceof ICompareInput) - left= ((ICompareInput) parent).getLeft(); - } - if (left instanceof IEditableContent) - return ((IEditableContent)left).isEditable(); - } - return false; - } - - public void saveLeftContent(Object element, byte[] bytes) { - if (element instanceof ICompareInput) { - ICompareInput node= (ICompareInput) element; - if (bytes != null) { - ITypedElement left= node.getLeft(); - // #9869: problem if left is null (because no resource exists yet) nothing is done! - if (left == null) { - node.copy(false); - left= node.getLeft(); - } - if (left instanceof IEditableContent) - ((IEditableContent)left).setContent(bytes); - if (node instanceof ResourceCompareInput.MyDiffNode) - ((ResourceCompareInput.MyDiffNode)node).fireChange(); - } else { - node.copy(false); - } - } - } - - //---- right - - public void setRightError(String errorMessage) { - fRightError= errorMessage; - } - - public String getRightLabel(Object element) { - if (fRightError != null) - return fRightError; - return fCompareConfiguration.getRightLabel(element); - } - - public Image getRightImage(Object element) { - if (fRightError != null) - return null; - return fCompareConfiguration.getRightImage(element); - } - - public Object getRightContent(Object element) { - if (element instanceof ICompareInput) - return ((ICompareInput) element).getRight(); - return null; - } - - public boolean isRightEditable(Object element) { - if (hasError()) - return false; - if (element instanceof ICompareInput) { - Object right= ((ICompareInput) element).getRight(); - if (right == null && element instanceof IDiffElement) { - IDiffContainer parent= ((IDiffElement)element).getParent(); - if (parent instanceof ICompareInput) - right= ((ICompareInput) parent).getRight(); - } - if (right instanceof IEditableContent) - return ((IEditableContent)right).isEditable(); - } - return false; - } - - public void saveRightContent(Object element, byte[] bytes) { - if (element instanceof ICompareInput) { - ICompareInput node= (ICompareInput) element; - if (bytes != null) { - ITypedElement right= node.getRight(); - // #9869: problem if right is null (because no resource exists yet) nothing is done! - if (right == null) { - node.copy(true); - right= node.getRight(); - } - if (right instanceof IEditableContent) - ((IEditableContent)right).setContent(bytes); - if (node instanceof ResourceCompareInput.MyDiffNode) - ((ResourceCompareInput.MyDiffNode)node).fireChange(); - } else { - node.copy(true); - } - } - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/NavigationEndDialog.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/NavigationEndDialog.java deleted file mode 100644 index 3ca58fe91..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/NavigationEndDialog.java +++ /dev/null @@ -1,48 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006 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 org.eclipse.jface.dialogs.*; -import org.eclipse.jface.preference.RadioGroupFieldEditor; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.*; - -public class NavigationEndDialog extends MessageDialogWithToggle { - - private final String[][] labelsAndValues; - private RadioGroupFieldEditor editor; - - public NavigationEndDialog(Shell parentShell, String dialogTitle, - Image dialogTitleImage, String dialogMessage, String[][] labelsAndValues) { - super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, - QUESTION, new String[] { IDialogConstants.OK_LABEL , IDialogConstants.CANCEL_LABEL}, 0, - CompareMessages.NavigationEndDialog_0, false); - this.labelsAndValues = labelsAndValues; - } - - protected Control createCustomArea(Composite parent) { - editor = new RadioGroupFieldEditor(ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL, CompareMessages.NavigationEndDialog_1, 1, - labelsAndValues, - parent, true); - editor.setPreferenceStore(CompareUIPlugin.getDefault().getPreferenceStore()); - editor.fillIntoGrid(parent, 1); - editor.load(); - return parent; - } - - protected void buttonPressed(int buttonId) { - if (buttonId == IDialogConstants.OK_ID) { - editor.store(); - } - super.buttonPressed(buttonId); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/NullViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/NullViewer.java deleted file mode 100644 index f9fce2b90..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/NullViewer.java +++ /dev/null @@ -1,35 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.*; - -import org.eclipse.compare.CompareViewerPane; - -/** - * Used whenever the input is null or no viewer can be found. - */ -public class NullViewer extends AbstractViewer { - - private Control fDummy; - - public NullViewer(Composite parent) { - - fDummy= new Tree(parent, SWT.NULL); - - CompareViewerPane.clearToolBar(parent); - } - - public Control getControl() { - return fDummy; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/OutlineViewerCreator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/OutlineViewerCreator.java deleted file mode 100644 index ee303531c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/OutlineViewerCreator.java +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 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 org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.core.runtime.*; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.widgets.Composite; - -/** - * Class which allows content merge viewer to provide a structure viewer that can be used in the outline - * view. - */ -public abstract class OutlineViewerCreator { - - /** - * Property constant that identifies the input of the outline view. - */ - public static final String PROP_INPUT = "org.eclipse.compare.OutlineInput"; //$NON-NLS-1$ - - private ListenerList listeners = new ListenerList(ListenerList.IDENTITY); - - /** - * Method called by the editor to create a structure viewer for the current content merge viewer. - * @param oldViewer the current viewer that is being used to show the structure - * @param input the input - * @param parent the parent composite - * @param configuration the compare configuration - * @return a viewer to be placed in the outline viewer or <code>null</code> - */ - public abstract Viewer findStructureViewer(Viewer oldViewer, ICompareInput input, - Composite parent, CompareConfiguration configuration); - - public abstract boolean hasViewerFor(Object input); - - public void addPropertyChangeListener(IPropertyChangeListener listener) { - listeners.add(listener); - } - - public void removePropertyChangeListener(IPropertyChangeListener listener) { - listeners.remove(listener); - } - - public void fireInputChange(Object oldInput, Object newInput) { - Object[] list = listeners.getListeners(); - final PropertyChangeEvent event = new PropertyChangeEvent(this, PROP_INPUT, oldInput, newInput); - for (int i = 0; i < list.length; i++) { - final IPropertyChangeListener listener = (IPropertyChangeListener)list[i]; - SafeRunner.run(new ISafeRunnable() { - public void run() throws Exception { - listener.propertyChange(event); - } - public void handleException(Throwable exception) { - // Logged by SafeRunner - } - }); - } - } - - public abstract Object getInput(); - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/OverlayPreferenceStore.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/OverlayPreferenceStore.java deleted file mode 100644 index de7ba253a..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/OverlayPreferenceStore.java +++ /dev/null @@ -1,452 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.preference.PreferenceStore; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; - -/** - * An overlaying preference store. - */ -public class OverlayPreferenceStore implements IPreferenceStore { - - - public static final class TypeDescriptor { - private TypeDescriptor() { - // nothing to do - } - } - - public static final TypeDescriptor BOOLEAN= new TypeDescriptor(); - public static final TypeDescriptor DOUBLE= new TypeDescriptor(); - public static final TypeDescriptor FLOAT= new TypeDescriptor(); - public static final TypeDescriptor INT= new TypeDescriptor(); - public static final TypeDescriptor LONG= new TypeDescriptor(); - public static final TypeDescriptor STRING= new TypeDescriptor(); - - public static class OverlayKey { - - TypeDescriptor fDescriptor; - String fKey; - - public OverlayKey(TypeDescriptor descriptor, String key) { - fDescriptor= descriptor; - fKey= key; - } - } - - private class PropertyListener implements IPropertyChangeListener { - - /* - * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent) - */ - public void propertyChange(PropertyChangeEvent event) { - OverlayKey key= findOverlayKey(event.getProperty()); - if (key != null) - propagateProperty(fParent, key, fStore); - } - } - - - private IPreferenceStore fParent; - private IPreferenceStore fStore; - private OverlayKey[] fOverlayKeys; - - private PropertyListener fPropertyListener; - - - public OverlayPreferenceStore(IPreferenceStore parent, OverlayKey[] overlayKeys) { - fParent= parent; - fOverlayKeys= overlayKeys; - fStore= new PreferenceStore(); - } - - private OverlayKey findOverlayKey(String key) { - for (int i= 0; i < fOverlayKeys.length; i++) { - if (fOverlayKeys[i].fKey.equals(key)) - return fOverlayKeys[i]; - } - return null; - } - - private boolean covers(String key) { - return (findOverlayKey(key) != null); - } - - private void propagateProperty(IPreferenceStore orgin, OverlayKey key, IPreferenceStore target) { - - if (orgin.isDefault(key.fKey)) { - if (!target.isDefault(key.fKey)) - target.setToDefault(key.fKey); - return; - } - - TypeDescriptor d= key.fDescriptor; - if (BOOLEAN == d) { - - boolean originValue= orgin.getBoolean(key.fKey); - boolean targetValue= target.getBoolean(key.fKey); - if (targetValue != originValue) - target.setValue(key.fKey, originValue); - - } else if (DOUBLE == d) { - - double originValue= orgin.getDouble(key.fKey); - double targetValue= target.getDouble(key.fKey); - if (targetValue != originValue) - target.setValue(key.fKey, originValue); - - } else if (FLOAT == d) { - - float originValue= orgin.getFloat(key.fKey); - float targetValue= target.getFloat(key.fKey); - if (targetValue != originValue) - target.setValue(key.fKey, originValue); - - } else if (INT == d) { - - int originValue= orgin.getInt(key.fKey); - int targetValue= target.getInt(key.fKey); - if (targetValue != originValue) - target.setValue(key.fKey, originValue); - - } else if (LONG == d) { - - long originValue= orgin.getLong(key.fKey); - long targetValue= target.getLong(key.fKey); - if (targetValue != originValue) - target.setValue(key.fKey, originValue); - - } else if (STRING == d) { - - String originValue= orgin.getString(key.fKey); - String targetValue= target.getString(key.fKey); - if (targetValue != null && originValue != null && !targetValue.equals(originValue)) - target.setValue(key.fKey, originValue); - - } - } - - public void propagate() { - for (int i= 0; i < fOverlayKeys.length; i++) - propagateProperty(fStore, fOverlayKeys[i], fParent); - } - - private void loadProperty(IPreferenceStore orgin, OverlayKey key, IPreferenceStore target, boolean forceInitialization) { - TypeDescriptor d= key.fDescriptor; - if (BOOLEAN == d) { - - if (forceInitialization) - target.setValue(key.fKey, true); - target.setValue(key.fKey, orgin.getBoolean(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultBoolean(key.fKey)); - - } else if (DOUBLE == d) { - - if (forceInitialization) - target.setValue(key.fKey, 1.0D); - target.setValue(key.fKey, orgin.getDouble(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultDouble(key.fKey)); - - } else if (FLOAT == d) { - - if (forceInitialization) - target.setValue(key.fKey, 1.0F); - target.setValue(key.fKey, orgin.getFloat(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultFloat(key.fKey)); - - } else if (INT == d) { - - if (forceInitialization) - target.setValue(key.fKey, 1); - target.setValue(key.fKey, orgin.getInt(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultInt(key.fKey)); - - } else if (LONG == d) { - - if (forceInitialization) - target.setValue(key.fKey, 1L); - target.setValue(key.fKey, orgin.getLong(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultLong(key.fKey)); - - } else if (STRING == d) { - - if (forceInitialization) - target.setValue(key.fKey, "1"); //$NON-NLS-1$ - target.setValue(key.fKey, orgin.getString(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultString(key.fKey)); - - } - } - - public void load() { - for (int i= 0; i < fOverlayKeys.length; i++) - loadProperty(fParent, fOverlayKeys[i], fStore, true); - } - - public void loadDefaults() { - for (int i= 0; i < fOverlayKeys.length; i++) - setToDefault(fOverlayKeys[i].fKey); - } - - public void start() { - if (fPropertyListener == null) { - fPropertyListener= new PropertyListener(); - fParent.addPropertyChangeListener(fPropertyListener); - } - } - - public void stop() { - if (fPropertyListener != null) { - fParent.removePropertyChangeListener(fPropertyListener); - fPropertyListener= null; - } - } - - /* - * @see IPreferenceStore#addPropertyChangeListener(IPropertyChangeListener) - */ - public void addPropertyChangeListener(IPropertyChangeListener listener) { - fStore.addPropertyChangeListener(listener); - } - - /* - * @see IPreferenceStore#removePropertyChangeListener(IPropertyChangeListener) - */ - public void removePropertyChangeListener(IPropertyChangeListener listener) { - fStore.removePropertyChangeListener(listener); - } - - /* - * @see IPreferenceStore#firePropertyChangeEvent(String, Object, Object) - */ - public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) { - fStore.firePropertyChangeEvent(name, oldValue, newValue); - } - - /* - * @see IPreferenceStore#contains(String) - */ - public boolean contains(String name) { - return fStore.contains(name); - } - - /* - * @see IPreferenceStore#getBoolean(String) - */ - public boolean getBoolean(String name) { - return fStore.getBoolean(name); - } - - /* - * @see IPreferenceStore#getDefaultBoolean(String) - */ - public boolean getDefaultBoolean(String name) { - return fStore.getDefaultBoolean(name); - } - - /* - * @see IPreferenceStore#getDefaultDouble(String) - */ - public double getDefaultDouble(String name) { - return fStore.getDefaultDouble(name); - } - - /* - * @see IPreferenceStore#getDefaultFloat(String) - */ - public float getDefaultFloat(String name) { - return fStore.getDefaultFloat(name); - } - - /* - * @see IPreferenceStore#getDefaultInt(String) - */ - public int getDefaultInt(String name) { - return fStore.getDefaultInt(name); - } - - /* - * @see IPreferenceStore#getDefaultLong(String) - */ - public long getDefaultLong(String name) { - return fStore.getDefaultLong(name); - } - - /* - * @see IPreferenceStore#getDefaultString(String) - */ - public String getDefaultString(String name) { - return fStore.getDefaultString(name); - } - - /* - * @see IPreferenceStore#getDouble(String) - */ - public double getDouble(String name) { - return fStore.getDouble(name); - } - - /* - * @see IPreferenceStore#getFloat(String) - */ - public float getFloat(String name) { - return fStore.getFloat(name); - } - - /* - * @see IPreferenceStore#getInt(String) - */ - public int getInt(String name) { - return fStore.getInt(name); - } - - /* - * @see IPreferenceStore#getLong(String) - */ - public long getLong(String name) { - return fStore.getLong(name); - } - - /* - * @see IPreferenceStore#getString(String) - */ - public String getString(String name) { - return fStore.getString(name); - } - - /* - * @see IPreferenceStore#isDefault(String) - */ - public boolean isDefault(String name) { - return fStore.isDefault(name); - } - - /* - * @see IPreferenceStore#needsSaving() - */ - public boolean needsSaving() { - return fStore.needsSaving(); - } - - /* - * @see IPreferenceStore#putValue(String, String) - */ - public void putValue(String name, String value) { - if (covers(name)) - fStore.putValue(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, double) - */ - public void setDefault(String name, double value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, float) - */ - public void setDefault(String name, float value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, int) - */ - public void setDefault(String name, int value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, long) - */ - public void setDefault(String name, long value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, String) - */ - public void setDefault(String name, String value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, boolean) - */ - public void setDefault(String name, boolean value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setToDefault(String) - */ - public void setToDefault(String name) { - fStore.setToDefault(name); - } - - /* - * @see IPreferenceStore#setValue(String, double) - */ - public void setValue(String name, double value) { - if (covers(name)) - fStore.setValue(name, value); - } - - /* - * @see IPreferenceStore#setValue(String, float) - */ - public void setValue(String name, float value) { - if (covers(name)) - fStore.setValue(name, value); - } - - /* - * @see IPreferenceStore#setValue(String, int) - */ - public void setValue(String name, int value) { - if (covers(name)) - fStore.setValue(name, value); - } - - /* - * @see IPreferenceStore#setValue(String, long) - */ - public void setValue(String name, long value) { - if (covers(name)) - fStore.setValue(name, value); - } - - /* - * @see IPreferenceStore#setValue(String, String) - */ - public void setValue(String name, String value) { - if (covers(name)) - fStore.setValue(name, value); - } - - /* - * @see IPreferenceStore#setValue(String, boolean) - */ - public void setValue(String name, boolean value) { - if (covers(name)) - fStore.setValue(name, value); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.java deleted file mode 100644 index 4d5eca397..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.java +++ /dev/null @@ -1,20 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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; - - -public class ReplaceWithEditionAction extends EditionAction { - - public ReplaceWithEditionAction() { - super(true, "org.eclipse.compare.internal.ReplaceWithEditionAction"); //$NON-NLS-1$ - fHelpContextId= ICompareContextIds.REPLACE_WITH_EDITION_DIALOG; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.properties deleted file mode 100644 index 94d650eac..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.properties +++ /dev/null @@ -1,40 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2006 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 -############################################################################### - -# @(#)ReplaceWithEditionAction.properties -# -# Resources for ReplaceWithEditionAction.java - -title= Replace from Local History - -treeTitleFormat= Local History of ''{0}'' -dateIcon= obj16/day_obj.gif -timeIcon= obj16/resource_obj.gif - -treeFormat= {0} -workspaceTreeFormat= {0} (Workspace File) -parseErrorFormat= {0} (Parse Error) - -editionLabel= Local History ({0}) -workspaceEditionLabel= Workspace File - -targetLabel= {0} - -todayFormat= Today ({0}) -yesterdayFormat= Yesterday ({0}) -dayFormat= {0} - -buttonLabel= Replace - -noLocalHistoryError= No local history available for selected resource. -replaceError=Cannot replace resource (reason: {0}). - -taskName=Replacing diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithPreviousEditionAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithPreviousEditionAction.java deleted file mode 100644 index ecd4e87be..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithPreviousEditionAction.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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; - - -public class ReplaceWithPreviousEditionAction extends EditionAction { - - public ReplaceWithPreviousEditionAction() { - super(true, - "org.eclipse.compare.internal.ReplaceWithEditionAction"); //$NON-NLS-1$ - fPrevious= true; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResizableDialog.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResizableDialog.java deleted file mode 100644 index d18bf6c7c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResizableDialog.java +++ /dev/null @@ -1,162 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.util.ResourceBundle; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.PlatformUI; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.DialogSettings; - - -/** - * Base class for resizable Dialogs with persistent window bounds. - */ -public abstract class ResizableDialog extends Dialog { - - // dialog store id constants - private final static String DIALOG_BOUNDS_KEY= "ResizableDialogBounds"; //$NON-NLS-1$ - private static final String X= "x"; //$NON-NLS-1$ - private static final String Y= "y"; //$NON-NLS-1$ - private static final String WIDTH= "width"; //$NON-NLS-1$ - private static final String HEIGHT= "height"; //$NON-NLS-1$ - - protected ResourceBundle fBundle; - private Rectangle fNewBounds; - private IDialogSettings fSettings; - private String fContextId; - - - public ResizableDialog(Shell parent, ResourceBundle bundle) { - super(parent); - setShellStyle(getShellStyle() | SWT.RESIZE | SWT.MAX); - - fBundle= bundle; - - fSettings= CompareUIPlugin.getDefault().getDialogSettings(); - } - - public void setHelpContextId(String contextId) { - fContextId= contextId; - } - - /* - * @see org.eclipse.jface.window.Window#configureShell(Shell) - */ - protected void configureShell(Shell newShell) { - super.configureShell(newShell); - if (fContextId != null) - PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, fContextId); - } - - protected Point getInitialSize() { - - int width= 0; - int height= 0; - - final Shell s= getShell(); - if (s != null) { - s.addControlListener( - new ControlListener() { - public void controlMoved(ControlEvent arg0) { - fNewBounds= s.getBounds(); - } - public void controlResized(ControlEvent arg0) { - fNewBounds= s.getBounds(); - } - } - ); - } - - IDialogSettings bounds= fSettings.getSection(DIALOG_BOUNDS_KEY); - if (bounds == null) { - if (fBundle != null) { - width= Utilities.getInteger(fBundle, WIDTH, 0); - height= Utilities.getInteger(fBundle, HEIGHT, 0); - Shell shell= getParentShell(); - if (shell != null) { - Point parentSize= shell.getSize(); - if (width <= 0) - width= parentSize.x-300; - if (height <= 0) - height= parentSize.y-200; - } - } else { - Shell shell= getParentShell(); - if (shell != null) { - Point parentSize= shell.getSize(); - width= parentSize.x-100; - height= parentSize.y-100; - } - } - if (width < 700) - width= 700; - if (height < 500) - height= 500; - } else { - try { - width= bounds.getInt(WIDTH); - } catch (NumberFormatException e) { - width= 700; - } - try { - height= bounds.getInt(HEIGHT); - } catch (NumberFormatException e) { - height= 500; - } - } - - return new Point(width, height); - } - - protected Point getInitialLocation(Point initialSize) { - Point loc= super.getInitialLocation(initialSize); - - IDialogSettings bounds= fSettings.getSection(DIALOG_BOUNDS_KEY); - if (bounds != null) { - try { - loc.x= bounds.getInt(X); - } catch (NumberFormatException e) { - // silently ignored - } - try { - loc.y= bounds.getInt(Y); - } catch (NumberFormatException e) { - // silently ignored - } - } - return loc; - } - - public boolean close() { - boolean closed= super.close(); - if (closed && fNewBounds != null) - saveBounds(fNewBounds); - return closed; - } - - private void saveBounds(Rectangle bounds) { - IDialogSettings dialogBounds= fSettings.getSection(DIALOG_BOUNDS_KEY); - if (dialogBounds == null) { - dialogBounds= new DialogSettings(DIALOG_BOUNDS_KEY); - fSettings.addSection(dialogBounds); - } - dialogBounds.put(X, bounds.x); - dialogBounds.put(Y, bounds.y); - dialogBounds.put(WIDTH, bounds.width); - dialogBounds.put(HEIGHT, bounds.height); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java deleted file mode 100644 index fe72e6b24..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java +++ /dev/null @@ -1,553 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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 - * Matt McCutchen (hashproduct+eclipse@gmail.com) - Bug 35390 Three-way compare cannot select (mis-selects) )ancestor resource - * Aleksandra Wozniak (aleksandra.k.wozniak@gmail.com) - Bug 239959 - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.lang.reflect.InvocationTargetException; -import java.util.HashSet; -import java.util.Set; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.ZipFileStructureCreator; -import org.eclipse.compare.structuremergeviewer.DiffNode; -import org.eclipse.compare.structuremergeviewer.DiffTreeViewer; -import org.eclipse.compare.structuremergeviewer.Differencer; -import org.eclipse.compare.structuremergeviewer.IDiffContainer; -import org.eclipse.compare.structuremergeviewer.IDiffElement; -import org.eclipse.compare.structuremergeviewer.IStructureComparator; -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.window.Window; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Shell; - -import com.ibm.icu.text.MessageFormat; - - -/** - * A two-way or three-way compare for arbitrary IResources. - */ -class ResourceCompareInput extends CompareEditorInput { - - private static final boolean NORMALIZE_CASE= true; - - private boolean fThreeWay= false; - private Object fRoot; - private IStructureComparator fAncestor; - private IStructureComparator fLeft; - private IStructureComparator fRight; - private IResource fAncestorResource; - private IResource fLeftResource; - private IResource fRightResource; - private DiffTreeViewer fDiffViewer; - private IAction fOpenAction; - - class MyDiffNode extends DiffNode { - - private boolean fDirty= false; - private ITypedElement fLastId; - private String fLastName; - - - public MyDiffNode(IDiffContainer parent, int description, ITypedElement ancestor, ITypedElement left, ITypedElement right) { - super(parent, description, ancestor, left, right); - } - public void fireChange() { - super.fireChange(); - setDirty(true); - fDirty= true; - if (fDiffViewer != null) - fDiffViewer.refresh(this); - } - void clearDirty() { - fDirty= false; - } - public String getName() { - if (fLastName == null) - fLastName= super.getName(); - if (fDirty) - return '<' + fLastName + '>'; - return fLastName; - } - - public ITypedElement getId() { - ITypedElement id= super.getId(); - if (id == null) - return fLastId; - fLastId= id; - return id; - } - } - - static class FilteredBufferedResourceNode extends BufferedResourceNode { - FilteredBufferedResourceNode(IResource resource) { - super(resource); - } - protected IStructureComparator createChild(IResource child) { - String name= child.getName(); - if (CompareUIPlugin.getDefault().filter(name, child instanceof IContainer, false)) - return null; - return new FilteredBufferedResourceNode(child); - } - } - - /* - * Creates an compare editor input for the given selection. - */ - ResourceCompareInput(CompareConfiguration config) { - super(config); - } - - public Viewer createDiffViewer(Composite parent) { - fDiffViewer= new DiffTreeViewer(parent, getCompareConfiguration()) { - protected void fillContextMenu(IMenuManager manager) { - - if (fOpenAction == null) { - fOpenAction= new Action() { - public void run() { - handleOpen(null); - } - }; - Utilities.initAction(fOpenAction, getBundle(), "action.CompareContents."); //$NON-NLS-1$ - } - - boolean enable= false; - ISelection selection= getSelection(); - if (selection instanceof IStructuredSelection) { - IStructuredSelection ss= (IStructuredSelection)selection; - if (ss.size() == 1) { - Object element= ss.getFirstElement(); - if (element instanceof MyDiffNode) { - ITypedElement te= ((MyDiffNode) element).getId(); - if (te != null) - enable= !ITypedElement.FOLDER_TYPE.equals(te.getType()); - } else - enable= true; - } - } - fOpenAction.setEnabled(enable); - - manager.add(fOpenAction); - - super.fillContextMenu(manager); - } - }; - return fDiffViewer; - } - - class SelectAncestorDialog extends MessageDialog { - private IResource[] theResources; - IResource ancestorResource; - IResource leftResource; - IResource rightResource; - - private Button[] buttons; - - public SelectAncestorDialog(Shell parentShell, IResource[] theResources) { - super(parentShell, CompareMessages.SelectAncestorDialog_title, - null, CompareMessages.SelectAncestorDialog_message, - MessageDialog.QUESTION, - new String[] { IDialogConstants.OK_LABEL, - IDialogConstants.CANCEL_LABEL }, 0); - this.theResources = theResources; - } - - protected Control createCustomArea(Composite parent) { - Composite composite = new Composite(parent, SWT.NONE); - composite.setLayout(new GridLayout()); - buttons = new Button[3]; - for (int i = 0; i < 3; i++) { - buttons[i] = new Button(composite, SWT.RADIO); - buttons[i].addSelectionListener(selectionListener); - buttons[i].setText(NLS.bind(CompareMessages.SelectAncestorDialog_option, - theResources[i].getFullPath().toPortableString())); - buttons[i].setFont(parent.getFont()); - // set initial state - buttons[i].setSelection(i == 0); - } - pickAncestor(0); - return composite; - } - - private void pickAncestor(int i) { - ancestorResource = theResources[i]; - leftResource = theResources[i == 0 ? 1 : 0]; - rightResource = theResources[i == 2 ? 1 : 2]; - } - - private SelectionListener selectionListener = new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - Button selectedButton = (Button) e.widget; - if (!selectedButton.getSelection()) - return; - for (int i = 0; i < 3; i++) - if (selectedButton == buttons[i]) - pickAncestor(i); - } - }; - } - // If the compare is three-way, this method asks the user which resource - // to use as the ancestor. Depending on the value of - // showSelectAncestorDialog flag it uses different dialogs to get the - // feedback from the user. Returns false if the user cancels the prompt, - // true otherwise. - boolean setSelection(ISelection s, Shell shell, boolean showSelectAncestorDialog) { - - if (!showSelectAncestorDialog) - return showCompareWithOtherResourceDialog(shell, s); - - IResource[] selection= Utilities.getResources(s); - - fThreeWay= selection.length == 3; - - if (fThreeWay) { - SelectAncestorDialog dialog = - new SelectAncestorDialog(shell, selection); - int code = dialog.open(); - if (code != Window.OK) - return false; - - fAncestorResource= dialog.ancestorResource; - fAncestor= getStructure(fAncestorResource); - fLeftResource= dialog.leftResource; - fRightResource= dialog.rightResource; - } else { - fAncestorResource= null; - fAncestor= null; - fLeftResource= selection[0]; - fRightResource= selection[1]; - } - fLeft= getStructure(fLeftResource); - fRight= getStructure(fRightResource); - return true; - } - - private boolean showCompareWithOtherResourceDialog(Shell shell, ISelection s) { - CompareWithOtherResourceDialog dialog = new CompareWithOtherResourceDialog(shell, s); - if (dialog.open() != IDialogConstants.OK_ID) - return false; - IResource[] selection = dialog.getResult(); - if (!checkSelection(selection)) - return false; - - fThreeWay = selection.length == 3; - if (fThreeWay) { - fAncestorResource = selection[0]; - fAncestor = getStructure(fAncestorResource); - fLeftResource = selection[1]; - fRightResource = selection[2]; - } else { - fAncestorResource = null; - fAncestor = null; - fLeftResource = selection[0]; - fRightResource = selection[1]; - } - fLeft= getStructure(fLeftResource); - fRight= getStructure(fRightResource); - return true; - } - - private boolean checkSelection(IResource[] resources) { - for (int i = 0; i < resources.length; i++) - if (resources[i] == null) - return false; - return true; - } - - /* - * Returns true if compare can be executed for the given selection. - */ - public boolean isEnabled(ISelection s) { - - IResource[] selection= Utilities.getResources(s); - if (selection.length < 2 || selection.length > 3) - return false; - - boolean threeWay= selection.length == 3; - - if (threeWay) - // It only makes sense if they're all mutually comparable. - // If not, the user should compare two of them. - return comparable(selection[0], selection[1]) - && comparable(selection[0], selection[2]) - && comparable(selection[1], selection[2]); - - return comparable(selection[0], selection[1]); - } - - /** - * Initializes the images in the compare configuration. - */ - void initializeCompareConfiguration() { - CompareConfiguration cc= getCompareConfiguration(); - if (fLeftResource != null) { - cc.setLeftLabel(buildLabel(fLeftResource)); - cc.setLeftImage(CompareUIPlugin.getImage(fLeftResource)); - } - if (fRightResource != null) { - cc.setRightLabel(buildLabel(fRightResource)); - cc.setRightImage(CompareUIPlugin.getImage(fRightResource)); - } - if (fThreeWay && fAncestorResource != null) { - cc.setAncestorLabel(buildLabel(fAncestorResource)); - cc.setAncestorImage(CompareUIPlugin.getImage(fAncestorResource)); - } - } - - /* - * Returns true if both resources are either structured or unstructured. - */ - private boolean comparable(IResource c1, IResource c2) { - return hasStructure(c1) == hasStructure(c2); - } - - /* - * Returns true if the given argument has a structure. - */ - private boolean hasStructure(IResource input) { - - if (input instanceof IContainer) - return true; - - if (input instanceof IFile) { - IFile file= (IFile) input; - String type= file.getFileExtension(); - if (type != null) { - type= normalizeCase(type); - return "JAR".equals(type) || "ZIP".equals(type); //$NON-NLS-2$ //$NON-NLS-1$ - } - } - - return false; - } - - /* - * Creates a <code>IStructureComparator</code> for the given input. - * Returns <code>null</code> if no <code>IStructureComparator</code> - * can be found for the <code>IResource</code>. - */ - private IStructureComparator getStructure(IResource input) { - - if (input instanceof IContainer) - return new FilteredBufferedResourceNode(input); - - if (input instanceof IFile) { - IStructureComparator rn= new FilteredBufferedResourceNode(input); - IFile file= (IFile) input; - String type= normalizeCase(file.getFileExtension()); - if ("JAR".equals(type) || "ZIP".equals(type)) //$NON-NLS-2$ //$NON-NLS-1$ - return new ZipFileStructureCreator().getStructure(rn); - return rn; - } - return null; - } - - /* - * Performs a two-way or three-way diff on the current selection. - */ - public Object prepareInput(IProgressMonitor pm) throws InvocationTargetException { - - try { - // fix for PR 1GFMLFB: ITPUI:WIN2000 - files that are out of sync with the file system appear as empty - fLeftResource.refreshLocal(IResource.DEPTH_INFINITE, pm); - fRightResource.refreshLocal(IResource.DEPTH_INFINITE, pm); - if (fThreeWay && fAncestorResource != null) - fAncestorResource.refreshLocal(IResource.DEPTH_INFINITE, pm); - // end fix - - pm.beginTask(Utilities.getString("ResourceCompare.taskName"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$ - - String leftLabel= fLeftResource.getName(); - String rightLabel= fRightResource.getName(); - - String title; - if (fThreeWay) { - String format= Utilities.getString("ResourceCompare.threeWay.title"); //$NON-NLS-1$ - String ancestorLabel= fAncestorResource.getName(); - title= MessageFormat.format(format, new String[] {ancestorLabel, leftLabel, rightLabel}); - } else { - String format= Utilities.getString("ResourceCompare.twoWay.title"); //$NON-NLS-1$ - title= MessageFormat.format(format, new String[] {leftLabel, rightLabel}); - } - setTitle(title); - - Differencer d= new Differencer() { - protected Object visit(Object parent, int description, Object ancestor, Object left, Object right) { - return new MyDiffNode((IDiffContainer) parent, description, (ITypedElement)ancestor, (ITypedElement)left, (ITypedElement)right); - } - }; - - fRoot= d.findDifferences(fThreeWay, pm, null, fAncestor, fLeft, fRight); - return fRoot; - - } catch (CoreException ex) { - throw new InvocationTargetException(ex); - } finally { - pm.done(); - } - } - - public String getToolTipText() { - if (fLeftResource != null && fRightResource != null) { - String leftLabel= fLeftResource.getFullPath().makeRelative().toString(); - String rightLabel= fRightResource.getFullPath().makeRelative().toString(); - if (fThreeWay) { - String format= Utilities.getString("ResourceCompare.threeWay.tooltip"); //$NON-NLS-1$ - String ancestorLabel= fAncestorResource.getFullPath().makeRelative().toString(); - return MessageFormat.format(format, new String[] {ancestorLabel, leftLabel, rightLabel}); - } - String format= Utilities.getString("ResourceCompare.twoWay.tooltip"); //$NON-NLS-1$ - return MessageFormat.format(format, new String[] {leftLabel, rightLabel}); - } - // fall back - return super.getToolTipText(); - } - - private String buildLabel(IResource r) { - // for a linked resource in a hidden project use its local file system location - if (r.isLinked() && r.getProject().isHidden()) - return r.getLocation().toString(); - String n= r.getFullPath().toString(); - if (n.charAt(0) == IPath.SEPARATOR) - return n.substring(1); - return n; - } - - public void saveChanges(IProgressMonitor pm) throws CoreException { - super.saveChanges(pm); - if (fRoot instanceof DiffNode) { - try { - commit(pm, (DiffNode) fRoot); - } finally { - if (fDiffViewer != null) - fDiffViewer.refresh(); - setDirty(false); - } - } - } - - /* - * Recursively walks the diff tree and commits all changes. - */ - private static void commit(IProgressMonitor pm, DiffNode node) throws CoreException { - - if (node instanceof MyDiffNode) - ((MyDiffNode)node).clearDirty(); - - ITypedElement left= node.getLeft(); - if (left instanceof BufferedResourceNode) - ((BufferedResourceNode) left).commit(pm); - - ITypedElement right= node.getRight(); - if (right instanceof BufferedResourceNode) - ((BufferedResourceNode) right).commit(pm); - - IDiffElement[] children= node.getChildren(); - if (children != null) { - for (int i= 0; i < children.length; i++) { - IDiffElement element= children[i]; - if (element instanceof DiffNode) - commit(pm, (DiffNode) element); - } - } - } - - /* (non Javadoc) - * see IAdaptable.getAdapter - */ - public Object getAdapter(Class adapter) { - if (IFile.class.equals(adapter)) { - IProgressMonitor pm= new NullProgressMonitor(); - // flush changes in any dirty viewer - flushViewers(pm); - IFile[] files= (IFile[]) getAdapter(IFile[].class); - if (files != null && files.length > 0) - return files[0]; // can only return one: limitation on IDE.saveAllEditors; see #64617 - return null; - } - if (IFile[].class.equals(adapter)) { - HashSet collector= new HashSet(); - collectDirtyResources(fRoot, collector); - return collector.toArray(new IFile[collector.size()]); - } - return super.getAdapter(adapter); - } - - private void collectDirtyResources(Object o, Set collector) { - if (o instanceof DiffNode) { - DiffNode node= (DiffNode) o; - - ITypedElement left= node.getLeft(); - if (left instanceof BufferedResourceNode) { - BufferedResourceNode bn= (BufferedResourceNode) left; - if (bn.isDirty()) { - IResource resource= bn.getResource(); - if (resource instanceof IFile) - collector.add(resource); - } - } - - ITypedElement right= node.getRight(); - if (right instanceof BufferedResourceNode) { - BufferedResourceNode bn= (BufferedResourceNode) right; - if (bn.isDirty()) { - IResource resource= bn.getResource(); - if (resource instanceof IFile) - collector.add(resource); - } - } - - IDiffElement[] children= node.getChildren(); - if (children != null) { - for (int i= 0; i < children.length; i++) { - IDiffElement element= children[i]; - if (element instanceof DiffNode) - collectDirtyResources(element, collector); - } - } - } - } - - private static String normalizeCase(String s) { - if (NORMALIZE_CASE && s != null) - return s.toUpperCase(); - return s; - } - - public boolean canRunAsJob() { - return true; - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ShowWhitespaceAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ShowWhitespaceAction.java deleted file mode 100644 index 2b2e14771..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ShowWhitespaceAction.java +++ /dev/null @@ -1,165 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 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.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.text.WhitespaceCharacterPainter; -import org.eclipse.jface.text.source.SourceViewer; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.ui.editors.text.EditorsUI; -import org.eclipse.ui.texteditor.AbstractTextEditor; - -public class ShowWhitespaceAction extends TextEditorPropertyAction { - - private Map fPainters; - private boolean isWhitespaceShowing; - private boolean[] fNeedsPainters; - /** @since 3.7 */ - private boolean fShowLeadingSpaces; - /** @since 3.7 */ - private boolean fShowEnclosedSpaces; - /** @since 3.7 */ - private boolean fShowTrailingSpaces; - /** @since 3.7 */ - private boolean fShowLeadingIdeographicSpaces; - /** @since 3.7 */ - private boolean fShowEnclosedIdeographicSpaces; - /** @since 3.7 */ - private boolean fShowTrailingIdeographicSpace; - /** @since 3.7 */ - private boolean fShowLeadingTabs; - /** @since 3.7 */ - private boolean fShowEnclosedTabs; - /** @since 3.7 */ - private boolean fShowTrailingTabs; - /** @since 3.7 */ - private boolean fShowCarriageReturn; - /** @since 3.7 */ - private boolean fShowLineFeed; - /** @since 3.7 */ - private IPreferenceStore fStore = EditorsUI.getPreferenceStore(); - /** @since 3.7 */ - private int fAlpha; - - public ShowWhitespaceAction(MergeSourceViewer[] viewers, boolean[] needsPainters) { - super(CompareMessages.ShowWhitespaceAction_0, viewers, AbstractTextEditor.PREFERENCE_SHOW_WHITESPACE_CHARACTERS); - fNeedsPainters = needsPainters; - synchronizeWithPreference(); - } - - /* - * (non-Javadoc) - * @see org.eclipse.compare.internal.TextEditorPropertyAction#synchronizeWithPreference() - */ - protected void synchronizeWithPreference() { - boolean checked = false; - if (fStore != null) { - checked = fStore.getBoolean(getPreferenceKey()); - fShowLeadingSpaces = fStore.getBoolean(AbstractTextEditor.PREFERENCE_SHOW_LEADING_SPACES); - fShowEnclosedSpaces = fStore.getBoolean(AbstractTextEditor.PREFERENCE_SHOW_ENCLOSED_SPACES); - fShowTrailingSpaces = fStore.getBoolean(AbstractTextEditor.PREFERENCE_SHOW_TRAILING_SPACES); - fShowLeadingIdeographicSpaces = fStore.getBoolean(AbstractTextEditor.PREFERENCE_SHOW_LEADING_IDEOGRAPHIC_SPACES); - fShowEnclosedIdeographicSpaces = fStore.getBoolean(AbstractTextEditor.PREFERENCE_SHOW_ENCLOSED_IDEOGRAPHIC_SPACES); - fShowTrailingIdeographicSpace = fStore.getBoolean(AbstractTextEditor.PREFERENCE_SHOW_TRAILING_IDEOGRAPHIC_SPACES); - fShowLeadingTabs = fStore.getBoolean(AbstractTextEditor.PREFERENCE_SHOW_LEADING_TABS); - fShowEnclosedTabs = fStore.getBoolean(AbstractTextEditor.PREFERENCE_SHOW_ENCLOSED_TABS); - fShowTrailingTabs = fStore.getBoolean(AbstractTextEditor.PREFERENCE_SHOW_TRAILING_TABS); - fShowCarriageReturn = fStore.getBoolean(AbstractTextEditor.PREFERENCE_SHOW_CARRIAGE_RETURN); - fShowLineFeed = fStore.getBoolean(AbstractTextEditor.PREFERENCE_SHOW_LINE_FEED); - fAlpha = fStore.getInt(AbstractTextEditor.PREFERENCE_WHITESPACE_CHARACTER_ALPHA_VALUE); - } - if (checked != isChecked()) { - if (toggleState(checked)) - setChecked(checked); - } else if (fNeedsPainters != null && checked) { - hideWhitespace(); - showWhitespace(); - } - } - - /* - * (non-Javadoc) - * @see org.eclipse.compare.internal.TextEditorPropertyAction#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) - */ - public void propertyChange(PropertyChangeEvent event) { - String property = event.getProperty(); - if (property.equals(getPreferenceKey()) || AbstractTextEditor.PREFERENCE_SHOW_LEADING_SPACES.equals(property) || AbstractTextEditor.PREFERENCE_SHOW_ENCLOSED_SPACES.equals(property) - || AbstractTextEditor.PREFERENCE_SHOW_TRAILING_SPACES.equals(property) || AbstractTextEditor.PREFERENCE_SHOW_LEADING_IDEOGRAPHIC_SPACES.equals(property) - || AbstractTextEditor.PREFERENCE_SHOW_ENCLOSED_IDEOGRAPHIC_SPACES.equals(property) || AbstractTextEditor.PREFERENCE_SHOW_TRAILING_IDEOGRAPHIC_SPACES.equals(property) - || AbstractTextEditor.PREFERENCE_SHOW_LEADING_TABS.equals(property) || AbstractTextEditor.PREFERENCE_SHOW_ENCLOSED_TABS.equals(property) - || AbstractTextEditor.PREFERENCE_SHOW_TRAILING_TABS.equals(property) || AbstractTextEditor.PREFERENCE_SHOW_CARRIAGE_RETURN.equals(property) - || AbstractTextEditor.PREFERENCE_SHOW_LINE_FEED.equals(property) || AbstractTextEditor.PREFERENCE_WHITESPACE_CHARACTER_ALPHA_VALUE.equals(property)) { - synchronizeWithPreference(); - } - } - - protected boolean toggleState(boolean checked) { - if (fNeedsPainters == null) - return false; // Not initialized yet - if (checked) { - showWhitespace(); - } else { - hideWhitespace(); - } - return true; - } - - private synchronized Map getPainters() { - if (fPainters == null) - fPainters = new HashMap(); - return fPainters; - } - - private void showWhitespace() { - if (isWhitespaceShowing) - return; - try { - Map painters = getPainters(); - MergeSourceViewer[] viewers = getViewers(); - for (int i = 0; i < viewers.length; i++) { - if (fNeedsPainters[i]) { - MergeSourceViewer viewer = viewers[i]; - SourceViewer sourceViewer = viewer.getSourceViewer(); - WhitespaceCharacterPainter painter; - if (fStore != null) { - painter = new WhitespaceCharacterPainter(sourceViewer, fShowLeadingSpaces, fShowEnclosedSpaces, fShowTrailingSpaces, fShowLeadingIdeographicSpaces, - fShowEnclosedIdeographicSpaces, fShowTrailingIdeographicSpace, fShowLeadingTabs, fShowEnclosedTabs, fShowTrailingTabs, fShowCarriageReturn, fShowLineFeed, fAlpha); - } else { - painter = new WhitespaceCharacterPainter(sourceViewer); - } - sourceViewer.addPainter(painter); - painters.put(viewer, painter); - } - } - } finally { - isWhitespaceShowing = true; - } - } - - private void hideWhitespace() { - Map painters = getPainters(); - for (Iterator iterator = painters.keySet().iterator(); iterator.hasNext();) { - MergeSourceViewer viewer = (MergeSourceViewer) iterator.next(); - WhitespaceCharacterPainter painter = (WhitespaceCharacterPainter)painters.get(viewer); - if (painter != null) { - viewer.getSourceViewer().removePainter(painter); - painter.deactivate(true); - } - } - painters.clear(); - isWhitespaceShowing = false; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/SimpleTextViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/SimpleTextViewer.java deleted file mode 100644 index a3d1bac5d..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/SimpleTextViewer.java +++ /dev/null @@ -1,66 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; - -import org.eclipse.jface.text.source.SourceViewer; -import org.eclipse.jface.text.Document; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.compare.*; -import org.eclipse.compare.structuremergeviewer.ICompareInput; - - -public class SimpleTextViewer extends AbstractViewer { - - private SourceViewer fSourceViewer; - private ICompareInput fInput; - - - SimpleTextViewer(Composite parent) { - fSourceViewer= new SourceViewer(parent, null, SWT.H_SCROLL | SWT.V_SCROLL); - fSourceViewer.setEditable(false); - } - - public Control getControl() { - return fSourceViewer.getTextWidget(); - } - - public void setInput(Object input) { - if (input instanceof IStreamContentAccessor) { - fSourceViewer.setDocument(new Document(getString(input))); - } else if (input instanceof ICompareInput) { - fInput= (ICompareInput) input; - ITypedElement left= fInput.getLeft(); - fSourceViewer.setDocument(new Document(getString(left))); - } - } - - public Object getInput() { - return fInput; - } - - private String getString(Object input) { - - if (input instanceof IStreamContentAccessor) { - try { - return Utilities.readString((IStreamContentAccessor) input); - } catch (CoreException ex) { - // NeedWork - CompareUIPlugin.log(ex); - } - } - return ""; //$NON-NLS-1$ - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/StreamMergerDescriptor.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/StreamMergerDescriptor.java deleted file mode 100644 index 5fc385ed2..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/StreamMergerDescriptor.java +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2006 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 org.eclipse.compare.IStreamMerger; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; - -/** - * A factory proxy for creating a StructureCreator. - */ -class StreamMergerDescriptor { - - private final static String CLASS_ATTRIBUTE= "class"; //$NON-NLS-1$ - - private IConfigurationElement fElement; - - /* - * Creates a new sorter node with the given configuration element. - */ - public StreamMergerDescriptor(IConfigurationElement element) { - fElement= element; - } - - /* - * Creates a new stream merger from this node. - */ - public IStreamMerger createStreamMerger() { - try { - return (IStreamMerger)fElement.createExecutableExtension(CLASS_ATTRIBUTE); - } catch (CoreException ex) { - //ExceptionHandler.handle(ex, SearchMessages.getString("Search.Error.createSorter.title"), SearchMessages.getString("Search.Error.createSorter.message")); //$NON-NLS-2$ //$NON-NLS-1$ - return null; - } catch (ClassCastException ex) { - //ExceptionHandler.displayMessageDialog(ex, SearchMessages.getString("Search.Error.createSorter.title"), SearchMessages.getString("Search.Error.createSorter.message")); //$NON-NLS-2$ //$NON-NLS-1$ - return null; - } - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/StructureCreatorDescriptor.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/StructureCreatorDescriptor.java deleted file mode 100644 index 7f9011c55..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/StructureCreatorDescriptor.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2006 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 org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; - -import org.eclipse.compare.structuremergeviewer.IStructureCreator; - -/** - * A factory proxy for creating a StructureCreator. - */ -public class StructureCreatorDescriptor { - - private final static String CLASS_ATTRIBUTE= "class"; //$NON-NLS-1$ - private final static String EXTENSIONS_ATTRIBUTE= "extensions"; //$NON-NLS-1$ - - private IConfigurationElement fElement; - - /* - * Creates a new sorter node with the given configuration element. - */ - public StructureCreatorDescriptor(IConfigurationElement element) { - fElement= element; - } - - /* - * Creates a new sorter from this node. - */ - public IStructureCreator createStructureCreator() { - try { - return (IStructureCreator)fElement.createExecutableExtension(CLASS_ATTRIBUTE); - } catch (CoreException ex) { - CompareUIPlugin.log(ex.getStatus()); - //ExceptionHandler.handle(ex, SearchMessages.getString("Search.Error.createSorter.title"), SearchMessages.getString("Search.Error.createSorter.message")); //$NON-NLS-2$ //$NON-NLS-1$ - return null; - } catch (ClassCastException ex) { - //ExceptionHandler.displayMessageDialog(ex, SearchMessages.getString("Search.Error.createSorter.title"), SearchMessages.getString("Search.Error.createSorter.message")); //$NON-NLS-2$ //$NON-NLS-1$ - return null; - } - } - - /* - * Returns the structure creator's extensions. - */ - public String getExtension() { - return fElement.getAttribute(EXTENSIONS_ATTRIBUTE); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TabFolderLayout.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TabFolderLayout.java deleted file mode 100644 index fc8e61c1e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TabFolderLayout.java +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Layout; - -public class TabFolderLayout extends Layout { - - protected Point computeSize (Composite composite, int wHint, int hHint, boolean flushCache) { - if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) - return new Point(wHint, hHint); - - Control [] children = composite.getChildren (); - int count = children.length; - int maxWidth = 0, maxHeight = 0; - for (int i=0; i<count; i++) { - Control child = children [i]; - Point pt = child.computeSize (SWT.DEFAULT, SWT.DEFAULT, flushCache); - maxWidth = Math.max (maxWidth, pt.x); - maxHeight = Math.max (maxHeight, pt.y); - } - - if (wHint != SWT.DEFAULT) - maxWidth= wHint; - if (hHint != SWT.DEFAULT) - maxHeight= hHint; - - return new Point(maxWidth, maxHeight); - - } - - protected void layout (Composite composite, boolean flushCache) { - Rectangle rect= composite.getClientArea(); - - Control[] children = composite.getChildren(); - for (int i = 0; i < children.length; i++) { - children[i].setBounds(rect); - } - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TextEditorPropertyAction.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TextEditorPropertyAction.java deleted file mode 100644 index f7a49847f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TextEditorPropertyAction.java +++ /dev/null @@ -1,91 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 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.internal; - -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.ui.editors.text.EditorsUI; - -public class TextEditorPropertyAction extends Action implements IPropertyChangeListener { - - private final MergeSourceViewer[] viewers; - private final String preferenceKey; - private IPreferenceStore store; - - public TextEditorPropertyAction(String label, MergeSourceViewer[] viewers, String preferenceKey) { - super(label, IAction.AS_CHECK_BOX); - this.viewers = viewers; - this.preferenceKey = preferenceKey; - this.store = EditorsUI.getPreferenceStore(); - if (store != null) - store.addPropertyChangeListener(this); - synchronizeWithPreference(); - addActionToViewers(); - } - - private void addActionToViewers() { - for (int i = 0; i < viewers.length; i++) { - MergeSourceViewer viewer = viewers[i]; - viewer.addTextAction(this); - } - } - - public MergeSourceViewer[] getViewers() { - return viewers; - } - - public void propertyChange(PropertyChangeEvent event) { - if (event.getProperty().equals(getPreferenceKey())) { - synchronizeWithPreference(); - } - } - - protected void synchronizeWithPreference() { - boolean checked = false; - if (store != null) { - checked = store.getBoolean(getPreferenceKey()); - } - if (checked != isChecked()) { - if (toggleState(checked)) - setChecked(checked); - } - } - - public String getPreferenceKey() { - return preferenceKey; - } - - public void run() { - toggleState(isChecked()); - if (store != null) - store.setValue(getPreferenceKey(), isChecked()); - } - - public void dispose() { - if (store != null) - store.removePropertyChangeListener(this); - } - - /** - * @param checked - * new state - * @return <code>true</code> if state has been changed, toggle has been - * successful - */ - protected boolean toggleState(boolean checked) { - // No-op by default - return false; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TextMergeViewerCreator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TextMergeViewerCreator.java deleted file mode 100644 index 7c92beb49..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TextMergeViewerCreator.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.swt.widgets.Composite; - -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.compare.*; -import org.eclipse.compare.contentmergeviewer.TextMergeViewer; - -/** - * A factory object for the <code>TextMergeViewer</code>. - * This indirection is necessary because only objects with a default - * constructor can be created via an extension point - * (this precludes Viewers). - */ -public class TextMergeViewerCreator implements IViewerCreator { - - public Viewer createViewer(Composite parent, CompareConfiguration mp) { - return new TextMergeViewer(parent, mp); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TextViewerCreator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TextViewerCreator.java deleted file mode 100644 index e6dbe26d3..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TextViewerCreator.java +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.swt.widgets.Composite; - -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.IViewerCreator; - - -/** - * A factory object for the <code>TextMergeViewer</code>. - * This indirection is necessary because only objects with a default - * constructor can be created via an extension point - * (this precludes Viewers). - */ -public class TextViewerCreator implements IViewerCreator { - - public Viewer createViewer(Composite parent, CompareConfiguration mp) { - return new SimpleTextViewer(parent); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java deleted file mode 100644 index ec9c67605..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java +++ /dev/null @@ -1,917 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.SocketTimeoutException; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareUI; -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.core.patch.HunkResult; -import org.eclipse.compare.internal.patch.PatchMessages; -import org.eclipse.compare.patch.IHunk; -import org.eclipse.compare.structuremergeviewer.DiffNode; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.core.resources.IEncodedStorage; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourceAttributes; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.resources.mapping.ResourceMapping; -import org.eclipse.core.resources.mapping.ResourceMappingContext; -import org.eclipse.core.resources.mapping.ResourceTraversal; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.ISafeRunnable; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.core.runtime.MultiStatus; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.SafeRunner; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.SubMonitor; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.dialogs.ErrorDialog; -import org.eclipse.jface.operation.IRunnableContext; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.swt.custom.BusyIndicator; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Widget; -import org.eclipse.ui.IActionBars; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.IWorkbenchPartSite; -import org.eclipse.ui.IWorkbenchSite; -import org.eclipse.ui.progress.IWorkbenchSiteProgressService; -import org.eclipse.ui.texteditor.IDocumentProvider; - -import com.ibm.icu.text.MessageFormat; - -/** - * Convenience and utility methods. - */ -public class Utilities { - - private static final IPath ICONS_PATH= new Path("$nl$/icons/full/"); //$NON-NLS-1$ - - public static IWorkbenchPartSite findSite(Control c) { - while (c != null && !c.isDisposed()) { - Object data= c.getData(); - if (data instanceof IWorkbenchPart) - return ((IWorkbenchPart)data).getSite(); - c= c.getParent(); - } - return null; - } - - public static IActionBars findActionBars(Control c) { - while (c != null && !c.isDisposed()) { - Object data= c.getData(); - if (data instanceof CompareEditor) - return ((CompareEditor)data).getActionBars(); - - // PR 1GDVZV7: ITPVCM:WIN98 - CTRL + C does not work in Java source compare - if (data instanceof IViewPart) - return ((IViewPart)data).getViewSite().getActionBars(); - // end PR 1GDVZV7 - - c= c.getParent(); - } - return null; - } - - public static void setEnableComposite(Composite composite, boolean enable) { - Control[] children= composite.getChildren(); - for (int i= 0; i < children.length; i++) - children[i].setEnabled(enable); - } - - public static boolean getBoolean(CompareConfiguration cc, String key, boolean dflt) { - if (cc != null) { - Object value= cc.getProperty(key); - if (value instanceof Boolean) - return ((Boolean) value).booleanValue(); - } - return dflt; - } - - public static void firePropertyChange(ListenerList listenerList, Object source, String property, Object old, Object newValue) { - PropertyChangeEvent event= new PropertyChangeEvent(source, property, old, newValue); - firePropertyChange(listenerList, event); - } - - public static void firePropertyChange(final ListenerList listenerList, final PropertyChangeEvent event) { - if (listenerList == null || listenerList.isEmpty()) - return; - // Legacy listeners may expect to get notified in the UI thread - Runnable runnable = new Runnable() { - public void run() { - if (listenerList != null) { - Object[] listeners= listenerList.getListeners(); - for (int i= 0; i < listeners.length; i++) { - final IPropertyChangeListener listener= (IPropertyChangeListener) listeners[i]; - SafeRunner.run(new ISafeRunnable() { - public void run() throws Exception { - listener.propertyChange(event); - } - public void handleException(Throwable exception) { - // Logged by SafeRunner - } - }); - } - } - } - }; - if (Display.getCurrent() == null) { - Display.getDefault().syncExec(runnable); - } else { - runnable.run(); - } - } - - public static boolean okToUse(Widget widget) { - return widget != null && !widget.isDisposed(); - } - - private static ArrayList internalGetResources(ISelection selection, Class type) { - ArrayList tmp= new ArrayList(); - if (selection instanceof IStructuredSelection) { - Object[] s= ((IStructuredSelection)selection).toArray(); - - for (int i= 0; i < s.length; i++) { - IResource resource= null; - Object o= s[i]; - if (type.isInstance(o)) { - resource= (IResource) o; - - } else if (o instanceof ResourceMapping) { - try { - ResourceTraversal[] travs= ((ResourceMapping)o).getTraversals(ResourceMappingContext.LOCAL_CONTEXT, null); - if (travs != null) { - for (int k= 0; k < travs.length; k++) { - IResource[] resources= travs[k].getResources(); - for (int j= 0; j < resources.length; j++) { - if (type.isInstance(resources[j]) && resources[j].isAccessible()) - tmp.add(resources[j]); - } - } - } - } catch (CoreException ex) { - CompareUIPlugin.log(ex); - } - } else if (o instanceof IAdaptable) { - IAdaptable a= (IAdaptable) o; - Object adapter= a.getAdapter(IResource.class); - if (type.isInstance(adapter)) - resource= (IResource) adapter; - } - - if (resource != null && resource.isAccessible()) - tmp.add(resource); - } - } - return tmp; - } - - - /* - * Convenience method: extract all accessible <code>IResources</code> from given selection. - * Never returns null. - */ - public static IResource[] getResources(ISelection selection) { - ArrayList tmp= internalGetResources(selection, IResource.class); - return (IResource[]) tmp.toArray(new IResource[tmp.size()]); - } - - /* - * Convenience method: extract all accessible <code>IFiles</code> from given selection. - * Never returns null. - */ - public static IFile[] getFiles(ISelection selection) { - ArrayList tmp= internalGetResources(selection, IFile.class); - return (IFile[]) tmp.toArray(new IFile[tmp.size()]); - } - - public static byte[] readBytes(InputStream in) { - ByteArrayOutputStream bos= new ByteArrayOutputStream(); - try { - while (true) { - int c= in.read(); - if (c == -1) - break; - bos.write(c); - } - - } catch (IOException ex) { - return null; - - } finally { - Utilities.close(in); - try { - bos.close(); - } catch (IOException x) { - // silently ignored - } - } - - return bos.toByteArray(); - } - - public static IPath getIconPath(Display display) { - return ICONS_PATH; - } - - /* - * Initialize the given Action from a ResourceBundle. - */ - public static void initAction(IAction a, ResourceBundle bundle, String prefix) { - - String labelKey= "label"; //$NON-NLS-1$ - String tooltipKey= "tooltip"; //$NON-NLS-1$ - String imageKey= "image"; //$NON-NLS-1$ - String descriptionKey= "description"; //$NON-NLS-1$ - - if (prefix != null && prefix.length() > 0) { - labelKey= prefix + labelKey; - tooltipKey= prefix + tooltipKey; - imageKey= prefix + imageKey; - descriptionKey= prefix + descriptionKey; - } - - a.setText(getString(bundle, labelKey, labelKey)); - a.setToolTipText(getString(bundle, tooltipKey, null)); - a.setDescription(getString(bundle, descriptionKey, null)); - - String relPath= getString(bundle, imageKey, null); - if (relPath != null && relPath.trim().length() > 0) { - - String dPath; - String ePath; - - if (relPath.indexOf("/") >= 0) { //$NON-NLS-1$ - String path= relPath.substring(1); - dPath= 'd' + path; - ePath= 'e' + path; - } else { - dPath= "dlcl16/" + relPath; //$NON-NLS-1$ - ePath= "elcl16/" + relPath; //$NON-NLS-1$ - } - - ImageDescriptor id= CompareUIPlugin.getImageDescriptor(dPath); // we set the disabled image first (see PR 1GDDE87) - if (id != null) - a.setDisabledImageDescriptor(id); - id= CompareUIPlugin.getImageDescriptor(ePath); - if (id != null) { - a.setImageDescriptor(id); - a.setHoverImageDescriptor(id); - } - } - } - - public static void initToggleAction(IAction a, ResourceBundle bundle, String prefix, boolean checked) { - - String tooltip= null; - if (checked) - tooltip= getString(bundle, prefix + "tooltip.checked", null); //$NON-NLS-1$ - else - tooltip= getString(bundle, prefix + "tooltip.unchecked", null); //$NON-NLS-1$ - if (tooltip == null) - tooltip= getString(bundle, prefix + "tooltip", null); //$NON-NLS-1$ - - if (tooltip != null) - a.setToolTipText(tooltip); - - String description= null; - if (checked) - description= getString(bundle, prefix + "description.checked", null); //$NON-NLS-1$ - else - description= getString(bundle, prefix + "description.unchecked", null); //$NON-NLS-1$ - if (description == null) - description= getString(bundle, prefix + "description", null); //$NON-NLS-1$ - - if (description != null) - a.setDescription(description); - - } - - public static String getString(ResourceBundle bundle, String key, String dfltValue) { - - if (bundle != null) { - try { - return bundle.getString(key); - } catch (MissingResourceException x) { - // fall through - } - } - return dfltValue; - } - - public static String getFormattedString(ResourceBundle bundle, String key, String arg) { - - if (bundle != null) { - try { - return MessageFormat.format(bundle.getString(key), new String[] { arg }); - } catch (MissingResourceException x) { - CompareUIPlugin.log(x); - } - } - return "!" + key + "!"; //$NON-NLS-2$ //$NON-NLS-1$ - } - - public static String getString(String key) { - try { - return CompareUI.getResourceBundle().getString(key); - } catch (MissingResourceException e) { - return "!" + key + "!"; //$NON-NLS-2$ //$NON-NLS-1$ - } - } - - public static String getFormattedString(String key, String arg) { - try { - return MessageFormat.format(CompareUI.getResourceBundle().getString(key), new String[] { arg }); - } catch (MissingResourceException e) { - return "!" + key + "!"; //$NON-NLS-2$ //$NON-NLS-1$ - } - } - - public static String getFormattedString(String key, String arg0, String arg1) { - try { - return MessageFormat.format(CompareUI.getResourceBundle().getString(key), new String[] { arg0, arg1 }); - } catch (MissingResourceException e) { - return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ - } - } - - public static String getString(ResourceBundle bundle, String key) { - return getString(bundle, key, key); - } - - public static int getInteger(ResourceBundle bundle, String key, int dfltValue) { - - if (bundle != null) { - try { - String s= bundle.getString(key); - if (s != null) - return Integer.parseInt(s); - } catch (NumberFormatException x) { - CompareUIPlugin.log(x); - } catch (MissingResourceException x) { - // silently ignore Exception - } - } - return dfltValue; - } - - /** - * Answers <code>true</code> if the given selection contains resources that don't - * have overlapping paths and <code>false</code> otherwise. - */ - /* - public static boolean isSelectionNonOverlapping() throws TeamException { - IResource[] resources = getSelectedResources(); - // allow operation for non-overlapping resource selections - if(resources.length>0) { - List validPaths = new ArrayList(2); - for (int i = 0; i < resources.length; i++) { - IResource resource = resources[i]; - - // only allow cvs resources to be selected - if(RepositoryProvider.getProvider(resource.getProject(), CVSProviderPlugin.getTypeId()) == null) { - return false; - } - - // check if this resource overlaps other selections - IPath resourceFullPath = resource.getFullPath(); - if(!validPaths.isEmpty()) { - for (Iterator it = validPaths.iterator(); it.hasNext();) { - IPath path = (IPath) it.next(); - if(path.isPrefixOf(resourceFullPath) || - resourceFullPath.isPrefixOf(path)) { - return false; - } - } - } - validPaths.add(resourceFullPath); - - // ensure that resources are managed - ICVSResource cvsResource = CVSWorkspaceRoot.getCVSResourceFor(resource); - if(cvsResource.isFolder()) { - if( ! ((ICVSFolder)cvsResource).isCVSFolder()) return false; - } else { - if( ! cvsResource.isManaged()) return false; - } - } - return true; - } - return false; - } - */ - - /* validate edit utilities */ - - /** - * Status constant indicating that an validateEdit call has changed the - * content of a file on disk. - */ - private static final int VALIDATE_EDIT_PROBLEM= 10004; - - /** - * Constant used to indicate that tests are being run. - */ - public static boolean RUNNING_TESTS = false; - - /** - * Constant used while testing the indicate that changes should be flushed - * when the compare input changes and a viewer is dirty. - */ - public static boolean TESTING_FLUSH_ON_COMPARE_INPUT_CHANGE = false; - - /* - * Makes the given resources committable. Committable means that all - * resources are writeable and that the content of the resources hasn't - * changed by calling <code>validateEdit</code> for a given file on - * <tt>IWorkspace</tt>. - * - * @param resources the resources to be checked - * @param shell the Shell passed to <code>validateEdit</code> as a context - * @return returns <code>true</code> if all resources are committable, <code>false</code> otherwise - * - * @see org.eclipse.core.resources.IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], java.lang.Object) - */ - public static boolean validateResource(IResource resource, Shell shell, String title) { - return validateResources(new IResource[] { resource }, shell, title); - } - - /* - * Makes the given resources committable. Committable means that all - * resources are writeable and that the content of the resources hasn't - * changed by calling <code>validateEdit</code> for a given file on - * <tt>IWorkspace</tt>. - * - * @param resources the resources to be checked - * @param shell the Shell passed to <code>validateEdit</code> as a context - * @return returns <code>true</code> if all resources are committable, <code>false</code> otherwise - * - * @see org.eclipse.core.resources.IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], java.lang.Object) - */ - public static boolean validateResources(List resources, Shell shell, String title) { - IResource r[]= (IResource[]) resources.toArray(new IResource[resources.size()]); - return validateResources(r, shell, title); - } - - /* - * Makes the given resources committable. Committable means that all - * resources are writeable and that the content of the resources hasn't - * changed by calling <code>validateEdit</code> for a given file on - * <tt>IWorkspace</tt>. - * - * @param resources the resources to be checked - * @param shell the Shell passed to <code>validateEdit</code> as a context - * @return returns <code>true</code> if all resources are committable, <code>false</code> otherwise - * - * @see org.eclipse.core.resources.IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], java.lang.Object) - */ - public static boolean validateResources(IResource[] resources, Shell shell, String title) { - - // get all readonly files - List readOnlyFiles= getReadonlyFiles(resources); - if (readOnlyFiles.size() == 0) - return true; - - // get timestamps of readonly files before validateEdit - Map oldTimeStamps= createModificationStampMap(readOnlyFiles); - - IFile[] files= (IFile[]) readOnlyFiles.toArray(new IFile[readOnlyFiles.size()]); - IStatus status= ResourcesPlugin.getWorkspace().validateEdit(files, shell); - if (! status.isOK()) { - String message= getString("ValidateEdit.error.unable_to_perform"); //$NON-NLS-1$ - displayError(shell, title, status, message); - return false; - } - - IStatus modified= null; - Map newTimeStamps= createModificationStampMap(readOnlyFiles); - for (Iterator iter= oldTimeStamps.keySet().iterator(); iter.hasNext();) { - IFile file= (IFile) iter.next(); - if (file.isReadOnly()) { - IStatus entry= new Status(IStatus.ERROR, - CompareUIPlugin.getPluginId(), - VALIDATE_EDIT_PROBLEM, - getFormattedString("ValidateEdit.error.stillReadonly", file.getFullPath().toString()), //$NON-NLS-1$ - null); - modified= addStatus(modified, entry); - } else if (! oldTimeStamps.get(file).equals(newTimeStamps.get(file))) { - IStatus entry= new Status(IStatus.ERROR, - CompareUIPlugin.getPluginId(), - VALIDATE_EDIT_PROBLEM, - getFormattedString("ValidateEdit.error.fileModified", file.getFullPath().toString()), //$NON-NLS-1$ - null); - modified= addStatus(modified, entry); - } - } - if (modified != null) { - String message= getString("ValidateEdit.error.unable_to_perform"); //$NON-NLS-1$ - displayError(shell, title, modified, message); - return false; - } - return true; - } - - private static void displayError(final Shell shell, final String title, final IStatus status, final String message) { - if (Display.getCurrent() != null) - ErrorDialog.openError(shell, title, message, status); - else { - Display.getDefault().syncExec(new Runnable() { - public void run() { - ErrorDialog.openError(shell, title, message, status); - } - }); - } - } - - private static List getReadonlyFiles(IResource[] resources) { - List readOnlyFiles= new ArrayList(); - for (int i= 0; i < resources.length; i++) { - IResource resource= resources[i]; - ResourceAttributes resourceAttributes= resource.getResourceAttributes(); - if (resource.getType() == IResource.FILE && resourceAttributes != null && resourceAttributes.isReadOnly()) - readOnlyFiles.add(resource); - } - return readOnlyFiles; - } - - private static Map createModificationStampMap(List files) { - Map map= new HashMap(); - for (Iterator iter= files.iterator(); iter.hasNext(); ) { - IFile file= (IFile)iter.next(); - map.put(file, new Long(file.getModificationStamp())); - } - return map; - } - - private static IStatus addStatus(IStatus status, IStatus entry) { - - if (status == null) - return entry; - - if (status.isMultiStatus()) { - ((MultiStatus)status).add(entry); - return status; - } - - MultiStatus result= new MultiStatus(CompareUIPlugin.getPluginId(), - VALIDATE_EDIT_PROBLEM, - getString("ValidateEdit.error.unable_to_perform"), null); //$NON-NLS-1$ - result.add(status); - result.add(entry); - return result; - } - - // encoding - - public static String readString(IStreamContentAccessor sca, String encoding) throws CoreException { - String s = null; - try { - try { - s= Utilities.readString(sca.getContents(), encoding); - } catch (UnsupportedEncodingException e) { - if (!encoding.equals(ResourcesPlugin.getEncoding())) { - s = Utilities.readString(sca.getContents(), ResourcesPlugin.getEncoding()); - } - } - } catch (IOException e) { - throw new CoreException(new Status(IStatus.ERROR, CompareUIPlugin.PLUGIN_ID, 0, e.getMessage(), e)); - } - return s; - } - - /* - * Returns null if an error occurred. - */ - public static String readString(InputStream is, String encoding) throws IOException { - return readString(is, encoding, -1, null); - } - - public static String readString(InputStream is, String encoding, int length, IProgressMonitor monitor) throws IOException { - SubMonitor progress = SubMonitor.convert(monitor); - progress.setWorkRemaining(length); - if (is == null) - return null; - BufferedReader reader= null; - try { - StringBuffer buffer= new StringBuffer(); - char[] part= new char[2048]; - int read= 0; - reader= new BufferedReader(new InputStreamReader(is, encoding)); - while ((read= reader.read(part)) != -1) { - buffer.append(part, 0, read); - progress.worked(2048); - if (progress.isCanceled()) - throw new OperationCanceledException(); - } - - return buffer.toString(); - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException ex) { - // silently ignored - } - } - } - } - - public static String getCharset(Object resource) { - if (resource instanceof IEncodedStorage) { - try { - return ((IEncodedStorage)resource).getCharset(); - } catch (CoreException ex) { - CompareUIPlugin.log(ex); - } - } - return ResourcesPlugin.getEncoding(); - } - - public static byte[] getBytes(String s, String encoding) { - byte[] bytes= null; - if (s != null) { - try { - bytes= s.getBytes(encoding); - } catch (UnsupportedEncodingException e) { - bytes= s.getBytes(); - } - } - return bytes; - } - - public static String readString(IStreamContentAccessor sa) throws CoreException { - String encoding= null; - if (sa instanceof IEncodedStreamContentAccessor) - encoding= ((IEncodedStreamContentAccessor)sa).getCharset(); - if (encoding == null) - encoding= ResourcesPlugin.getEncoding(); - return Utilities.readString(sa, encoding); - } - - public static void close(InputStream is) { - if (is != null) { - try { - is.close(); - } catch (IOException ex) { - // silently ignored - } - } - } - - public static IResource getFirstResource(ISelection selection) { - IResource[] resources = getResources(selection); - if (resources.length > 0) - return resources[0]; - return null; - } - - public static Object getAdapter(Object element, Class adapterType, boolean load) { - if (adapterType.isInstance(element)) - return element; - if (element instanceof IAdaptable) { - Object adapted = ((IAdaptable) element).getAdapter(adapterType); - if (adapterType.isInstance(adapted)) - return adapted; - } - if (load) { - Object adapted = Platform.getAdapterManager().loadAdapter(element, adapterType.getName()); - if (adapterType.isInstance(adapted)) - return adapted; - } else { - Object adapted = Platform.getAdapterManager().getAdapter(element, adapterType); - if (adapterType.isInstance(adapted)) - return adapted; - } - return null; - } - - public static Object getAdapter(Object element, Class adapterType) { - return getAdapter(element, adapterType, false); - } - - public static ITypedElement getLeg(char type, Object input) { - if (input instanceof ICompareInput) { - switch (type) { - case MergeViewerContentProvider.ANCESTOR_CONTRIBUTOR: - return ((ICompareInput)input).getAncestor(); - case MergeViewerContentProvider.LEFT_CONTRIBUTOR: - return ((ICompareInput)input).getLeft(); - case MergeViewerContentProvider.RIGHT_CONTRIBUTOR: - return ((ICompareInput)input).getRight(); - } - } - return null; - } - - public static IDocument getDocument(char type, Object element, boolean isUsingDefaultContentProvider, boolean canHaveSharedDocument) { - ITypedElement te= getLeg(type, element); - if (te == null) - return null; - if (te instanceof IDocument) - return (IDocument) te; - if (te instanceof IDocumentRange) - return ((IDocumentRange) te).getDocument(); - - if (isUsingDefaultContentProvider && canHaveSharedDocument) { - ISharedDocumentAdapter sda = (ISharedDocumentAdapter)Utilities.getAdapter(te, ISharedDocumentAdapter.class, true); - if (sda != null) { - IEditorInput input= sda.getDocumentKey(te); - if (input != null) { - IDocumentProvider provider = SharedDocumentAdapter.getDocumentProvider(input); - if (provider != null) - return provider.getDocument(input); - } - } - } - - if (te instanceof IStreamContentAccessor) - return DocumentManager.get(te); - - return null; - } - - /** - * Return whether either the left or right sides of the given input - * represents a hunk. A hunk is a portion of a file. - * @param input the compare input - * @return whether the left or right side of the input represents a hunk - */ - public static boolean isHunk(Object input) { - if (input != null && input instanceof DiffNode){ - ITypedElement right = ((DiffNode) input).getRight(); - if (right != null) { - Object element = Utilities.getAdapter(right, IHunk.class); - if (element instanceof IHunk) - return true; - } - ITypedElement left = ((DiffNode) input).getLeft(); - if (left != null) { - Object element = Utilities.getAdapter(left, IHunk.class); - if (element instanceof IHunk) - return true; - } - } - return false; - } - - public static boolean isHunkOk(Object input) { - if (input != null && input instanceof DiffNode){ - ITypedElement right = ((DiffNode) input).getRight(); - if (right != null) { - Object element = Utilities.getAdapter(right, HunkResult.class); - if (element instanceof HunkResult) { - return ((HunkResult)element).isOK(); - } - } - ITypedElement left = ((DiffNode) input).getLeft(); - if (left != null) { - Object element = Utilities.getAdapter(left, HunkResult.class); - if (element instanceof HunkResult) - return ((HunkResult)element).isOK(); - } - } - return false; - } - - public static void schedule(Job job, IWorkbenchSite site) { - if (site != null) { - IWorkbenchSiteProgressService siteProgress = (IWorkbenchSiteProgressService) site.getAdapter(IWorkbenchSiteProgressService.class); - if (siteProgress != null) { - siteProgress.schedule(job, 0, true /* use half-busy cursor */); - return; - } - } - job.schedule(); - } - - public static void runInUIThread(final Runnable runnable) { - if (Display.getCurrent() != null) { - BusyIndicator.showWhile(Display.getCurrent(), runnable); - } else { - Display.getDefault().syncExec(new Runnable() { - public void run() { - BusyIndicator.showWhile(Display.getCurrent(), runnable); - } - }); - } - } - - /** - * @param connection a connection for which the timeout is set - * @param timeout an int that specifies the connect timeout value in milliseconds - * @return whether the timeout has been successfully set - */ - public static boolean setReadTimeout(URLConnection connection, int timeout) { - Method[] methods = connection.getClass().getMethods(); - for (int i = 0; i < methods.length; i++) { - if (methods[i].getName().equals("setReadTimeout")) //$NON-NLS-1$ - try { - methods[i].invoke(connection, new Object[] {new Integer(timeout)}); - return true; - } catch (IllegalArgumentException e) { // ignore - } catch (IllegalAccessException e) { // ignore - } catch (InvocationTargetException e) { // ignore - } - } - return false; - } - - /** - * Load content of file under <code>url</code> displaying progress on given - * context. - * - * @param url - * @param context - * @return the content of file under given URL, or <code>null</code> if URL - * could not be loaded - * @throws InvocationTargetException - * thrown on errors while URL loading - * @throws OperationCanceledException - * @throws InterruptedException - */ - public static String getURLContents(final URL url, IRunnableContext context) - throws InvocationTargetException, OperationCanceledException, - InterruptedException { - final String[] result = new String[1]; - context.run(true, true, new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) - throws InvocationTargetException, InterruptedException { - SubMonitor progress = SubMonitor.convert(monitor, - PatchMessages.InputPatchPage_URLConnecting, 100); - try { - URLConnection connection = url.openConnection(); - progress.worked(10); - if (monitor.isCanceled()) - throw new OperationCanceledException(); - setReadTimeout(connection, 60 * 1000); - progress.setTaskName(PatchMessages.InputPatchPage_URLFetchingContent); - String enc = connection.getContentEncoding(); - if (enc == null) - enc = ResourcesPlugin.getEncoding(); - result[0] = Utilities.readString( - connection.getInputStream(), enc, - connection.getContentLength(), - progress.newChild(90)); - } catch (SocketTimeoutException e) { - throw new InvocationTargetException(e); - } catch (IOException e) { - throw new InvocationTargetException(e); - } finally { - monitor.done(); - } - } - }); - return result[0]; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerDescriptor.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerDescriptor.java deleted file mode 100644 index e5d35bcf9..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerDescriptor.java +++ /dev/null @@ -1,79 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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.internal; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.IViewerCreator; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.widgets.Composite; - -/** - * Creates <code>Viewer</code>s from an <code>IConfigurationElement</code>. - */ -public class ViewerDescriptor implements IViewerDescriptor { - - private final static String CLASS_ATTRIBUTE= "class"; //$NON-NLS-1$ - private final static String EXTENSIONS_ATTRIBUTE= "extensions"; //$NON-NLS-1$ - private final static String LABEL_ATTRIBUTE = "label"; //$NON-NLS-1$ - - private IConfigurationElement fConfiguration; - private IViewerCreator fViewerCreator; - private Class fViewerClass; - - public ViewerDescriptor(IConfigurationElement config) { - fConfiguration= config; - } - - public Viewer createViewer(Viewer currentViewer, Composite parent, CompareConfiguration mp) { - - if (currentViewer != null && currentViewer.getClass() == fViewerClass) { - //System.out.println("reused viewer: " + currentViewer.getClass().getName()); - return currentViewer; - } - - if (fViewerCreator == null) { - try { - fViewerCreator= (IViewerCreator) fConfiguration.createExecutableExtension(CLASS_ATTRIBUTE); - } catch (CoreException e) { - CompareUIPlugin.log(e); - } - } - - if (fViewerCreator != null) { - // If we are going to return a new viewer, we want to preemptively deregister - // any handlers to avoid the logging of conflict warnings - if (currentViewer != null) { - CompareHandlerService[] compareHandlerService = (CompareHandlerService[]) Utilities.getAdapter(currentViewer, CompareHandlerService[].class); - if (compareHandlerService != null) { - for (int i = 0; i < compareHandlerService.length; i++) { - compareHandlerService[i].dispose(); - } - } - } - Viewer viewer= fViewerCreator.createViewer(parent, mp); - if (viewer != null) - fViewerClass= viewer.getClass(); - return viewer; - } - - return null; - } - - public String getExtension() { - return fConfiguration.getAttribute(EXTENSIONS_ATTRIBUTE); - } - - String getLabel() { - return fConfiguration.getAttribute(LABEL_ATTRIBUTE); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerSwitchingCancelled.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerSwitchingCancelled.java deleted file mode 100644 index 6bd7a541f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerSwitchingCancelled.java +++ /dev/null @@ -1,19 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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; - - -public class ViewerSwitchingCancelled extends RuntimeException { - - private static final long serialVersionUID = 1L; - -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/WorkQueue.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/WorkQueue.java deleted file mode 100644 index 14ebbc46a..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/WorkQueue.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006 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.util.*; - -import org.eclipse.jface.operation.IRunnableWithProgress; - -/** - * A work queue maintains a list of tasks that need to be run. - * If the same task is added multiple times, the last occurrence of - * the task will be run(i.e. the task will be removed from it's - * previous location and aded to the end of the queue. - */ -public class WorkQueue { - - private List runnables = new ArrayList(); - - public boolean add(IRunnableWithProgress runnable) { - if (runnables.contains(runnable)) - runnables.remove(runnable); - return runnables.add(runnable); - } - - public void clear() { - runnables.clear(); - } - - public boolean contains(IRunnableWithProgress runnable) { - return runnables.contains(runnable); - } - - public boolean isEmpty() { - return runnables.isEmpty(); - } - - public boolean remove(IRunnableWithProgress runnable) { - return runnables.remove(runnable); - } - - public int size() { - return runnables.size(); - } - public IRunnableWithProgress remove() { - return (IRunnableWithProgress)runnables.remove(0); - } - - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/Worker.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/Worker.java deleted file mode 100644 index 69455f981..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/Worker.java +++ /dev/null @@ -1,134 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2007 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.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.runtime.*; -import org.eclipse.jface.operation.IRunnableWithProgress; - -/** - * A worker performs a set of tasks in order and accumulates any errors - * that may have occurred. If the same task is queued multiple times, - * the last occurrence will be run. If a task is queued while it is - * running, the running task will be canceled and the task added - * to the end of the work queue. - */ -public class Worker implements IRunnableWithProgress { - - private final WorkQueue work = new WorkQueue(); - private boolean isWorking; - private final List errors = new ArrayList(); - private WorkProgressMonitor currentMonitor; - private IRunnableWithProgress currentTask; - private final String taskName; - - /** - * Progress monitor that supports local cancelation of a task. - */ - private static class WorkProgressMonitor extends ProgressMonitorWrapper { - private boolean localCancel; - protected WorkProgressMonitor(IProgressMonitor monitor) { - super(monitor); - } - public void cancelTask() { - localCancel = true; - } - public boolean isCanceled() { - return localCancel || super.isCanceled(); - } - } - - public Worker(String taskName) { - this.taskName = taskName; - } - - public void run(IProgressMonitor monitor) { - errors.clear(); - SubMonitor pm = SubMonitor.convert(monitor, getTaskName(), 100); - try { - isWorking = true; - while (!work.isEmpty()) { - try { - performNextTask(pm); - checkCancelled(pm); - } catch (OperationCanceledException e) { - // Only cancel all the work if the outer monitor is canceled - checkCancelled(pm); - } catch (InterruptedException e) { - // Only cancel all the work if the outer monitor is canceled - checkCancelled(pm); - } catch (InvocationTargetException e) { - handleError(e.getTargetException()); - } - pm.setWorkRemaining(100); - } - } catch (OperationCanceledException e) { - // The user chose to cancel - work.clear(); - } finally { - isWorking = false; - if (monitor!= null) - monitor.done(); - currentMonitor = null; - currentTask = null; - } - } - - private WorkProgressMonitor subMonitorFor(SubMonitor pm, int ticks) { - return new WorkProgressMonitor(pm.newChild(ticks)); - } - - private void handleError(Throwable targetException) { - errors.add(targetException); - } - - public Throwable[] getErrors() { - return (Throwable[]) errors.toArray(new Throwable[errors.size()]); - } - - private void checkCancelled(SubMonitor pm) { - if (pm.isCanceled()) - throw new OperationCanceledException(); - } - - protected String getTaskName() { - return taskName; - } - - private void performNextTask(SubMonitor pm) throws InvocationTargetException, InterruptedException { - synchronized (this) { - if (work.isEmpty()) - return; - currentTask = work.remove(); - } - currentMonitor = subMonitorFor(pm, 10); - currentTask.run(currentMonitor); - } - - public synchronized void add(IRunnableWithProgress r) { - if (currentTask != null && currentTask.equals(r)) { - currentMonitor.cancelTask(); - } - work.add(r); - } - - public boolean isWorking() { - return isWorking; - } - - public boolean hasWork() { - return isWorking() || !work.isEmpty(); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/WorkerJob.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/WorkerJob.java deleted file mode 100644 index 7dd38c9d4..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/WorkerJob.java +++ /dev/null @@ -1,60 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006 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.util.ArrayList; -import java.util.List; - -import org.eclipse.core.runtime.*; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jface.operation.IRunnableWithProgress; - -public class WorkerJob extends Job { - - private final Worker worker; - - public WorkerJob(String name) { - super(name); - worker = new Worker(name); - } - - protected IStatus run(IProgressMonitor monitor) { - worker.run(monitor); - // reschedule to ensure we don't miss a task - IStatus result = getResult(worker); - schedule(); - return result; - } - - private IStatus getResult(Worker w) { - Throwable[] errors = w.getErrors(); - if (errors.length == 0) - return Status.OK_STATUS; - if (errors.length == 1) - return new Status(IStatus.ERROR, CompareUIPlugin.PLUGIN_ID, 0, errors[0].getMessage(), errors[0]); - List statii = new ArrayList(); - for (int i = 0; i < errors.length; i++) { - Throwable throwable = errors[i]; - statii.add(new Status(IStatus.ERROR, CompareUIPlugin.PLUGIN_ID, 0, errors[0].getMessage(), throwable)); - } - return new MultiStatus(CompareUIPlugin.PLUGIN_ID, 0, (IStatus[]) statii.toArray(new IStatus[statii.size()]), CompareMessages.WorkerJob_0, null); - } - - public boolean shouldRun() { - return worker.hasWork(); - } - - public void add(IRunnableWithProgress runnable) { - worker.add(runnable); - schedule(); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/DocumentMerger.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/DocumentMerger.java deleted file mode 100644 index 463d8d159..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/DocumentMerger.java +++ /dev/null @@ -1,1409 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 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.merge; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; - -import org.eclipse.jface.operation.IRunnableWithProgress; - -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.BadPositionCategoryException; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.Region; -import org.eclipse.jface.text.TextUtilities; - -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.progress.IProgressService; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.contentmergeviewer.ITokenComparator; -import org.eclipse.compare.internal.CompareContentViewerSwitchingPane; -import org.eclipse.compare.internal.CompareMessages; -import org.eclipse.compare.internal.ComparePreferencePage; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.DocLineComparator; -import org.eclipse.compare.internal.MergeViewerContentProvider; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.internal.core.LCS; -import org.eclipse.compare.rangedifferencer.IRangeComparator; -import org.eclipse.compare.rangedifferencer.RangeDifference; -import org.eclipse.compare.rangedifferencer.RangeDifferencer; -import org.eclipse.compare.structuremergeviewer.Differencer; - -/** - * A document merger manages the differences between two documents - * for either a 2-way or 3-way comparison. - * <p> - * This class should not have any UI dependencies. - */ -public class DocumentMerger { - - private static final String DIFF_RANGE_CATEGORY = CompareUIPlugin.PLUGIN_ID + ".DIFF_RANGE_CATEGORY"; //$NON-NLS-1$ - - /** Selects between smartTokenDiff and mergingTokenDiff */ - private static final boolean USE_MERGING_TOKEN_DIFF= false; - - /** if true copying conflicts from one side to other concatenates both sides */ - private static final boolean APPEND_CONFLICT= true; - - /** All diffs for calculating scrolling position (includes line ranges without changes) */ - private ArrayList fAllDiffs; - /** Subset of above: just real differences. */ - private ArrayList fChangeDiffs; - - private final boolean fLeftIsLocal; - - private IDocumentMergerInput fInput; - - /** - * Interface that defines that input to the document merge process - */ - public interface IDocumentMergerInput { - - IDocument getDocument(char contributor); - - Position getRegion(char contributor); - - boolean isIgnoreAncestor(); - - boolean isThreeWay(); - - CompareConfiguration getCompareConfiguration(); - - ITokenComparator createTokenComparator(String s); - - boolean isHunkOnLeft(); - - int getHunkStart(); - - boolean isPatchHunk(); - - boolean isShowPseudoConflicts(); - - boolean isPatchHunkOk(); - } - - public class Diff { - /** character range in ancestor document */ - Position fAncestorPos; - /** character range in left document */ - Position fLeftPos; - /** character range in right document */ - Position fRightPos; - /** if this is a TokenDiff fParent points to the enclosing LineDiff */ - Diff fParent; - /** if Diff has been resolved */ - boolean fResolved; - int fDirection; - boolean fIsToken= false; - /** child token diffs */ - ArrayList fDiffs; - boolean fIsWhitespace= false; - - /* - * Create Diff from two ranges and an optional parent diff. - */ - Diff(Diff parent, int dir, IDocument ancestorDoc, Position aRange, int ancestorStart, int ancestorEnd, - IDocument leftDoc, Position lRange, int leftStart, int leftEnd, - IDocument rightDoc, Position rRange, int rightStart, int rightEnd) { - fParent= parent != null ? parent : this; - fDirection= dir; - - fLeftPos= createPosition(leftDoc, lRange, leftStart, leftEnd); - fRightPos= createPosition(rightDoc, rRange, rightStart, rightEnd); - if (ancestorDoc != null) - fAncestorPos= createPosition(ancestorDoc, aRange, ancestorStart, ancestorEnd); - } - - public Position getPosition(char type) { - switch (type) { - case MergeViewerContentProvider.ANCESTOR_CONTRIBUTOR: - return fAncestorPos; - case MergeViewerContentProvider.LEFT_CONTRIBUTOR: - return fLeftPos; - case MergeViewerContentProvider.RIGHT_CONTRIBUTOR: - return fRightPos; - } - return null; - } - - boolean isInRange(char type, int pos) { - Position p= getPosition(type); - return (pos >= p.offset) && (pos < (p.offset+p.length)); - } - - public String changeType() { - boolean leftEmpty= fLeftPos.length == 0; - boolean rightEmpty= fRightPos.length == 0; - - if (fDirection == RangeDifference.LEFT) { - if (!leftEmpty && rightEmpty) - return CompareMessages.TextMergeViewer_changeType_addition; - if (leftEmpty && !rightEmpty) - return CompareMessages.TextMergeViewer_changeType_deletion; - } else { - if (leftEmpty && !rightEmpty) - return CompareMessages.TextMergeViewer_changeType_addition; - if (!leftEmpty && rightEmpty) - return CompareMessages.TextMergeViewer_changeType_deletion; - } - return CompareMessages.TextMergeViewer_changeType_change; - } - - public Image getImage() { - int code= Differencer.CHANGE; - switch (fDirection) { - case RangeDifference.RIGHT: - code+= Differencer.LEFT; - break; - case RangeDifference.LEFT: - code+= Differencer.RIGHT; - break; - case RangeDifference.ANCESTOR: - case RangeDifference.CONFLICT: - code+= Differencer.CONFLICTING; - break; - } - if (code != 0) - return getCompareConfiguration().getImage(code); - return null; - } - - Position createPosition(IDocument doc, Position range, int start, int end) { - try { - int l= end-start; - if (range != null) { - int dl= range.length; - if (l > dl) - l= dl; - } else { - int dl= doc.getLength(); - if (start+l > dl) - l= dl-start; - } - - Position p= null; - try { - p= new Position(start, l); - } catch (RuntimeException ex) { - p= new Position(0, 0); - } - - try { - doc.addPosition(DIFF_RANGE_CATEGORY, p); - } catch (BadPositionCategoryException ex) { - // silently ignored - } - return p; - } catch (BadLocationException ee) { - // silently ignored - } - return null; - } - - void add(Diff d) { - if (fDiffs == null) - fDiffs= new ArrayList(); - fDiffs.add(d); - } - - public boolean isDeleted() { - if (fAncestorPos != null && fAncestorPos.isDeleted()) - return true; - return fLeftPos.isDeleted() || fRightPos.isDeleted(); - } - - void setResolved(boolean r) { - fResolved= r; - if (r) - fDiffs= null; - } - - public boolean isResolved() { - if (!fResolved && fDiffs != null) { - Iterator e= fDiffs.iterator(); - while (e.hasNext()) { - Diff d= (Diff) e.next(); - if (!d.isResolved()) - return false; - } - return true; - } - return fResolved; - } - -// private boolean isIncoming() { -// switch (fDirection) { -// case RangeDifference.RIGHT: -// if (fLeftIsLocal) -// return true; -// break; -// case RangeDifference.LEFT: -// if (!fLeftIsLocal) -// return true; -// break; -// } -// return false; -// } - - public boolean isIncomingOrConflicting() { - switch (fDirection) { - case RangeDifference.RIGHT: - if (fLeftIsLocal) - return true; - break; - case RangeDifference.LEFT: - if (!fLeftIsLocal) - return true; - break; - case RangeDifference.CONFLICT: - return true; - } - return false; - } - -// private boolean isUnresolvedIncoming() { -// if (fResolved) -// return false; -// return isIncoming(); -// } - - public boolean isUnresolvedIncomingOrConflicting() { - if (fResolved) - return false; - return isIncomingOrConflicting(); - } - - Position getPosition(int contributor) { - if (contributor == MergeViewerContentProvider.LEFT_CONTRIBUTOR) - return fLeftPos; - if (contributor == MergeViewerContentProvider.RIGHT_CONTRIBUTOR) - return fRightPos; - if (contributor == MergeViewerContentProvider.ANCESTOR_CONTRIBUTOR) - return fAncestorPos; - return null; - } - - /* - * Returns true if given character range overlaps with this Diff. - */ - public boolean overlaps(int contributor, int start, int end, int docLength) { - Position h= getPosition(contributor); - if (h != null) { - int ds= h.getOffset(); - int de= ds + h.getLength(); - if ((start < de) && (end >= ds)) - return true; - if ((start == docLength) && (start <= de) && (end >= ds)) - return true; - } - return false; - } - - public int getMaxDiffHeight() { - Point region= new Point(0, 0); - int h= getLineRange(getDocument(MergeViewerContentProvider.LEFT_CONTRIBUTOR), fLeftPos, region).y; - if (isThreeWay()) - h= Math.max(h, getLineRange(getDocument(MergeViewerContentProvider.ANCESTOR_CONTRIBUTOR), fAncestorPos, region).y); - return Math.max(h, getLineRange(getDocument(MergeViewerContentProvider.RIGHT_CONTRIBUTOR), fRightPos, region).y); - } - - public int getAncestorHeight() { - Point region= new Point(0, 0); - return getLineRange(getDocument(MergeViewerContentProvider.ANCESTOR_CONTRIBUTOR), fAncestorPos, region).y; - } - - public int getLeftHeight() { - Point region= new Point(0, 0); - return getLineRange(getDocument(MergeViewerContentProvider.LEFT_CONTRIBUTOR), fLeftPos, region).y; - } - - public int getRightHeight() { - Point region= new Point(0, 0); - return getLineRange(getDocument(MergeViewerContentProvider.RIGHT_CONTRIBUTOR), fRightPos, region).y; - } - - public Diff[] getChangeDiffs(int contributor, IRegion region) { - if (fDiffs != null && intersectsRegion(contributor, region)) { - List result = new ArrayList(); - for (Iterator iterator = fDiffs.iterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - if (diff.intersectsRegion(contributor, region)) { - result.add(diff); - } - } - return (Diff[]) result.toArray(new Diff[result.size()]); - } - return new Diff[0]; - } - - private boolean intersectsRegion(int contributor, IRegion region) { - Position p = getPosition(contributor); - if (p != null) - return p.overlapsWith(region.getOffset(), region.getLength()); - return false; - } - - public boolean hasChildren() { - return fDiffs != null && !fDiffs.isEmpty(); - } - - public int getKind() { - return fDirection; - } - - public boolean isToken() { - return fIsToken; - } - - public Diff getParent() { - return fParent; - } - - public Iterator childIterator() { - if (fDiffs == null) - return new ArrayList().iterator(); - return fDiffs.iterator(); - } - } - - public DocumentMerger(IDocumentMergerInput input) { - this.fInput = input; - fLeftIsLocal= Utilities.getBoolean(getCompareConfiguration(), "LEFT_IS_LOCAL", false); //$NON-NLS-1$ - } - - /** - * Perform a two level 2- or 3-way diff. - * The first level is based on line comparison, the second level on token comparison. - * @throws CoreException - */ - public void doDiff() throws CoreException { - - fChangeDiffs= new ArrayList(); - IDocument lDoc = getDocument(MergeViewerContentProvider.LEFT_CONTRIBUTOR); - IDocument rDoc = getDocument(MergeViewerContentProvider.RIGHT_CONTRIBUTOR); - - if (lDoc == null || rDoc == null) - return; - - Position lRegion= getRegion(MergeViewerContentProvider.LEFT_CONTRIBUTOR); - Position rRegion= getRegion(MergeViewerContentProvider.RIGHT_CONTRIBUTOR); - - IDocument aDoc = null; - Position aRegion= null; - if (isThreeWay() && !isIgnoreAncestor()) { - aDoc= getDocument(MergeViewerContentProvider.ANCESTOR_CONTRIBUTOR); - aRegion= getRegion(MergeViewerContentProvider.ANCESTOR_CONTRIBUTOR); - } - - resetPositions(lDoc); - resetPositions(rDoc); - resetPositions(aDoc); - - boolean ignoreWhiteSpace= isIgnoreWhitespace(); - - DocLineComparator sright= new DocLineComparator(rDoc, toRegion(rRegion), ignoreWhiteSpace); - DocLineComparator sleft= new DocLineComparator(lDoc, toRegion(lRegion), ignoreWhiteSpace); - DocLineComparator sancestor= null; - if (aDoc != null) { - sancestor= new DocLineComparator(aDoc, toRegion(aRegion), ignoreWhiteSpace); - /*if (isPatchHunk()) { - if (isHunkOnLeft()) { - sright= new DocLineComparator(aDoc, toRegion(aRegion), ignoreWhiteSpace); - } else { - sleft= new DocLineComparator(aDoc, toRegion(aRegion), ignoreWhiteSpace); - } - }*/ - } - - final Object[] result= new Object[1]; - final DocLineComparator sa= sancestor, sl= sleft, sr= sright; - IRunnableWithProgress runnable= new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException { - monitor.beginTask(CompareMessages.DocumentMerger_0, maxWork(sa, sl, sr)); - try { - result[0]= RangeDifferencer.findRanges(monitor, sa, sl, sr); - } catch (OutOfMemoryError ex) { - System.gc(); - throw new InvocationTargetException(ex); - } - if (monitor.isCanceled()) { // canceled - throw new InterruptedException(); - } - monitor.done(); - } - }; - - RangeDifference[] e= null; - try { - getCompareConfiguration().getContainer().run(true, true, runnable); - e= (RangeDifference[]) result[0]; - } catch (InvocationTargetException ex) { - // we create a NOCHANGE range for the whole document - Diff diff= new Diff(null, RangeDifference.NOCHANGE, - aDoc, aRegion, 0, aDoc != null ? aDoc.getLength() : 0, - lDoc, lRegion, 0, lDoc.getLength(), - rDoc, rRegion, 0, rDoc.getLength()); - - fAllDiffs = new ArrayList(); - fAllDiffs.add(diff); - throw new CoreException(new Status(IStatus.ERROR, CompareUIPlugin.PLUGIN_ID, 0, CompareMessages.DocumentMerger_1, ex.getTargetException())); - } catch (InterruptedException ex) { - // we create a NOCHANGE range for the whole document - Diff diff= new Diff(null, RangeDifference.NOCHANGE, - aDoc, aRegion, 0, aDoc != null ? aDoc.getLength() : 0, - lDoc, lRegion, 0, lDoc.getLength(), - rDoc, rRegion, 0, rDoc.getLength()); - - fAllDiffs = new ArrayList(); - fAllDiffs.add(diff); - return; - } - - if (isCapped(sa, sl, sr)) - fInput.getCompareConfiguration().setProperty( - CompareContentViewerSwitchingPane.OPTIMIZED_ALGORITHM_USED, - new Boolean(true)); - else - fInput.getCompareConfiguration().setProperty( - CompareContentViewerSwitchingPane.OPTIMIZED_ALGORITHM_USED, - new Boolean(false)); - - ArrayList newAllDiffs = new ArrayList(); - for (int i= 0; i < e.length; i++) { - RangeDifference es= e[i]; - - int ancestorStart= 0; - int ancestorEnd= 0; - if (sancestor != null) { - ancestorStart= sancestor.getTokenStart(es.ancestorStart()); - ancestorEnd= getTokenEnd2(sancestor, es.ancestorStart(), es.ancestorLength()); - } - - int leftStart= sleft.getTokenStart(es.leftStart()); - int leftEnd= getTokenEnd2(sleft, es.leftStart(), es.leftLength()); - - int rightStart= sright.getTokenStart(es.rightStart()); - int rightEnd= getTokenEnd2(sright, es.rightStart(), es.rightLength()); - - /*if (isPatchHunk()) { - if (isHunkOnLeft()) { - rightStart = rightEnd = getHunkStart(); - } else { - leftStart = leftEnd = getHunkStart(); - } - }*/ - - Diff diff= new Diff(null, es.kind(), - aDoc, aRegion, ancestorStart, ancestorEnd, - lDoc, lRegion, leftStart, leftEnd, - rDoc, rRegion, rightStart, rightEnd); - - newAllDiffs.add(diff); // remember all range diffs for scrolling - - if (isPatchHunk()) { - if (useChange(diff)) { - recordChangeDiff(diff); - } - } else { - if (ignoreWhiteSpace || useChange(es.kind())) { - - // Extract the string for each contributor. - String a= null; - if (sancestor != null) - a= extract2(aDoc, sancestor, es.ancestorStart(), es.ancestorLength()); - String s= extract2(lDoc, sleft, es.leftStart(), es.leftLength()); - String d= extract2(rDoc, sright, es.rightStart(), es.rightLength()); - - // Indicate whether all contributors are whitespace - if (ignoreWhiteSpace - && (a == null || a.trim().length() == 0) - && s.trim().length() == 0 - && d.trim().length() == 0) { - diff.fIsWhitespace= true; - } - - // If the diff is of interest, record it and generate the token diffs - if (useChange(diff)) { - recordChangeDiff(diff); - if (s.length() > 0 && d.length() > 0) { - if (a == null && sancestor != null) - a= extract2(aDoc, sancestor, es.ancestorStart(), es.ancestorLength()); - if (USE_MERGING_TOKEN_DIFF) - mergingTokenDiff(diff, aDoc, a, rDoc, d, lDoc, s); - else - simpleTokenDiff(diff, aDoc, a, rDoc, d, lDoc, s); - } - } - } - } - } - fAllDiffs = newAllDiffs; - } - - private boolean isCapped(DocLineComparator ancestor, - DocLineComparator left, DocLineComparator right) { - if (isCappingDisabled()) - return false; - int aLength = ancestor == null? 0 : ancestor.getRangeCount(); - int lLength = left.getRangeCount(); - int rLength = right.getRangeCount(); - if ((double) aLength * (double) lLength > LCS.TOO_LONG - || (double) aLength * (double) rLength > LCS.TOO_LONG - || (double) lLength * (double) rLength > LCS.TOO_LONG) - return true; - return false; - } - - public Diff findDiff(char type, int pos) throws CoreException { - - IDocument aDoc= null; - IDocument lDoc= getDocument(MergeViewerContentProvider.LEFT_CONTRIBUTOR); - IDocument rDoc= getDocument(MergeViewerContentProvider.RIGHT_CONTRIBUTOR); - if (lDoc == null || rDoc == null) - return null; - - Position aRegion= null; - Position lRegion= null; - Position rRegion= null; - - boolean threeWay= isThreeWay(); - - if (threeWay && !isIgnoreAncestor()) - aDoc= getDocument(MergeViewerContentProvider.ANCESTOR_CONTRIBUTOR); - - boolean ignoreWhiteSpace= isIgnoreWhitespace(); - - DocLineComparator sright= new DocLineComparator(rDoc, toRegion(rRegion), ignoreWhiteSpace); - DocLineComparator sleft= new DocLineComparator(lDoc, toRegion(lRegion), ignoreWhiteSpace); - DocLineComparator sancestor= null; - if (aDoc != null) - sancestor= new DocLineComparator(aDoc, toRegion(aRegion), ignoreWhiteSpace); - - final Object[] result= new Object[1]; - final DocLineComparator sa= sancestor, sl= sleft, sr= sright; - IRunnableWithProgress runnable= new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException { - monitor.beginTask(CompareMessages.DocumentMerger_2, maxWork(sa, sl, sr)); - try { - result[0]= RangeDifferencer.findRanges(monitor, sa, sl, sr); - } catch (OutOfMemoryError ex) { - System.gc(); - throw new InvocationTargetException(ex); - } - if (monitor.isCanceled()) { // canceled - throw new InterruptedException(); - } - monitor.done(); - } - }; - IProgressService progressService= PlatformUI.getWorkbench().getProgressService(); - - RangeDifference[] e= null; - try { - progressService.run(true, true, runnable); - e= (RangeDifference[]) result[0]; - } catch (InvocationTargetException ex) { - throw new CoreException(new Status(IStatus.ERROR, CompareUIPlugin.PLUGIN_ID, 0, CompareMessages.DocumentMerger_3, ex.getTargetException())); - } catch (InterruptedException ex) { - // - } - - if (e != null) { - for (int i= 0; i < e.length; i++) { - RangeDifference es= e[i]; - - int kind= es.kind(); - - int ancestorStart= 0; - int ancestorEnd= 0; - if (sancestor != null) { - ancestorStart= sancestor.getTokenStart(es.ancestorStart()); - ancestorEnd= getTokenEnd2(sancestor, es.ancestorStart(), es.ancestorLength()); - } - - int leftStart= sleft.getTokenStart(es.leftStart()); - int leftEnd= getTokenEnd2(sleft, es.leftStart(), es.leftLength()); - - int rightStart= sright.getTokenStart(es.rightStart()); - int rightEnd= getTokenEnd2(sright, es.rightStart(), es.rightLength()); - - Diff diff= new Diff(null, kind, - aDoc, aRegion, ancestorStart, ancestorEnd, - lDoc, lRegion, leftStart, leftEnd, - rDoc, rRegion, rightStart, rightEnd); - - if (diff.isInRange(type, pos)) - return diff; - } - } - - return null; - } - - private void recordChangeDiff(Diff diff) { - fChangeDiffs.add(diff); // here we remember only the real diffs - } - - /*private boolean isHunkOnLeft() { - return fInput.isHunkOnLeft(); - } - - private int getHunkStart() { - return fInput.getHunkStart(); - }*/ - - private boolean isPatchHunk() { - return fInput.isPatchHunk(); - } - - private boolean isIgnoreWhitespace() { - return Utilities.getBoolean(getCompareConfiguration(), CompareConfiguration.IGNORE_WHITESPACE, false); - } - - private boolean isCappingDisabled() { - return CompareUIPlugin.getDefault().getPreferenceStore().getBoolean(ComparePreferencePage.CAPPING_DISABLED); - } - - private IDocument getDocument(char contributor) { - return fInput.getDocument(contributor); - } - - private Position getRegion(char contributor) { - return fInput.getRegion(contributor); - } - - public boolean isIgnoreAncestor() { - return fInput.isIgnoreAncestor(); - } - - public boolean isThreeWay() { - return fInput.isThreeWay(); - } - - /** - * Return the compare configuration associated with this merger. - * @return the compare configuration associated with this merger - */ - public CompareConfiguration getCompareConfiguration() { - return fInput.getCompareConfiguration(); - } - - /* - * Returns true if kind of change should be shown. - */ - public boolean useChange(Diff diff) { - if (diff.fIsWhitespace) - return false; - int kind = diff.getKind(); - return useChange(kind); - } - - private boolean useChange(int kind) { - if (kind == RangeDifference.NOCHANGE) - return false; - if (fInput.getCompareConfiguration().isChangeIgnored(kind)) - return false; - if (kind == RangeDifference.ANCESTOR) - return fInput.isShowPseudoConflicts(); - return true; - } - - private int getTokenEnd(ITokenComparator tc, int start, int count) { - if (count <= 0) - return tc.getTokenStart(start); - int index= start + count - 1; - return tc.getTokenStart(index) + tc.getTokenLength(index); - } - - private static int getTokenEnd2(ITokenComparator tc, int start, int length) { - return tc.getTokenStart(start + length); - } - - /** - * Returns the content of lines in the specified range as a String. - * This includes the line separators. - * - * @param doc the document from which to extract the characters - * @param start index of first line - * @param length number of lines - * @return the contents of the specified line range as a String - */ - private String extract2(IDocument doc, ITokenComparator tc, int start, int length) { - int count= tc.getRangeCount(); - if (length > 0 && count > 0) { - -// -// int startPos= tc.getTokenStart(start); -// int endPos= startPos; -// -// if (length > 1) -// endPos= tc.getTokenStart(start + (length-1)); -// endPos+= tc.getTokenLength(start + (length-1)); -// - - int startPos= tc.getTokenStart(start); - int endPos; - - if (length == 1) { - endPos= startPos + tc.getTokenLength(start); - } else { - endPos= tc.getTokenStart(start + length); - } - - try { - return doc.get(startPos, endPos - startPos); - } catch (BadLocationException e) { - // silently ignored - } - - } - return ""; //$NON-NLS-1$ - } - - private static IRegion toRegion(Position position) { - if (position != null) - return new Region(position.getOffset(), position.getLength()); - return null; - } - - /* - * Performs a "smart" token based 3-way diff on the character range specified by the given baseDiff. - * It is "smart" because it tries to minimize the number of token diffs by merging them. - */ - private void mergingTokenDiff(Diff baseDiff, - IDocument ancestorDoc, String a, - IDocument rightDoc, String d, - IDocument leftDoc, String s) { - ITokenComparator sa= null; - int ancestorStart= 0; - if (ancestorDoc != null) { - sa= createTokenComparator(a); - ancestorStart= baseDiff.fAncestorPos.getOffset(); - } - - int rightStart= baseDiff.fRightPos.getOffset(); - ITokenComparator sm= createTokenComparator(d); - - int leftStart= baseDiff.fLeftPos.getOffset(); - ITokenComparator sy= createTokenComparator(s); - - RangeDifference[] r= RangeDifferencer.findRanges(sa, sy, sm); - for (int i= 0; i < r.length; i++) { - RangeDifference es= r[i]; - // determine range of diffs in one line - int start= i; - int leftLine= -1; - int rightLine= -1; - try { - leftLine= leftDoc.getLineOfOffset(leftStart+sy.getTokenStart(es.leftStart())); - rightLine= rightDoc.getLineOfOffset(rightStart+sm.getTokenStart(es.rightStart())); - } catch (BadLocationException e) { - // silently ignored - } - i++; - for (; i < r.length; i++) { - es= r[i]; - try { - if (leftLine != leftDoc.getLineOfOffset(leftStart+sy.getTokenStart(es.leftStart()))) - break; - if (rightLine != rightDoc.getLineOfOffset(rightStart+sm.getTokenStart(es.rightStart()))) - break; - } catch (BadLocationException e) { - // silently ignored - } - } - int end= i; - - // find first diff from left - RangeDifference first= null; - for (int ii= start; ii < end; ii++) { - es= r[ii]; - if (useChange(es.kind())) { - first= es; - break; - } - } - - // find first diff from mine - RangeDifference last= null; - for (int ii= end-1; ii >= start; ii--) { - es= r[ii]; - if (useChange(es.kind())) { - last= es; - break; - } - } - - if (first != null && last != null) { - - int ancestorStart2= 0; - int ancestorEnd2= 0; - if (ancestorDoc != null) { - ancestorStart2= ancestorStart+sa.getTokenStart(first.ancestorStart()); - ancestorEnd2= ancestorStart+getTokenEnd(sa, last.ancestorStart(), last.ancestorLength()); - } - - int leftStart2= leftStart+sy.getTokenStart(first.leftStart()); - int leftEnd2= leftStart+getTokenEnd(sy, last.leftStart(), last.leftLength()); - - int rightStart2= rightStart+sm.getTokenStart(first.rightStart()); - int rightEnd2= rightStart+getTokenEnd(sm, last.rightStart(), last.rightLength()); - Diff diff= new Diff(baseDiff, first.kind(), - ancestorDoc, null, ancestorStart2, ancestorEnd2, - leftDoc, null, leftStart2, leftEnd2, - rightDoc, null, rightStart2, rightEnd2); - diff.fIsToken= true; - baseDiff.add(diff); - } - } - } - - /* - * Performs a token based 3-way diff on the character range specified by the given baseDiff. - */ - private void simpleTokenDiff(final Diff baseDiff, - IDocument ancestorDoc, String a, - IDocument rightDoc, String d, - IDocument leftDoc, String s) { - - int ancestorStart= 0; - ITokenComparator sa= null; - if (ancestorDoc != null) { - ancestorStart= baseDiff.fAncestorPos.getOffset(); - sa= createTokenComparator(a); - } - - int rightStart= baseDiff.fRightPos.getOffset(); - ITokenComparator sm= createTokenComparator(d); - - int leftStart= baseDiff.fLeftPos.getOffset(); - ITokenComparator sy= createTokenComparator(s); - - RangeDifference[] e= RangeDifferencer.findRanges(sa, sy, sm); - for (int i= 0; i < e.length; i++) { - RangeDifference es= e[i]; - int kind= es.kind(); - if (kind != RangeDifference.NOCHANGE) { - - int ancestorStart2= ancestorStart; - int ancestorEnd2= ancestorStart; - if (ancestorDoc != null) { - ancestorStart2 += sa.getTokenStart(es.ancestorStart()); - ancestorEnd2 += getTokenEnd(sa, es.ancestorStart(), es.ancestorLength()); - } - - int leftStart2= leftStart + sy.getTokenStart(es.leftStart()); - int leftEnd2= leftStart + getTokenEnd(sy, es.leftStart(), es.leftLength()); - - int rightStart2= rightStart + sm.getTokenStart(es.rightStart()); - int rightEnd2= rightStart + getTokenEnd(sm, es.rightStart(), es.rightLength()); - - Diff diff= new Diff(baseDiff, kind, - ancestorDoc, null, ancestorStart2, ancestorEnd2, - leftDoc, null, leftStart2, leftEnd2, - rightDoc, null, rightStart2, rightEnd2); - - // ensure that token diff is smaller than basediff - int leftS= baseDiff.fLeftPos.offset; - int leftE= baseDiff.fLeftPos.offset+baseDiff.fLeftPos.length; - int rightS= baseDiff.fRightPos.offset; - int rightE= baseDiff.fRightPos.offset+baseDiff.fRightPos.length; - if (leftS != leftStart2 || leftE != leftEnd2 || - rightS != rightStart2 || rightE != rightEnd2) { - diff.fIsToken= true; - // add to base Diff - baseDiff.add(diff); - } - } - } - } - - private ITokenComparator createTokenComparator(String s) { - return fInput.createTokenComparator(s); - } - - private static int maxWork(IRangeComparator a, IRangeComparator l, IRangeComparator r) { - int ln= l.getRangeCount(); - int rn= r.getRangeCount(); - if (a != null) { - int an= a.getRangeCount(); - return (2 * Math.max(an, ln)) + (2 * Math.max(an, rn)); - } - return 2 * Math.max(ln, rn); - } - - private void resetPositions(IDocument doc) { - if (doc == null) - return; - try { - doc.removePositionCategory(DIFF_RANGE_CATEGORY); - } catch (BadPositionCategoryException e) { - // Ignore - } - doc.addPositionCategory(DIFF_RANGE_CATEGORY); - } - - /* - * Returns the start line and the number of lines which correspond to the given position. - * Starting line number is 0 based. - */ - protected Point getLineRange(IDocument doc, Position p, Point region) { - - if (p == null || doc == null) { - region.x= 0; - region.y= 0; - return region; - } - - int start= p.getOffset(); - int length= p.getLength(); - - int startLine= 0; - try { - startLine= doc.getLineOfOffset(start); - } catch (BadLocationException e) { - // silently ignored - } - - int lineCount= 0; - - if (length == 0) { -// // if range length is 0 and if range starts a new line -// try { -// if (start == doc.getLineStartOffset(startLine)) { -// lines--; -// } -// } catch (BadLocationException e) { -// lines--; -// } - - } else { - int endLine= 0; - try { - endLine= doc.getLineOfOffset(start + length - 1); // why -1? - } catch (BadLocationException e) { - // silently ignored - } - lineCount= endLine-startLine+1; - } - - region.x= startLine; - region.y= lineCount; - return region; - } - - public Diff findDiff(Position p, boolean left) { - for (Iterator iterator = fAllDiffs.iterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - Position diffPos; - if (left) { - diffPos = diff.fLeftPos; - } else { - diffPos = diff.fRightPos; - } - // If the element falls within a diff, highlight that diff - if (diffPos.offset + diffPos.length >= p.offset && diff.fDirection != RangeDifference.NOCHANGE) - return diff; - // Otherwise, highlight the first diff after the elements position - if (diffPos.offset >= p.offset) - return diff; - } - return null; - } - - public void reset() { - fChangeDiffs= null; - fAllDiffs= null; - } - - /** - * Returns the virtual position for the given view position. - * @param contributor - * @param vpos - * @return the virtual position for the given view position - */ - public int realToVirtualPosition(char contributor, int vpos) { - - if (fAllDiffs == null) - return vpos; - - int viewPos= 0; // real view position - int virtualPos= 0; // virtual position - Point region= new Point(0, 0); - - Iterator e= fAllDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - Position pos= diff.getPosition(contributor); - getLineRange(getDocument(contributor),pos, region); - int realHeight= region.y; - int virtualHeight= diff.getMaxDiffHeight(); - if (vpos <= viewPos + realHeight) { // OK, found! - vpos-= viewPos; // make relative to this slot - // now scale position within this slot to virtual slot - if (realHeight <= 0) - vpos= 0; - else - vpos= (vpos*virtualHeight)/realHeight; - return virtualPos+vpos; - } - viewPos+= realHeight; - virtualPos+= virtualHeight; - } - return virtualPos; - } - - /** - * maps given virtual position into a real view position of this view. - * @param contributor - * @param v - * @return the real view position - */ - public int virtualToRealPosition(char contributor, int v) { - - if (fAllDiffs == null) - return v; - - int virtualPos= 0; - int viewPos= 0; - Point region= new Point(0, 0); - - Iterator e= fAllDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - Position pos= diff.getPosition(contributor); - int viewHeight= getLineRange(getDocument(contributor), pos, region).y; - int virtualHeight= diff.getMaxDiffHeight(); - if (v < (virtualPos + virtualHeight)) { - v-= virtualPos; // make relative to this slot - if (viewHeight <= 0) { - v= 0; - } else { - v= (int) (v * ((double)viewHeight/virtualHeight)); - } - return viewPos+v; - } - virtualPos+= virtualHeight; - viewPos+= viewHeight; - } - return viewPos; - } - - /* - * Calculates virtual height (in lines) of views by adding the maximum of corresponding diffs. - */ - public int getVirtualHeight() { - int h= 1; - if (fAllDiffs != null) { - Iterator e= fAllDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - h+= diff.getMaxDiffHeight(); - } - } - return h; - } - - /* - * Calculates height (in lines) of right view by adding the height of the right diffs. - */ - public int getRightHeight() { - int h= 1; - if (fAllDiffs != null) { - Iterator e= fAllDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - h+= diff.getRightHeight(); - } - } - return h; - } - - public int findInsertionPoint(Diff diff, char type) { - if (diff != null) { - switch (type) { - case MergeViewerContentProvider.ANCESTOR_CONTRIBUTOR: - if (diff.fAncestorPos != null) - return diff.fAncestorPos.offset; - break; - case MergeViewerContentProvider.LEFT_CONTRIBUTOR: - if (diff.fLeftPos != null) - return diff.fLeftPos.offset; - break; - case MergeViewerContentProvider.RIGHT_CONTRIBUTOR: - if (diff.fRightPos != null) - return diff.fRightPos.offset; - break; - } - } - return 0; - } - - public Diff[] getChangeDiffs(char contributor, IRegion region) { - if (fChangeDiffs == null) - return new Diff[0]; - List intersectingDiffs = new ArrayList(); - for (Iterator iterator = fChangeDiffs.iterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - Diff[] changeDiffs = diff.getChangeDiffs(contributor, region); - for (int i = 0; i < changeDiffs.length; i++) { - Diff changeDiff = changeDiffs[i]; - intersectingDiffs.add(changeDiff); - } - } - return (Diff[]) intersectingDiffs.toArray(new Diff[intersectingDiffs.size()]); - } - - public Diff findDiff(int viewportHeight, boolean synchronizedScrolling, Point size, int my) { - int virtualHeight= synchronizedScrolling ? getVirtualHeight() : getRightHeight(); - if (virtualHeight < viewportHeight) - return null; - - int yy, hh; - int y= 0; - if (fAllDiffs != null) { - Iterator e= fAllDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - int h= synchronizedScrolling ? diff.getMaxDiffHeight() - : diff.getRightHeight(); - if (useChange(diff.getKind()) && !diff.fIsWhitespace) { - - yy= (y*size.y)/virtualHeight; - hh= (h*size.y)/virtualHeight; - if (hh < 3) - hh= 3; - - if (my >= yy && my < yy+hh) - return diff; - } - y+= h; - } - } - return null; - } - - public boolean hasChanges() { - return fChangeDiffs != null && !fChangeDiffs.isEmpty(); - } - - public Iterator changesIterator() { - if (fChangeDiffs == null) - return new ArrayList().iterator(); - return fChangeDiffs.iterator(); - } - - public Iterator rangesIterator() { - if (fAllDiffs == null) - return new ArrayList().iterator(); - return fAllDiffs.iterator(); - } - - public boolean isFirstChildDiff(char contributor, int startOffset, - Diff diff) { - if (!diff.hasChildren()) - return false; - Diff d = (Diff)diff.fDiffs.get(0); - Position p= d.getPosition(contributor); - return (p.getOffset() >= startOffset); - } - - public Diff getWrappedDiff(Diff diff, boolean down) { - if (fChangeDiffs != null && fChangeDiffs.size() > 0) { - if (down) - return (Diff) fChangeDiffs.get(0); - return (Diff) fChangeDiffs.get(fChangeDiffs.size()-1); - } - return null; - } - - /* - * Copy the contents of the given diff from one side to the other but - * doesn't reveal anything. - * Returns true if copy was successful. - */ - public boolean copy(Diff diff, boolean leftToRight) { - - if (diff != null && !diff.isResolved()) { - Position fromPos= null; - Position toPos= null; - IDocument fromDoc= null; - IDocument toDoc= null; - - if (leftToRight) { - fromPos= diff.getPosition(MergeViewerContentProvider.LEFT_CONTRIBUTOR); - toPos= diff.getPosition(MergeViewerContentProvider.RIGHT_CONTRIBUTOR); - fromDoc= getDocument(MergeViewerContentProvider.LEFT_CONTRIBUTOR); - toDoc= getDocument(MergeViewerContentProvider.RIGHT_CONTRIBUTOR); - } else { - fromPos= diff.getPosition(MergeViewerContentProvider.RIGHT_CONTRIBUTOR); - toPos= diff.getPosition(MergeViewerContentProvider.LEFT_CONTRIBUTOR); - fromDoc= getDocument(MergeViewerContentProvider.RIGHT_CONTRIBUTOR); - toDoc= getDocument(MergeViewerContentProvider.LEFT_CONTRIBUTOR); - } - - if (fromDoc != null) { - - int fromStart= fromPos.getOffset(); - int fromLen= fromPos.getLength(); - - int toStart= toPos.getOffset(); - int toLen= toPos.getLength(); - - try { - String s= null; - - switch (diff.getKind()) { - case RangeDifference.RIGHT: - case RangeDifference.LEFT: - s= fromDoc.get(fromStart, fromLen); - break; - case RangeDifference.ANCESTOR: - break; - case RangeDifference.CONFLICT: - if (APPEND_CONFLICT) { - s= toDoc.get(toStart, toLen); - String ls = TextUtilities.getDefaultLineDelimiter(toDoc); - if (!s.endsWith(ls)) - s += ls; - s+= fromDoc.get(fromStart, fromLen); - } else - s= fromDoc.get(fromStart, fromLen); - break; - } - if (s != null) { - toDoc.replace(toStart, toLen, s); - toPos.setOffset(toStart); - toPos.setLength(s.length()); - } - - } catch (BadLocationException e) { - // silently ignored - } - } - - diff.setResolved(true); - return true; - } - return false; - } - - public int changesCount() { - if (fChangeDiffs == null) - return 0; - return fChangeDiffs.size(); - } - - public Diff findDiff(char contributor, int rangeStart, int rangeEnd) { - if (hasChanges()) { - for (Iterator iterator = changesIterator(); iterator.hasNext();) { - Diff diff = (Diff) iterator.next(); - if (diff.isDeleted() || diff.getKind() == RangeDifference.NOCHANGE) - continue; - if (diff.overlaps(contributor, rangeStart, rangeEnd, getDocument(contributor).getLength())) - return diff; - } - } - return null; - } - - public Diff findDiff(char contributor, Position range) { - int start= range.getOffset(); - int end= start + range.getLength(); - return findDiff(contributor, start, end); - } - - public Diff findNext(char contributor, int start, int end, boolean deep) { - return findNext(contributor, fChangeDiffs, start, end, deep); - } - - private Diff findNext(char contributor, List v, int start, int end, boolean deep) { - if (v == null) - return null; - for (int i= 0; i < v.size(); i++) { - Diff diff= (Diff) v.get(i); - Position p= diff.getPosition(contributor); - if (p != null) { - int startOffset= p.getOffset(); - if (end < startOffset) // <= - return diff; - if (deep && diff.hasChildren()) { - Diff d= null; - int endOffset= startOffset + p.getLength(); - if (start == startOffset && (end == endOffset || end == endOffset-1)) { - d= findNext(contributor, diff.fDiffs, start-1, start-1, deep); - } else if (end < endOffset) { - d= findNext(contributor, diff.fDiffs, start, end, deep); - } - if (d != null) - return d; - } - } - } - return null; - } - - public Diff findPrev(char contributor, int start, int end, boolean deep) { - return findPrev(contributor, fChangeDiffs, start, end, deep); - } - - private Diff findPrev(char contributor, List v, int start, int end, boolean deep) { - if (v == null) - return null; - for (int i= v.size()-1; i >= 0; i--) { - Diff diff= (Diff) v.get(i); - Position p= diff.getPosition(contributor); - if (p != null) { - int startOffset= p.getOffset(); - int endOffset= startOffset + p.getLength(); - if (start > endOffset) { - if (deep && diff.hasChildren()) { - // If we are going deep, find the last change in the diff - return findPrev(contributor, diff.fDiffs, end, end, deep); - } - return diff; - } - if (deep && diff.hasChildren()) { - Diff d= null; - if (start == startOffset && end == endOffset) { - // A whole diff is selected so we'll fall through - // and go the the last change in the previous diff - } else if (start >= startOffset) { - // If we are at or before the first diff, select the - // entire diff so next and previous are symmetrical - if (isFirstChildDiff(contributor, startOffset, diff)) { - return diff; - } - d= findPrev(contributor, diff.fDiffs, start, end, deep); - } - if (d != null) - return d; - } - } - } - return null; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/LineComparator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/LineComparator.java deleted file mode 100644 index 4b4891637..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/LineComparator.java +++ /dev/null @@ -1,63 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2008 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.merge; - -import java.io.*; -import java.util.ArrayList; -import org.eclipse.compare.rangedifferencer.IRangeComparator; - -/** - * This implementation of IRangeComparator breaks an input stream into lines. - */ -class LineComparator implements IRangeComparator { - - private String[] fLines; - - public LineComparator(InputStream is, String encoding) throws IOException { - - BufferedReader br = new BufferedReader(new InputStreamReader(is, encoding)); - String line; - ArrayList ar = new ArrayList(); - while ((line = br.readLine()) != null) { - ar.add(line); - } - // It is the responsibility of the caller to close the stream - fLines = (String[]) ar.toArray(new String[ar.size()]); - } - - String getLine(int ix) { - return fLines[ix]; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.rangedifferencer.IRangeComparator#getRangeCount() - */ - public int getRangeCount() { - return fLines.length; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.rangedifferencer.IRangeComparator#rangesEqual(int, org.eclipse.compare.rangedifferencer.IRangeComparator, int) - */ - public boolean rangesEqual(int thisIndex, IRangeComparator other, - int otherIndex) { - String s1 = fLines[thisIndex]; - String s2 = ((LineComparator) other).fLines[otherIndex]; - return s1.equals(s2); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.rangedifferencer.IRangeComparator#skipRangeComparison(int, int, org.eclipse.compare.rangedifferencer.IRangeComparator) - */ - public boolean skipRangeComparison(int length, int maxLength, IRangeComparator other) { - return false; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.java deleted file mode 100644 index f3fa54dea..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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.merge; - -import org.eclipse.osgi.util.NLS; - -public final class MergeMessages extends NLS { - - private static final String BUNDLE_NAME = "org.eclipse.compare.internal.merge.MergeMessages";//$NON-NLS-1$ - - private MergeMessages() { - // Do not instantiate - } - - public static String TextAutoMerge_inputEncodingError; - public static String TextAutoMerge_outputEncodingError; - public static String TextAutoMerge_outputIOError; - public static String TextAutoMerge_conflict; - - static { - NLS.initializeMessages(BUNDLE_NAME, MergeMessages.class); - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.properties deleted file mode 100644 index a548ea8e6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.properties +++ /dev/null @@ -1,15 +0,0 @@ -############################################################################### -# Copyright (c) 2004, 2006 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 -############################################################################### - -TextAutoMerge_inputEncodingError= Unsupported encoding for input streams -TextAutoMerge_outputEncodingError= Unsupported encoding for output streams -TextAutoMerge_outputIOError= IO error on writing -TextAutoMerge_conflict= Conflict: cannot auto merge diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/TextStreamMerger.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/TextStreamMerger.java deleted file mode 100644 index 2aaecd12b..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/TextStreamMerger.java +++ /dev/null @@ -1,97 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2008 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.merge; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; - -import org.eclipse.compare.*; -import org.eclipse.compare.rangedifferencer.RangeDifference; -import org.eclipse.compare.rangedifferencer.RangeDifferencer; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; - -/** - * A simple merger for streams containing text lines. - */ -public class TextStreamMerger implements IStreamMerger { - - /* - * (non-Javadoc) - * - * @see org.eclipse.compare.internal.merge.IAutoMerger#automerge(java.io.OutputStream, - * org.eclipse.core.resources.IEncodedStorage, - * org.eclipse.core.resources.IEncodedStorage, - * org.eclipse.core.resources.IEncodedStorage, - * org.eclipse.core.runtime.IProgressMonitor) - */ - public IStatus merge(OutputStream output, String outputEncoding, InputStream ancestor, String ancestorEncoding, InputStream target, String targetEncoding, InputStream other, String otherEncoding, IProgressMonitor monitor) { - - LineComparator a, t, o; - - try { - a= new LineComparator(ancestor, ancestorEncoding); - t= new LineComparator(target, targetEncoding); - o= new LineComparator(other, otherEncoding); - } catch (UnsupportedEncodingException e) { - return new Status(IStatus.ERROR, CompareUI.PLUGIN_ID, 1, MergeMessages.TextAutoMerge_inputEncodingError, e); - } catch (IOException e) { - return new Status(IStatus.ERROR, CompareUI.PLUGIN_ID, 1, e.getMessage(), e); - } - - try { - String lineSeparator= System.getProperty("line.separator"); //$NON-NLS-1$ - if (lineSeparator == null) - lineSeparator= "\n"; //$NON-NLS-1$ - - RangeDifference[] diffs= RangeDifferencer.findRanges(monitor, a, t, o); - - for (int i= 0; i < diffs.length; i++) { - RangeDifference rd= diffs[i]; - switch (rd.kind()) { - case RangeDifference.ANCESTOR: // pseudo conflict - case RangeDifference.NOCHANGE: - case RangeDifference.RIGHT: - for (int j= rd.rightStart(); j < rd.rightEnd(); j++) { - String s= o.getLine(j); - output.write(s.getBytes(outputEncoding)); - output.write(lineSeparator.getBytes(outputEncoding)); - } - break; - - case RangeDifference.LEFT: - for (int j= rd.leftStart(); j < rd.leftEnd(); j++) { - String s= t.getLine(j); - output.write(s.getBytes(outputEncoding)); - output.write(lineSeparator.getBytes(outputEncoding)); - } - break; - - case RangeDifference.CONFLICT: - return new Status(IStatus.ERROR, CompareUI.PLUGIN_ID, CONFLICT, MergeMessages.TextAutoMerge_conflict, null); - - default: - break; - } - } - - } catch (UnsupportedEncodingException e) { - return new Status(IStatus.ERROR, CompareUI.PLUGIN_ID, 1, MergeMessages.TextAutoMerge_outputEncodingError, e); - } catch (IOException e) { - return new Status(IStatus.ERROR, CompareUI.PLUGIN_ID, 1, MergeMessages.TextAutoMerge_outputIOError, e); - } - - return Status.OK_STATUS; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/DecoratorOverlayIcon.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/DecoratorOverlayIcon.java deleted file mode 100644 index 1a8e3d44c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/DecoratorOverlayIcon.java +++ /dev/null @@ -1,123 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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.internal.patch; - -import java.util.Arrays; - -import org.eclipse.jface.resource.CompositeImageDescriptor; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.IDecoration; -import org.eclipse.swt.graphics.*; - -/** - * An DecoratorOverlayIcon consists of a main icon and several adornments. - * Copied until bug 164394 is resolved. - */ -class DecoratorOverlayIcon extends CompositeImageDescriptor { - // the base image - private Image base; - - // the overlay images - private ImageDescriptor[] overlays; - - // the size - private Point size; - - - /** - * OverlayIcon constructor. - * - * @param baseImage the base image - * @param overlaysArray the overlay images - * @param sizeValue the size - */ - public DecoratorOverlayIcon(Image baseImage, - ImageDescriptor[] overlaysArray, Point sizeValue) { - this.base = baseImage; - this.overlays = overlaysArray; - this.size = sizeValue; - } - - /** - * Draw the overlays for the receiver. - * @param overlaysArray the overlay images - */ - protected void drawOverlays(ImageDescriptor[] overlaysArray) { - - for (int i = 0; i < overlays.length; i++) { - ImageDescriptor overlay = overlaysArray[i]; - if (overlay == null) { - continue; - } - ImageData overlayData = overlay.getImageData(); - //Use the missing descriptor if it is not there. - if (overlayData == null) { - overlayData = ImageDescriptor.getMissingImageDescriptor() - .getImageData(); - } - switch (i) { - case IDecoration.TOP_LEFT: - drawImage(overlayData, 0, 0); - break; - case IDecoration.TOP_RIGHT: - drawImage(overlayData, size.x - overlayData.width, 0); - break; - case IDecoration.BOTTOM_LEFT: - drawImage(overlayData, 0, size.y - overlayData.height); - break; - case IDecoration.BOTTOM_RIGHT: - drawImage(overlayData, size.x - overlayData.width, size.y - - overlayData.height); - break; - } - } - } - - public boolean equals(Object o) { - if (!(o instanceof DecoratorOverlayIcon)) { - return false; - } - DecoratorOverlayIcon other = (DecoratorOverlayIcon) o; - return base.equals(other.base) - && Arrays.equals(overlays, other.overlays); - } - - public int hashCode() { - int code = base.hashCode(); - for (int i = 0; i < overlays.length; i++) { - if (overlays[i] != null) { - code ^= overlays[i].hashCode(); - } - } - return code; - } - - protected void drawCompositeImage(int width, int height) { - ImageDescriptor underlay = overlays[IDecoration.UNDERLAY]; - if (underlay != null) { - drawImage(underlay.getImageData(), 0, 0); - } - drawImage(base.getImageData(), 0, 0); - drawOverlays(overlays); - } - - protected Point getSize() { - return size; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.resource.CompositeImageDescriptor#getTransparentPixel() - */ - protected int getTransparentPixel() { - return base.getImageData().transparentPixel; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/DiffViewerComparator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/DiffViewerComparator.java deleted file mode 100644 index 5a0134edd..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/DiffViewerComparator.java +++ /dev/null @@ -1,56 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010 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.patch; - -import java.util.Comparator; -import java.util.regex.Pattern; - -import org.eclipse.compare.structuremergeviewer.DiffNode; -import org.eclipse.compare.structuremergeviewer.DocumentRangeNode; -import org.eclipse.jface.util.Policy; -import org.eclipse.jface.viewers.ViewerSorter; - -public class DiffViewerComparator extends ViewerSorter { - - public boolean isSorterProperty(Object element, Object property) { - return false; - } - - public int category(Object node) { - if (node instanceof DiffNode) { - Object o= ((DiffNode) node).getId(); - if (o instanceof DocumentRangeNode) - return ((DocumentRangeNode) o).getTypeCode(); - } - return 0; - } - - protected Comparator getComparator() { - return new Comparator() { - public int compare(Object arg0, Object arg1) { - String label0 = arg0 == null ? "" : arg0.toString(); //$NON-NLS-1$ - String label1 = arg1 == null ? "" : arg1.toString(); //$NON-NLS-1$ - - // see org.eclipse.compare.internal.patch.Hunk.getDescription() - String pattern = "\\d+,\\d+ -> \\d+,\\d+.*"; //$NON-NLS-1$ - - if (Pattern.matches(pattern, label0) - && Pattern.matches(pattern, label1)) { - int oldStart0 = Integer.parseInt(label0.split(",")[0]); //$NON-NLS-1$ - int oldStart1 = Integer.parseInt(label1.split(",")[0]); //$NON-NLS-1$ - - return oldStart0 - oldStart1; - } - return Policy.getComparator().compare(arg0, arg1); - } - }; - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/FilePatch.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/FilePatch.java deleted file mode 100644 index 5841f269e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/FilePatch.java +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************* - * Copyright (c) 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.internal.patch; - -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.compare.patch.IFilePatch; -import org.eclipse.compare.patch.IFilePatchResult; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.core.resources.IStorage; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; - -public class FilePatch extends FilePatch2 implements IFilePatch { - - public FilePatch(IPath oldPath, long oldDate, IPath newPath, - long newDate) { - super(oldPath, oldDate, newPath, newDate); - } - - /* - * (non-Javadoc) - * - * @see - * org.eclipse.compare.patch.IFilePatch#apply(org.eclipse.core.resources - * .IStorage, org.eclipse.compare.patch.PatchConfiguration, - * org.eclipse.core.runtime.IProgressMonitor) - */ - public IFilePatchResult apply(IStorage content, - PatchConfiguration configuration, IProgressMonitor monitor) { - return apply(content != null ? Utilities.getReaderCreator(content) - : null, configuration, monitor); - } - - protected FilePatch2 create(IPath oldPath, long oldDate, IPath newPath, - long newDate) { - return new FilePatch(oldPath, oldDate, newPath, newDate); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/HunkDiffNode.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/HunkDiffNode.java deleted file mode 100644 index 1fa0f3a79..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/HunkDiffNode.java +++ /dev/null @@ -1,108 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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.patch; - -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.internal.core.patch.HunkResult; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.compare.structuremergeviewer.Differencer; -import org.eclipse.core.resources.IResource; - -public class HunkDiffNode extends PatchDiffNode { - - private final HunkResult result; - - public static HunkDiffNode createDiffNode(PatchFileDiffNode parent, HunkResult result, boolean fullContext) { - return createDiffNode(parent, result, fullContext, fullContext, fullContext); - } - - public static HunkDiffNode createDiffNode(PatchFileDiffNode parent, HunkResult result, boolean ancestorFullContext, boolean leftFullContext, boolean rightFullContext) { - return new HunkDiffNode(result, parent, Differencer.CHANGE, getAncestorElement(result, ancestorFullContext), getLeftElement(result, leftFullContext), getRightElement(result, rightFullContext)); - } - - public static ITypedElement getRightElement(HunkResult result, boolean fullContext) { - return new HunkTypedElement(result, true /* isResult */, fullContext); - } - - private static ITypedElement getLeftElement(HunkResult result, - boolean fullContext) { - if (fullContext && !result.isOK()) - return new UnmatchedHunkTypedElement(result); - return new HunkTypedElement(result, false /* before state */, fullContext); - } - - public static ITypedElement getAncestorElement(HunkResult result, boolean fullContext) { - if (!fullContext && result.isOK()) { - return new HunkTypedElement(result, false /* before state */, fullContext); - } - if (!fullContext) { - // Don't provide an ancestor if the hunk didn't match or we're not doing fullContext - return null; - } - // Make the ancestor the same as the left so we have an incoming change - return new HunkTypedElement(result, false /* before state */, result.isOK()); - } - - public HunkDiffNode(HunkResult result, PatchFileDiffNode parent, int kind, ITypedElement ancestor, ITypedElement left, ITypedElement right) { - super(result.getHunk(), parent, kind, ancestor, left, right); - this.result = result; - } - - public HunkResult getHunkResult() { - return result; - } - - protected PatchConfiguration getConfiguration() { - return result.getDiffResult().getConfiguration(); - } - - public boolean isManuallyMerged() { - Object left = getLeft(); - if (left instanceof UnmatchedHunkTypedElement) { - UnmatchedHunkTypedElement element = (UnmatchedHunkTypedElement) left; - return element.isManuallyMerged(); - } - return false; - } - - public boolean isFuzzUsed() { - return result.getFuzz() > 0; - } - - public boolean isAllContextIgnored() { - int fuzz = result.getFuzz(); - if (fuzz > 0) { - String[] lines = result.getHunk().getLines(); - int contextLines = 0; - for (int i = 0; i < lines.length; i++) { - String line = lines[i]; - char c = line.charAt(0); - if (c == ' ') { - contextLines++; - } else { - if (contextLines > 0 && fuzz >= contextLines) { - return true; - } - contextLines = 0; - } - } - if (contextLines > 0 && fuzz >= contextLines) { - return true; - } - - } - return false; - } - - public IResource getResource() { - return ((PatchFileDiffNode)getParent()).getResource(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/HunkTypedElement.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/HunkTypedElement.java deleted file mode 100644 index 4ff4ab349..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/HunkTypedElement.java +++ /dev/null @@ -1,113 +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.internal.patch; - -import java.io.InputStream; - -import org.eclipse.compare.IEncodedStreamContentAccessor; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.DiffImageDescriptor; -import org.eclipse.compare.internal.ICompareUIConstants; -import org.eclipse.compare.internal.core.patch.FileDiffResult; -import org.eclipse.compare.internal.core.patch.HunkResult; -import org.eclipse.compare.patch.IHunk; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.LocalResourceManager; -import org.eclipse.swt.graphics.Image; - -public class HunkTypedElement implements ITypedElement, IEncodedStreamContentAccessor, IAdaptable { - - private final HunkResult fHunkResult; - private final boolean fIsAfterState; - private final boolean fFullContext; - - public HunkTypedElement(HunkResult result, boolean isAfterState, boolean fullContext) { - this.fHunkResult = result; - this.fIsAfterState = isAfterState; - this.fFullContext = fullContext; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ITypedElement#getImage() - */ - public Image getImage() { - LocalResourceManager imageCache = PatchCompareEditorInput.getImageCache(fHunkResult.getDiffResult().getConfiguration()); - ImageDescriptor imageDesc = CompareUIPlugin.getImageDescriptor(ICompareUIConstants.HUNK_OBJ); - Image image = imageCache.createImage(imageDesc); - if (!fHunkResult.isOK()) { - return getHunkErrorImage(image, imageCache, true); - } else if (fHunkResult.getFuzz() > 0) { - return getHunkOverlayImage(image, imageCache, ICompareUIConstants.WARNING_OVERLAY, true); - } - return image; - } - - public static Image getHunkErrorImage(Image baseImage, LocalResourceManager imageCache, boolean onLeft) { - return getHunkOverlayImage(baseImage, imageCache, ICompareUIConstants.ERROR_OVERLAY, onLeft); - } - - private static Image getHunkOverlayImage(Image baseImage, LocalResourceManager imageCache, String path, boolean onLeft) { - ImageDescriptor desc = new DiffImageDescriptor(baseImage, CompareUIPlugin.getImageDescriptor(path), ICompareUIConstants.COMPARE_IMAGE_WIDTH, onLeft); - Image image = imageCache.createImage(desc); - return image; - } - - public boolean isManuallyMerged() { - return getPatcher().isManuallyMerged(getHunkResult().getHunk()); - } - - private Patcher getPatcher() { - return Patcher.getPatcher(fHunkResult.getDiffResult().getConfiguration()); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ITypedElement#getName() - */ - public String getName() { - return fHunkResult.getHunk().getLabel(); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ITypedElement#getType() - */ - public String getType() { - return fHunkResult.getDiffResult().getDiff().getTargetPath(fHunkResult.getDiffResult().getConfiguration()).getFileExtension(); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IStreamContentAccessor#getContents() - */ - public InputStream getContents() throws CoreException { - String contents = fHunkResult.getContents(fIsAfterState, fFullContext); - return FileDiffResult.asInputStream(contents, fHunkResult.getCharset()); - } - - public String getCharset() throws CoreException { - return fHunkResult.getCharset(); - } - - public HunkResult getHunkResult() { - return fHunkResult; - } - - public Object getAdapter(Class adapter) { - if (adapter == IHunk.class) - return fHunkResult; - if (adapter == HunkResult.class) - return fHunkResult; - return Platform.getAdapterManager().getAdapter(this, adapter); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java deleted file mode 100644 index 7248fccb3..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java +++ /dev/null @@ -1,990 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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 - * Sebastian Davids <sdavids@gmx.de> - layout tweaks - * Matt McCutchen <hashproduct+eclipse@gmail.com> - Bug 180358 [Apply Patch] Cursor jumps to beginning of filename field on keystroke - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.lang.reflect.InvocationTargetException; -import java.net.MalformedURLException; -import java.net.URL; - -import org.eclipse.compare.internal.ICompareContextIds; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IFolder; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.Path; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.TreeSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.wizard.IWizardPage; -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.swt.SWT; -import org.eclipse.swt.dnd.Clipboard; -import org.eclipse.swt.dnd.TextTransfer; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.ShellAdapter; -import org.eclipse.swt.events.ShellEvent; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.model.WorkbenchContentProvider; -import org.eclipse.ui.model.WorkbenchLabelProvider; -import org.eclipse.ui.views.navigator.ResourceComparator; - -import com.ibm.icu.text.MessageFormat; - -public class InputPatchPage extends WizardPage { - - // constants - protected static final int SIZING_TEXT_FIELD_WIDTH= 250; - protected static final int COMBO_HISTORY_LENGTH= 5; - - // dialog store id constants - private final static String PAGE_NAME= "PatchWizardPage1"; //$NON-NLS-1$ - private final static String STORE_PATCH_FILES_ID= PAGE_NAME+".PATCH_FILES"; //$NON-NLS-1$ - private final static String STORE_PATCH_URLS_ID= PAGE_NAME+".PATCH_URLS"; //$NON-NLS-1$ - private final static String STORE_INPUT_METHOD_ID= PAGE_NAME+".INPUT_METHOD"; //$NON-NLS-1$ - private final static String STORE_WORKSPACE_PATH_ID= PAGE_NAME+".WORKSPACE_PATH"; //$NON-NLS-1$ - - //patch input constants - protected final static int CLIPBOARD= 1; - protected final static int FILE= 2; - protected final static int WORKSPACE= 3; - protected final static int URL= 4; - - protected final static String INPUTPATCHPAGE_NAME= "InputPatchPage"; //$NON-NLS-1$ - - static final char SEPARATOR= System.getProperty("file.separator").charAt(0); //$NON-NLS-1$ - - private boolean fShowError= false; - private String fPatchSource; - private boolean fPatchRead= false; - private PatchWizard fPatchWizard; - private ActivationListener fActivationListener= new ActivationListener(); - - // SWT widgets - private Button fUseClipboardButton; - private Combo fPatchFileNameField; - private Button fPatchFileBrowseButton; - private Button fUsePatchFileButton; - private Button fUseWorkspaceButton; - private Button fUseURLButton; - private Combo fPatchURLField; - private Label fWorkspaceSelectLabel; - private TreeViewer fTreeViewer; - - class ActivationListener extends ShellAdapter { - public void shellActivated(ShellEvent e) { - // allow error messages if the selected input actually has something selected in it - fShowError=true; - switch(getInputMethod()) { - case FILE: - fShowError= (fPatchFileNameField.getText() != ""); //$NON-NLS-1$ - break; - case URL: - fShowError = (fPatchURLField.getText() != ""); //$NON-NLS-1$ - break; - case WORKSPACE: - fShowError= (!fTreeViewer.getSelection().isEmpty()); - break; - } - updateWidgetEnablements(); - } - } - - public InputPatchPage(PatchWizard pw) { - super(INPUTPATCHPAGE_NAME, PatchMessages.InputPatchPage_title, null); - fPatchWizard= pw; - setMessage(PatchMessages.InputPatchPage_message); - } - - /* - * Get a path from the supplied text widget. - * @return org.eclipse.core.runtime.IPath - */ - protected IPath getPathFromText(Text textField) { - return (new Path(textField.getText())).makeAbsolute(); - } - - /* package */ String getPatchName() { - if (getInputMethod() == CLIPBOARD) - return PatchMessages.InputPatchPage_Clipboard; - return getPatchFilePath(); - } - - public void createControl(Composite parent) { - - Composite composite= new Composite(parent, SWT.NULL); - composite.setLayout(new GridLayout()); - composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); - setControl(composite); - - initializeDialogUnits(parent); - - buildPatchFileGroup(composite); - - // by default, whatever was used last was selected or - // default to File if nothing has been selected - restoreWidgetValues(); - - // see if there are any better options presently selected (i.e workspace - // or clipboard or URL from clipboard) - adjustToCurrentTarget(); - - // No error for dialog opening - fShowError= false; - clearErrorMessage(); - updateWidgetEnablements(); - - Shell shell= getShell(); - shell.addShellListener(fActivationListener); - - Dialog.applyDialogFont(composite); - PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ICompareContextIds.PATCH_INPUT_WIZARD_PAGE); - } - - /** - * Returns the next page depending on what type of patch is being applied: - * i) If the patch is a Workspace patch then it will proceed right to the PreviewPatchPage - * ii) If the patch is a single project patch then it will proceed to the PatchTargetPage, which - * allows the user to specify where to root the patch - * @return PreviewPatchPage if multi-project patch, PatchTargetPage if single project patch - */ - public IWizardPage getNextPage() { - - WorkspacePatcher patcher= ((PatchWizard) getWizard()).getPatcher(); - - // Read in the patch - readInPatch(); - - FilePatch2[] diffs= patcher.getDiffs(); - if (diffs == null || diffs.length == 0) { - String format= PatchMessages.InputPatchPage_NoDiffsFound_format; - String message= MessageFormat.format(format, new String[] { fPatchSource }); - MessageDialog.openInformation(null, - PatchMessages.InputPatchPage_PatchErrorDialog_title, message); - return this; - } - - // guess prefix count - int guess= 0; // guessPrefix(diffs); - patcher.setStripPrefixSegments(guess); - - // If this is a workspace patch we don't need to set a target as the targets will be figured out from - // all of the projects that make up the patch and continue on to final preview page - // else go on to target selection page - if (patcher.isWorkspacePatch()) { - // skip 'Patch Target' page - IWizardPage page = super.getNextPage(); - if (page.getName().equals(PatchTargetPage.PATCHTARGETPAGE_NAME)) - return page.getNextPage(); - } - - return super.getNextPage(); - } - - /* - * Reads in the patch contents - */ - public void readInPatch(){ - WorkspacePatcher patcher= ((PatchWizard) getWizard()).getPatcher(); - // Create a reader for the input - Reader reader= null; - try { - int inputMethod= getInputMethod(); - if (inputMethod == CLIPBOARD) { - Control c= getControl(); - if (c != null) { - Clipboard clipboard= new Clipboard(c.getDisplay()); - Object o= clipboard.getContents(TextTransfer.getInstance()); - clipboard.dispose(); - if (o instanceof String) - reader= new StringReader((String)o); - } - fPatchSource= PatchMessages.InputPatchPage_Clipboard_title; - } else if (inputMethod==FILE) { - String patchFilePath= getPatchFilePath(); - if (patchFilePath != null) { - try { - reader= new FileReader(patchFilePath); - } catch (FileNotFoundException ex) { - MessageDialog.openError(null, - PatchMessages.InputPatchPage_PatchErrorDialog_title, - PatchMessages.InputPatchPage_PatchFileNotFound_message); - } - } - fPatchSource= PatchMessages.InputPatchPage_PatchFile_title; - } else if (inputMethod==URL) { - String patchFileURL = fPatchURLField.getText(); - if (patchFileURL != null) { - try { - String contents = Utilities.getURLContents(new URL( - patchFileURL), getContainer()); - if (contents != null) - reader = new StringReader(contents); - } catch (MalformedURLException e) { - // ignore as we tested it with modify listener on combo - } catch (InvocationTargetException e) { // ignore - } catch (OperationCanceledException e) { // ignore - } catch (InterruptedException e) { // ignore - } - } - fPatchSource= PatchMessages.InputPatchPage_URL_title; - } else if (inputMethod==WORKSPACE) { - // Get the selected patch file (tree will only allow for one selection) - IResource[] resources= Utilities.getResources(fTreeViewer.getSelection()); - IResource patchFile= resources[0]; - if (patchFile != null) { - try { - reader= new FileReader(patchFile.getLocation().toFile()); - } catch (FileNotFoundException ex) { - MessageDialog.openError(null, PatchMessages.InputPatchPage_PatchErrorDialog_title, PatchMessages.InputPatchPage_PatchFileNotFound_message); - } catch (NullPointerException nex) { - //in case the path doesn't exist (eg. getLocation() returned null) - MessageDialog.openError(null, PatchMessages.InputPatchPage_PatchErrorDialog_title, PatchMessages.InputPatchPage_PatchFileNotFound_message); - } - } - fPatchSource= PatchMessages.InputPatchPage_WorkspacePatch_title; - } - - // parse the input - if (reader != null) { - try { - patcher.parse(new BufferedReader(reader)); - //report back to the patch wizard that the patch has been read in - fPatchWizard.patchReadIn(); - fPatchRead=true; - } catch (Exception ex) { - // Ignore. User will be informed of error since patcher contains no diffs - } - } - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException x) { - // silently ignored - } - } - } - } - - /* (non-JavaDoc) - * Method declared in IWizardPage. - */ - public boolean canFlipToNextPage() { - // we can't call getNextPage to determine if flipping is allowed since computing - // the next page is quite expensive. So we say yes if the page is complete. - return isPageComplete(); - } - - private void setEnablePatchFile(boolean enable) { - fPatchFileNameField.setEnabled(enable); - fPatchFileBrowseButton.setEnabled(enable); - } - - private void setEnableWorkspacePatch(boolean enable) { - fWorkspaceSelectLabel.setEnabled(enable); - fTreeViewer.getTree().setEnabled(enable); - } - - private void setEnableURLPatch(boolean enable) { - fPatchURLField.setEnabled(enable); - } - - /* - * Create the group for selecting the patch file - */ - private void buildPatchFileGroup(Composite parent) { - - final Composite composite= new Composite(parent, SWT.NULL); - GridLayout gridLayout= new GridLayout(); - gridLayout.numColumns= 3; - composite.setLayout(gridLayout); - composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - // 1st row - GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); - gd.horizontalSpan= 3; - fUseClipboardButton= new Button(composite, SWT.RADIO); - fUseClipboardButton.setText(PatchMessages.InputPatchPage_UseClipboardButton_text); - fUseClipboardButton.setLayoutData(gd); - - // 2nd row - fUsePatchFileButton= new Button(composite, SWT.RADIO); - fUsePatchFileButton.setText(PatchMessages.InputPatchPage_FileButton_text); - - fPatchFileNameField= new Combo(composite, SWT.BORDER); - gd= new GridData(GridData.FILL_HORIZONTAL); - gd.widthHint= SIZING_TEXT_FIELD_WIDTH; - fPatchFileNameField.setLayoutData(gd); - - fPatchFileBrowseButton= new Button(composite, SWT.PUSH); - fPatchFileBrowseButton.setText(PatchMessages.InputPatchPage_ChooseFileButton_text); - GridData data= new GridData(GridData.HORIZONTAL_ALIGN_FILL); - int widthHint= convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); - Point minSize= fPatchFileBrowseButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); - data.widthHint= Math.max(widthHint, minSize.x); - fPatchFileBrowseButton.setLayoutData(data); - - //3rd row - fUseURLButton = new Button(composite, SWT.RADIO); - fUseURLButton.setText(PatchMessages.InputPatchPage_URLButton_text); - - fPatchURLField = new Combo(composite, SWT.BORDER); - gd = new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalSpan = 2; - fPatchURLField.setLayoutData(gd); - - //4th row - fUseWorkspaceButton= new Button(composite, SWT.RADIO); - fUseWorkspaceButton.setText(PatchMessages.InputPatchPage_UseWorkspaceButton_text); - gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); - fUseWorkspaceButton.setLayoutData(gd); - - addWorkspaceControls(parent); - - // Add listeners - fUseClipboardButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (!fUseClipboardButton.getSelection()) - return; - - clearErrorMessage(); - fShowError= true; - int state= getInputMethod(); - setEnablePatchFile(state == FILE); - setEnableURLPatch(state == URL); - setEnableWorkspacePatch(state == WORKSPACE); - updateWidgetEnablements(); - fPatchRead = false; - } - }); - - fUsePatchFileButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (!fUsePatchFileButton.getSelection()) - return; - //If there is anything typed in at all - clearErrorMessage(); - fShowError= (fPatchFileNameField.getText() != ""); //$NON-NLS-1$ - int state= getInputMethod(); - setEnablePatchFile(state == FILE); - setEnableURLPatch(state == URL); - setEnableWorkspacePatch(state == WORKSPACE); - updateWidgetEnablements(); - fPatchRead = false; - } - }); - fPatchFileNameField.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - updateWidgetEnablements(); - } - }); - fPatchFileNameField.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent e) { - clearErrorMessage(); - fShowError= true; - updateWidgetEnablements(); - } - }); - fPatchFileBrowseButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - clearErrorMessage(); - fShowError= true; - handlePatchFileBrowseButtonPressed(); - updateWidgetEnablements(); - } - }); - fUseURLButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - clearErrorMessage(); - fShowError= (fPatchURLField.getText() != ""); //$NON-NLS-1$ - int state= getInputMethod(); - setEnablePatchFile(state == FILE); - setEnableURLPatch(state == URL); - setEnableWorkspacePatch(state == WORKSPACE); - updateWidgetEnablements(); - } - }); - fPatchURLField.addModifyListener(new ModifyListener() { - public void modifyText(ModifyEvent e) { - clearErrorMessage(); - fShowError = true; - updateWidgetEnablements(); - } - }); - fUseWorkspaceButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (!fUseWorkspaceButton.getSelection()) - return; - clearErrorMessage(); - // If there is anything typed in at all - fShowError= (!fTreeViewer.getSelection().isEmpty()); - int state= getInputMethod(); - setEnablePatchFile(state == FILE); - setEnableURLPatch(state == URL); - setEnableWorkspacePatch(state == WORKSPACE); - updateWidgetEnablements(); - fPatchRead = false; - } - }); - - fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent event) { - clearErrorMessage(); - updateWidgetEnablements(); - } - }); - - fTreeViewer.addDoubleClickListener(new IDoubleClickListener() { - public void doubleClick(DoubleClickEvent event) { - ISelection selection= event.getSelection(); - if (selection instanceof TreeSelection) { - TreeSelection treeSel= (TreeSelection) selection; - Object res= treeSel.getFirstElement(); - if (res != null) { - if (res instanceof IProject || res instanceof IFolder) { - if (fTreeViewer.getExpandedState(res)) - fTreeViewer.collapseToLevel(res, 1); - else - fTreeViewer.expandToLevel(res, 1); - } else if (res instanceof IFile) - fPatchWizard.showPage(getNextPage()); - } - } - } - }); - } - - private void addWorkspaceControls(Composite composite) { - - Composite newComp= new Composite(composite, SWT.NONE); - GridLayout layout= new GridLayout(1, false); - layout.marginLeft= 16; // align w/ lable of check button - newComp.setLayout(layout); - newComp.setLayoutData(new GridData(GridData.FILL_BOTH)); - - fWorkspaceSelectLabel= new Label(newComp, SWT.LEFT); - fWorkspaceSelectLabel.setText(PatchMessages.InputPatchPage_WorkspaceSelectPatch_text); - - fTreeViewer= new TreeViewer(newComp, SWT.BORDER); - fTreeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - - fTreeViewer.setLabelProvider(new WorkbenchLabelProvider()); - fTreeViewer.setContentProvider(new WorkbenchContentProvider()); - fTreeViewer.setComparator(new ResourceComparator(ResourceComparator.NAME)); - fTreeViewer.setInput(ResourcesPlugin.getWorkspace().getRoot()); - } - - - /** - * Updates the enable state of this page's controls. - */ - private void updateWidgetEnablements() { - - String error= null; - - boolean gotPatch= false; - int inputMethod= getInputMethod(); - if (inputMethod==CLIPBOARD) { - Control c= getControl(); - if (c != null) { - Clipboard clipboard= new Clipboard(c.getDisplay()); - Object o= clipboard.getContents(TextTransfer.getInstance()); - clipboard.dispose(); - if (o instanceof String) { - String s= ((String) o).trim(); - if (s.length() > 0) - gotPatch= true; - else - error= PatchMessages.InputPatchPage_ClipboardIsEmpty_message; - } else - error= PatchMessages.InputPatchPage_NoTextInClipboard_message; - } else - error= PatchMessages.InputPatchPage_CouldNotReadClipboard_message; - } else if (inputMethod==FILE) { - String path= fPatchFileNameField.getText(); - if (path != null && path.length() > 0) { - File file= new File(path); - gotPatch= file.exists() && file.isFile() && file.length() > 0; - if (!gotPatch) - error= PatchMessages.InputPatchPage_CannotLocatePatch_message + path; - } else { - error= PatchMessages.InputPatchPage_NoFileName_message; - } - } else if (inputMethod == URL) { - String urlText = fPatchURLField.getText(); - if(urlText != null) { - try { - new URL(urlText); - // Checking the URL is a bit too heavy for each keystroke. - // Let's assume it contains a valid patch. - gotPatch = true; - } catch (MalformedURLException e) { - error= PatchMessages.InputPatchPage_MalformedURL; - } - } else { - error= PatchMessages.InputPatchPage_NoURL; - } - } else if (inputMethod == WORKSPACE) { - //Get the selected patch file (tree will only allow for one selection) - IResource[] resources= Utilities.getResources(fTreeViewer.getSelection()); - if (resources != null && resources.length > 0) { - IResource patchFile= resources[0]; - if (patchFile != null && patchFile.getType() == IResource.FILE) { - IPath location = patchFile.getLocation(); - if (location == null) { - error = PatchMessages.InputPatchPage_PatchFileNotFound_message; - } else { - File actualFile= location.toFile(); - gotPatch= actualFile.exists()&&actualFile.isFile()&&actualFile.length() > 0; - if (!gotPatch) - error= PatchMessages.InputPatchPage_FileSelectedNotPatch_message; - } - } - } else { - error= PatchMessages.InputPatchPage_NoFileName_message; - } - } - - setPageComplete(gotPatch); - - if (fShowError) - setErrorMessage(error); - } - - protected void handlePatchFileBrowseButtonPressed() { - FileDialog dialog= new FileDialog(getShell(), SWT.NONE); - dialog.setText(PatchMessages.InputPatchPage_SelectPatchFileDialog_title); - String patchFilePath= getPatchFilePath(); - if (patchFilePath != null) { - int lastSegment= patchFilePath.lastIndexOf(SEPARATOR); - if (lastSegment > 0) { - patchFilePath= patchFilePath.substring(0, lastSegment); - } - } - dialog.setFilterPath(patchFilePath); - String res= dialog.open(); - if (res == null) - return; - - patchFilePath= dialog.getFileName(); - IPath filterPath= new Path(dialog.getFilterPath()); - IPath path= filterPath.append(patchFilePath).makeAbsolute(); - patchFilePath= path.toOSString(); - //fDialogSettings.put(IUIConstants.DIALOGSTORE_LASTEXTJAR, filterPath.toOSString()); - - fPatchFileNameField.setText(patchFilePath); - //setSourceName(patchFilePath); - } - - /** - * Sets the source name of the import to be the supplied path. - * Adds the name of the path to the list of items in the - * source combo and selects it. - * - * @param path the path to be added - */ - protected void setSourceName(String path) { - - if (path.length() > 0) { - - String[] currentItems= fPatchFileNameField.getItems(); - int selectionIndex= -1; - for (int i= 0; i < currentItems.length; i++) - if (currentItems[i].equals(path)) - selectionIndex= i; - - if (selectionIndex < 0) { // not found in history - int oldLength= currentItems.length; - String[] newItems= new String[oldLength + 1]; - System.arraycopy(currentItems, 0, newItems, 0, oldLength); - newItems[oldLength]= path; - fPatchFileNameField.setItems(newItems); - selectionIndex= oldLength; - } - fPatchFileNameField.select(selectionIndex); - - //resetSelection(); - } - } - - /** - * The Finish button was pressed. Try to do the required work now and answer - * a boolean indicating success. If false is returned then the wizard will - * not close. - * - * @return boolean - */ - public boolean finish() { -// if (!ensureSourceIsValid()) -// return false; - - saveWidgetValues(); - -// Iterator resourcesEnum= getSelectedResources().iterator(); -// List fileSystemObjects= new ArrayList(); -// while (resourcesEnum.hasNext()) { -// fileSystemObjects.add( -// ((FileSystemElement) resourcesEnum.next()).getFileSystemObject()); -// } -// -// if (fileSystemObjects.size() > 0) -// return importResources(fileSystemObjects); -// -// MessageDialog -// .openInformation( -// getContainer().getShell(), -// DataTransferMessages.getString("DataTransfer.information"), //$NON-NLS-1$ -// DataTransferMessages.getString("FileImport.noneSelected")); //$NON-NLS-1$ -// -// return false; - - return true; - } - - /** - * Use the dialog store to restore widget values to the values that they held - * last time this wizard was used to completion - */ - private void restoreWidgetValues() { - - int inputMethod= FILE; - - IDialogSettings settings= getDialogSettings(); - if (settings != null) { - - try { - inputMethod= settings.getInt(STORE_INPUT_METHOD_ID); - } catch (NumberFormatException ex) { - //OK - no value stored in settings; just use CLIPBOARD - } - - // set filenames history - String[] sourceNames= settings.getArray(STORE_PATCH_FILES_ID); - if (sourceNames != null) - for (int i= 0; i < sourceNames.length; i++) - if (sourceNames[i] != null && sourceNames[i].length() > 0) - fPatchFileNameField.add(sourceNames[i]); - - // set patch file path - String patchFilePath= settings.get(STORE_PATCH_FILES_ID); - if (patchFilePath != null) - setSourceName(patchFilePath); - - // set URLs history - String[] sourceURLs= settings.getArray(STORE_PATCH_URLS_ID); - if (sourceURLs != null) - for (int i= 0; i < sourceURLs.length; i++) - if (sourceURLs[i] != null && sourceURLs[i].length() > 0) - fPatchURLField.add(sourceURLs[i]); - - // If the previous apply patch was used with a clipboard, we need to check - // if there is a valid patch on the clipboard. This will be done in adjustToCurrentTarget() - // so just set it to FILE now and, if there exists a patch on the clipboard, then clipboard - // will be selected automatically - if (inputMethod == CLIPBOARD){ - inputMethod= FILE; - fPatchFileNameField.deselectAll(); - } - - //set the workspace patch selection - String workspaceSetting= settings.get(STORE_WORKSPACE_PATH_ID); - if (workspaceSetting != null && workspaceSetting.length() > 0) { - // See if this resource still exists in the workspace - try { - IPath path= new Path(workspaceSetting); - IFile targetFile= ResourcesPlugin.getWorkspace().getRoot().getFile(path); - if (fTreeViewer != null && targetFile.exists()){ - fTreeViewer.expandToLevel(targetFile, 0); - fTreeViewer.setSelection(new StructuredSelection(targetFile)); - } - } catch (RuntimeException e) { - // Ignore. The setting was invalid - } - } else { - //check to see if the current input is set to workspace - if it is switch it - //back to clipboard since there is no corresponding element to go along with - //the tree viewer - if (inputMethod == WORKSPACE) - inputMethod= FILE; - } - } - - // set radio buttons state - setInputButtonState(inputMethod); - } - - /** - * Since Finish was pressed, write widget values to the dialog store so that they - * will persist into the next invocation of this wizard page - */ - void saveWidgetValues() { - IDialogSettings settings= getDialogSettings(); - if (settings != null) { - - settings.put(STORE_INPUT_METHOD_ID, getInputMethod()); - settings.put(STORE_PATCH_FILES_ID, getPatchFilePath()); - - // update source names history - String[] sourceNames= settings.getArray(STORE_PATCH_FILES_ID); - if (sourceNames == null) - sourceNames= new String[0]; - - sourceNames= addToHistory(sourceNames, getPatchFilePath()); - settings.put(STORE_PATCH_FILES_ID, sourceNames); - - // update source URLs history - String[] sourceURLs= settings.getArray(STORE_PATCH_URLS_ID); - if (sourceURLs == null) - sourceURLs= new String[0]; - - sourceURLs= addToHistory(sourceURLs, fPatchURLField.getText()); - settings.put(STORE_PATCH_URLS_ID, sourceURLs); - - // save the workspace selection - settings.put(STORE_WORKSPACE_PATH_ID, getWorkspacePath()); - - } - } - - private String getWorkspacePath() { - if (fTreeViewer != null){ - IResource[] resources= Utilities.getResources(fTreeViewer.getSelection()); - if (resources.length > 0) { - IResource patchFile= resources[0]; - return patchFile.getFullPath().toString(); - } - - } - return ""; //$NON-NLS-1$ - } - - // static helpers - - /** - * Checks to see if the file that has been selected for Apply Patch is - * actually a patch - * - * @return true if the file selected to run Apply Patch on in the workspace - * is a patch file or if the clipboard contains a patch or if the - * clipboard contains an URL (we assume it points to a patch ) - */ - private boolean adjustToCurrentTarget() { - // readjust selection if there is a patch selected in the workspace or on the clipboard - // check workspace first - IResource patchTarget= fPatchWizard.getTarget(); - if (patchTarget instanceof IFile) { - Reader reader= null; - try { - try { - reader= new FileReader(patchTarget.getLocation().toFile()); - if (isPatchFile(reader)) { - // set choice to workspace - setInputButtonState(WORKSPACE); - if (fTreeViewer != null && patchTarget.exists()) { - fTreeViewer.expandToLevel(patchTarget, 0); - fTreeViewer.setSelection(new StructuredSelection(patchTarget)); - } - return true; - } - } catch (FileNotFoundException ex) { - // silently ignored - } catch (NullPointerException nex) { - // silently ignored - } - - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException x) { - // silently ignored - } - } - } - } - // check out clipboard contents - Reader reader = null; - Control c = getControl(); - if (c != null) { - Clipboard clipboard= new Clipboard(c.getDisplay()); - Object o= clipboard.getContents(TextTransfer.getInstance()); - clipboard.dispose(); - try { - if (o instanceof String) { - reader= new StringReader((String) o); - if (isPatchFile(reader)) { - setInputButtonState(CLIPBOARD); - return true; - } - // maybe it's an URL - try { - URL url = new URL((String)o); - if(url != null) { - setInputButtonState(URL); - fPatchURLField.setText((String)o); - return true; - } - } catch (MalformedURLException e) { - // ignore - } - } - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException x) { - // silently ignored - } - } - } - } - return false; - } - - private boolean isPatchFile(Reader reader) { - WorkspacePatcher patcher= ((PatchWizard) getWizard()).getPatcher(); - - try { - patcher.parse(new BufferedReader(reader)); - } catch (Exception ex) { - return false; - } - - FilePatch2[] diffs= patcher.getDiffs(); - if (diffs == null || diffs.length == 0) - return false; - return true; - } - - /* - * Clears the dialog message box - */ - private void clearErrorMessage(){ - setErrorMessage(null); - } - - private void setInputButtonState(int state) { - - switch (state) { - case CLIPBOARD: - fUseClipboardButton.setSelection(true); - fUsePatchFileButton.setSelection(false); - fUseURLButton.setSelection(false); - fUseWorkspaceButton.setSelection(false); - break; - - case FILE: - fUseClipboardButton.setSelection(false); - fUsePatchFileButton.setSelection(true); - fUseURLButton.setSelection(false); - fUseWorkspaceButton.setSelection(false); - break; - - case URL: - fUseClipboardButton.setSelection(false); - fUsePatchFileButton.setSelection(false); - fUseURLButton.setSelection(true); - fUseWorkspaceButton.setSelection(false); - break; - - case WORKSPACE: - fUseClipboardButton.setSelection(false); - fUsePatchFileButton.setSelection(false); - fUseURLButton.setSelection(false); - fUseWorkspaceButton.setSelection(true); - break; - } - - setEnablePatchFile(state == FILE); - setEnableWorkspacePatch(state == WORKSPACE); - setEnableURLPatch(state == URL); - } - - protected int getInputMethod() { - if (fUseClipboardButton.getSelection()) - return CLIPBOARD; - if (fUsePatchFileButton.getSelection()) - return FILE; - if(fUseURLButton.getSelection()) - return URL; - return WORKSPACE; - } - - private String getPatchFilePath() { - if (fPatchFileNameField != null) - return fPatchFileNameField.getText(); - return ""; //$NON-NLS-1$ - } - - /* - * Adds an entry to a history, while taking care of duplicate history items - * and excessively long histories. The assumption is made that all histories - * should be of length <code>COMBO_HISTORY_LENGTH</code>. - * - * @param history the current history - * @param newEntry the entry to add to the history - */ - protected static String[] addToHistory(String[] history, String newEntry) { - java.util.ArrayList l= new java.util.ArrayList(java.util.Arrays.asList(history)); - - l.remove(newEntry); - l.add(0,newEntry); - - // since only one new item was added, we can be over the limit - // by at most one item - if (l.size() > COMBO_HISTORY_LENGTH) - l.remove(COMBO_HISTORY_LENGTH); - - return (String[]) l.toArray(new String[l.size()]); - } - - public boolean isPatchRead() { - return fPatchRead; - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/LineReader.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/LineReader.java deleted file mode 100644 index 735b1c3d3..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/LineReader.java +++ /dev/null @@ -1,253 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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 - * Brock Janiczak <brockj@tpg.com.au> - Bug 181919 LineReader creating unneeded garbage - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IStorage; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.Platform; - -public class LineReader { - - /* - * Reads the contents from the given file and returns them as a List of - * lines. - */ - public static List load(IStorage file, boolean create) { - List lines = null; - if (!create && file != null && exists(file)) { - // read current contents - String charset = Utilities.getCharset(file); - InputStream is = null; - try { - is = file.getContents(); - - Reader streamReader = null; - try { - streamReader = new InputStreamReader(is, charset); - } catch (UnsupportedEncodingException x) { - // use default encoding - streamReader = new InputStreamReader(is); - } - - BufferedReader reader = new BufferedReader(streamReader); - lines = readLines(reader); - } catch (CoreException ex) { - // TODO - CompareUIPlugin.log(ex); - } finally { - if (is != null) - try { - is.close(); - } catch (IOException ex) { - // silently ignored - } - } - } - - if (lines == null) - lines = new ArrayList(); - return lines; - } - - private static boolean exists(IStorage file) { - if (file instanceof IFile) { - return ((IFile) file).exists(); - } - return true; - } - - public static List readLines(BufferedReader reader) { - List lines; - LineReader lr = new LineReader(reader); - if (!Platform.WS_CARBON.equals(Platform.getWS())) - // Don't treat single CRs as line feeds to be consistent with command line patch - lr.ignoreSingleCR(); - lines = lr.readLines(); - return lines; - } - - /* - * Concatenates all strings found in the given List. - */ - public static String createString(boolean preserveLineDelimeters, List lines) { - StringBuffer sb = new StringBuffer(); - Iterator iter = lines.iterator(); - if (preserveLineDelimeters) { - while (iter.hasNext()) - sb.append((String) iter.next()); - } else { - String lineSeparator = System.getProperty("line.separator"); //$NON-NLS-1$ - while (iter.hasNext()) { - String line = (String) iter.next(); - int l = length(line); - if (l < line.length()) { // line has delimiter - sb.append(line.substring(0, l)); - sb.append(lineSeparator); - } else { - sb.append(line); - } - } - } - return sb.toString(); - } - - /* - * Returns the length (excluding a line delimiter CR, LF, CR/LF) of the - * given string. - */ - /* package */static int length(String s) { - int l = s.length(); - if (l > 0) { - char c = s.charAt(l - 1); - if (c == '\r') - return l - 1; - if (c == '\n') { - if (l > 1 && s.charAt(l - 2) == '\r') - return l - 2; - return l - 1; - } - } - return l; - } - - private boolean fHaveChar = false; - private int fLastChar; - private boolean fSawEOF = false; - private BufferedReader fReader; - private boolean fIgnoreSingleCR = false; - private StringBuffer fBuffer = new StringBuffer(); - - public LineReader(BufferedReader reader) { - fReader = reader; - Assert.isNotNull(reader); - } - - public void ignoreSingleCR() { - fIgnoreSingleCR = true; - } - - /** - * Reads a line of text. A line is considered to be terminated by any one of - * a line feed ('\n'), a carriage return ('\r'), or a carriage return - * followed immediately by a line-feed. - * - * @return A string containing the contents of the line including the - * line-termination characters, or <code>null</code> if the end of - * the stream has been reached - * @exception IOException - * If an I/O error occurs - */ - /* package */String readLine() throws IOException { - try { - while (!fSawEOF) { - int c = readChar(); - if (c == -1) { - fSawEOF = true; - break; - } - fBuffer.append((char) c); - if (c == '\n') - break; - if (c == '\r') { - c = readChar(); - if (c == -1) { - fSawEOF = true; - break; // EOF - } - if (c != '\n') { - if (fIgnoreSingleCR) { - fBuffer.append((char) c); - continue; - } - fHaveChar = true; - fLastChar = c; - } else - fBuffer.append((char) c); - break; - } - } - - if (fBuffer.length() != 0) { - return fBuffer.toString(); - } - return null; - } finally { - fBuffer.setLength(0); - } - } - - /* package */void close() { - try { - fReader.close(); - } catch (IOException ex) { - // silently ignored - } - } - - public List readLines() { - try { - List lines = new ArrayList(); - String line; - while ((line = readLine()) != null) - lines.add(line); - return lines; - } catch (IOException ex) { - // NeedWork - // System.out.println("error while reading file: " + fileName + "(" - // + ex + ")"); - } finally { - close(); - } - return null; - } - - /* - * Returns the number of characters in the given string without counting a - * trailing line separator. - */ - /* package */int lineContentLength(String line) { - if (line == null) - return 0; - int length = line.length(); - for (int i = length - 1; i >= 0; i--) { - char c = line.charAt(i); - if (c == '\n' || c == '\r') - length--; - else - break; - } - return length; - } - - // ---- private - - private int readChar() throws IOException { - if (fHaveChar) { - fHaveChar = false; - return fLastChar; - } - return fReader.read(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareEditorInput.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareEditorInput.java deleted file mode 100644 index c8bc3da77..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareEditorInput.java +++ /dev/null @@ -1,433 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 2010 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.patch; - -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.compare.CompareUI; -import org.eclipse.compare.CompareViewerPane; -import org.eclipse.compare.IContentChangeListener; -import org.eclipse.compare.IContentChangeNotifier; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.ICompareUIConstants; -import org.eclipse.compare.internal.core.patch.DiffProject; -import org.eclipse.compare.internal.core.patch.FileDiffResult; -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.compare.internal.core.patch.HunkResult; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.compare.structuremergeviewer.DiffNode; -import org.eclipse.compare.structuremergeviewer.DiffTreeViewer; -import org.eclipse.compare.structuremergeviewer.Differencer; -import org.eclipse.compare.structuremergeviewer.ICompareInput; -import org.eclipse.compare.structuremergeviewer.IDiffElement; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.action.ToolBarManager; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.resource.LocalResourceManager; -import org.eclipse.jface.viewers.IDecoration; -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.jface.viewers.IOpenListener; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.OpenEvent; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerFilter; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Composite; - -public abstract class PatchCompareEditorInput extends CompareEditorInput { - - private static final String IMAGE_CACHE_KEY = "IMAGE_CACHE"; //$NON-NLS-1$ - - public static ImageDescriptor createOverlay(Image baseImage, ImageDescriptor overlayImage, int quadrant) { - return new DecoratorOverlayIcon(baseImage, createArrayFrom(overlayImage, quadrant), new Point(Math.max(baseImage.getBounds().width, 16), Math.max(baseImage.getBounds().height, 16))); - } - - private static ImageDescriptor[] createArrayFrom( - ImageDescriptor overlayImage, int quadrant) { - ImageDescriptor[] descs = new ImageDescriptor[] { null, null, null, null, null }; - descs[quadrant] = overlayImage; - return descs; - } - - class PatcherCompareEditorLabelProvider extends LabelProvider { - private ILabelProvider wrappedProvider; - - public PatcherCompareEditorLabelProvider(ILabelProvider labelProvider) { - wrappedProvider = labelProvider; - } - - public String getText(Object element) { - String text = wrappedProvider.getText(element); - if (element instanceof PatchDiffNode){ - PatchDiffNode node = (PatchDiffNode) element; - if (node instanceof PatchProjectDiffNode) { - PatchProjectDiffNode projectNode = (PatchProjectDiffNode) node; - if (!Utilities.getProject(projectNode.getDiffProject()).exists()) { - text = NLS.bind(PatchMessages.Diff_2Args, new String[]{text, PatchMessages.PreviewPatchLabelDecorator_ProjectDoesNotExist}); - } - } - if (!node.isEnabled()) { - return NLS.bind(PatchMessages.Diff_2Args, - new String[]{text, PatchMessages.PatcherCompareEditorInput_NotIncluded}); - } - if (node instanceof PatchFileDiffNode) { - PatchFileDiffNode fileNode = (PatchFileDiffNode) node; - if (getPatcher().hasCachedContents(fileNode.getDiffResult().getDiff())) { - text = NLS.bind(PatchMessages.Diff_2Args, new String[] {text, PatchMessages.HunkMergePage_Merged}); - } - if (!fileNode.fileExists()) { - text = NLS.bind(PatchMessages.Diff_2Args, new String[] {text, PatchMessages.PatchCompareEditorInput_0}); - } - } - if (node instanceof HunkDiffNode) { - HunkDiffNode hunkNode = (HunkDiffNode) node; - if (hunkNode.isManuallyMerged()) { - text = NLS.bind(PatchMessages.Diff_2Args, new String[] {text, PatchMessages.HunkMergePage_Merged}); - } - if (hunkNode.isFuzzUsed()) { - text = NLS.bind(PatchMessages.Diff_2Args, - new String[] { text, - NLS.bind(hunkNode.isAllContextIgnored() ? PatchMessages.PreviewPatchPage_AllContextIgnored : PatchMessages.PreviewPatchPage_FuzzUsed, - new String[] { hunkNode.getHunkResult().getFuzz() + ""}) }); //$NON-NLS-1$ - } - } - if (getPatcher().isRetargeted(node.getPatchElement())) - return NLS.bind(PatchMessages.Diff_2Args, - new String[]{getPatcher().getOriginalPath(node.getPatchElement()).toString(), - NLS.bind(PatchMessages.PreviewPatchPage_Target, new String[]{node.getName()})}); - } - return text; - } - - public Image getImage(Object element) { - Image image = wrappedProvider.getImage(element); - if (element instanceof PatchDiffNode){ - PatchDiffNode node = (PatchDiffNode) element; - if (!node.isEnabled() && image != null) { - LocalResourceManager imageCache = PatchCompareEditorInput.getImageCache(getPatcher().getConfiguration()); - return imageCache.createImage(createOverlay(image, CompareUIPlugin.getImageDescriptor(ICompareUIConstants.REMOVED_OVERLAY), IDecoration.TOP_LEFT)); - } - } - if (element instanceof HunkDiffNode) { - HunkDiffNode node = (HunkDiffNode) element; - if (node.isManuallyMerged()) { - LocalResourceManager imageCache = PatchCompareEditorInput.getImageCache(getPatcher().getConfiguration()); - return imageCache.createImage(PatchCompareEditorInput.createOverlay(image, CompareUIPlugin.getImageDescriptor(ICompareUIConstants.IS_MERGED_OVERLAY), IDecoration.TOP_LEFT)); - } - } - return image; - } - } - - private final DiffNode root; - private final WorkspacePatcher patcher; - private TreeViewer viewer; - private boolean fShowAll; - private boolean showMatched = false; - - /** - * Creates a new PatchCompareEditorInput and makes use of the passed in CompareConfiguration - * to configure the UI elements. - * @param patcher - * @param configuration - */ - public PatchCompareEditorInput(WorkspacePatcher patcher, CompareConfiguration configuration) { - super(configuration); - Assert.isNotNull(patcher); - this.patcher = patcher; - root = new DiffNode(Differencer.NO_CHANGE) { - public boolean hasChildren() { - return true; - } - }; - initializeImageCache(); - } - - private void initializeImageCache() { - initializeImageCache(patcher.getConfiguration()); - } - - private static LocalResourceManager initializeImageCache(PatchConfiguration patchConfiguration) { - LocalResourceManager imageCache = new LocalResourceManager(JFaceResources.getResources()); - patchConfiguration.setProperty(IMAGE_CACHE_KEY, imageCache); - return imageCache; - } - - protected void handleDispose() { - super.handleDispose(); - getImageCache(getPatcher().getConfiguration()).dispose(); - } - - public static LocalResourceManager getImageCache(PatchConfiguration patchConfiguration) { - LocalResourceManager cache = (LocalResourceManager)patchConfiguration.getProperty(IMAGE_CACHE_KEY); - if (cache == null) { - return initializeImageCache(patchConfiguration); - } - return cache; - } - - protected Object prepareInput(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - initLabels(); - return root; - } - - private void initLabels() { - CompareConfiguration cc = getCompareConfiguration(); - // set left editable so that unmatched hunks can be edited - cc.setLeftEditable(true); - cc.setRightEditable(false); - //cc.setProperty(CompareEditor.CONFIRM_SAVE_PROPERTY, new Boolean(false)); - cc.setLeftLabel(getCompareConfiguration().getLeftLabel(root)); - cc.setLeftImage(getCompareConfiguration().getLeftImage(root)); - cc.setRightLabel(getCompareConfiguration().getRightLabel(root)); - cc.setRightImage(getCompareConfiguration().getRightImage(root)); - } - - /** - * Update the presentation of the diff tree. - */ - protected void updateTree() { - if (getViewer() != null && !getViewer().getControl().isDisposed()) - getViewer().refresh(true); - } - - /** - * Build the diff tree. - */ - protected void buildTree(){ - - // Reset the input node so it is empty - if (getRoot().hasChildren()) { - resetRoot(); - } - // Reset the input of the viewer so the old state is no longer used - getViewer().setInput(getRoot()); - - // Refresh the patcher state - getPatcher().refresh(); - - // Build the diff tree - if (getPatcher().isWorkspacePatch()){ - processProjects(getPatcher().getDiffProjects()); - } else { - processDiffs(getPatcher().getDiffs()); - } - - // Refresh the viewer - getViewer().refresh(); - } - - private void processDiffs(FilePatch2[] diffs) { - for (int i = 0; i < diffs.length; i++) { - processDiff(diffs[i], getRoot()); - } - } - - private void processProjects(DiffProject[] diffProjects) { - //create diffProject nodes - for (int i = 0; i < diffProjects.length; i++) { - PatchProjectDiffNode projectNode = new PatchProjectDiffNode(getRoot(), diffProjects[i], getPatcher().getConfiguration()); - FilePatch2[] diffs = diffProjects[i].getFileDiffs(); - for (int j = 0; j < diffs.length; j++) { - FilePatch2 fileDiff = diffs[j]; - processDiff(fileDiff, projectNode); - } - } - } - - private void processDiff(FilePatch2 diff, DiffNode parent) { - FileDiffResult diffResult = getPatcher().getDiffResult(diff); - PatchFileDiffNode node = PatchFileDiffNode.createDiffNode(parent, diffResult); - HunkResult[] hunkResults = diffResult.getHunkResults(); - for (int i = 0; i < hunkResults.length; i++) { - HunkResult hunkResult = hunkResults[i]; - if (!hunkResult.isOK()) { - HunkDiffNode hunkNode = HunkDiffNode.createDiffNode(node, hunkResult, true); - Object left = hunkNode.getLeft(); - if (left instanceof UnmatchedHunkTypedElement) { - UnmatchedHunkTypedElement element = (UnmatchedHunkTypedElement) left; - element.addContentChangeListener(new IContentChangeListener() { - public void contentChanged(IContentChangeNotifier source) { - if (getViewer() == null || getViewer().getControl().isDisposed()) - return; - getViewer().refresh(true); - } - }); - } - } else if (showMatched) { - HunkDiffNode.createDiffNode(node, hunkResult, false, true, false); - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.CompareEditorInput#createDiffViewer(org.eclipse.swt.widgets.Composite) - */ - public Viewer createDiffViewer(Composite parent) { - viewer = new DiffTreeViewer(parent, getCompareConfiguration()){ - protected void fillContextMenu(IMenuManager manager) { - PatchCompareEditorInput.this.fillContextMenu(manager); - } - }; - - viewer.setLabelProvider(new PatcherCompareEditorLabelProvider((ILabelProvider)viewer.getLabelProvider())); - viewer.getTree().setData(CompareUI.COMPARE_VIEWER_TITLE, PatchMessages.PatcherCompareEditorInput_PatchContents); - viewer.addOpenListener(new IOpenListener() { - public void open(OpenEvent event) { - IStructuredSelection sel= (IStructuredSelection) event.getSelection(); - Object obj= sel.getFirstElement(); - if (obj instanceof HunkDiffNode) { - if (((HunkDiffNode) obj).getHunkResult().isOK()) { - getCompareConfiguration().setLeftLabel(PatchMessages.PatcherCompareEditorInput_LocalCopy); - getCompareConfiguration().setRightLabel(PatchMessages.PreviewPatchPage2_MatchedHunk); - } else { - getCompareConfiguration().setLeftLabel(PatchMessages.PreviewPatchPage2_PatchedLocalFile); - getCompareConfiguration().setRightLabel(PatchMessages.PreviewPatchPage2_OrphanedHunk); - } - } else { - getCompareConfiguration().setLeftLabel(PatchMessages.PatcherCompareEditorInput_LocalCopy); - getCompareConfiguration().setRightLabel(PatchMessages.PatcherCompareEditorInput_AfterPatch); - } - } - - }); - viewer.setFilters(getFilters()); - viewer.setInput(root); - return viewer; - } - - private ViewerFilter[] getFilters() { - return new ViewerFilter[] { new ViewerFilter() { - public boolean select(Viewer v, Object parentElement, Object element) { - if (element instanceof PatchDiffNode) { - PatchDiffNode node = (PatchDiffNode) element; - return node.isEnabled() || isShowAll(); - } - return false; - } - } }; - } - - protected boolean isShowAll() { - return fShowAll; - } - - protected void setShowAll(boolean show) { - fShowAll = show; - } - - public boolean isShowMatched() { - return showMatched; - } - - protected void setShowMatched(boolean show) { - showMatched = show; - } - - public void contributeDiffViewerToolbarItems(Action[] actions, boolean workspacePatch){ - ToolBarManager tbm= CompareViewerPane.getToolBarManager(viewer.getControl().getParent()); - if (tbm != null) { - tbm.removeAll(); - - tbm.add(new Separator("contributed")); //$NON-NLS-1$ - - for (int i = 0; i < actions.length; i++) { - tbm.appendToGroup("contributed", actions[i]); //$NON-NLS-1$ - } - - tbm.update(true); - } - } - - public TreeViewer getViewer() { - return viewer; - } - - public DiffNode getRoot() { - return root; - } - - public void resetRoot() { - IDiffElement[] children = root.getChildren(); - for (int i = 0; i < children.length; i++) { - IDiffElement child = children[i]; - root.remove(child); - } - } - - public WorkspacePatcher getPatcher() { - return patcher; - } - - public boolean confirmRebuild(String message) { - if (getPatcher().hasCachedContents()) { - if (promptToDiscardCachedChanges(message)) { - getPatcher().clearCachedContents(); - return true; - } - return false; - } - return true; - } - - private boolean promptToDiscardCachedChanges(String message) { - return MessageDialog.openConfirm(viewer.getControl().getShell(), PatchMessages.PatcherCompareEditorInput_0, message); - } - - /** - * Return whether this input has a result to apply. The input - * has a result to apply if at least one hunk is selected for inclusion. - * @return whether this input has a result to apply - */ - public boolean hasResultToApply() { - boolean atLeastOneIsEnabled = false; - if (getViewer() != null) { - IDiffElement[] elements = getRoot().getChildren(); - for (int i = 0; i < elements.length; i++) { - IDiffElement element = elements[i]; - if (isEnabled(element)) { - atLeastOneIsEnabled = true; - break; - } - } - } - return atLeastOneIsEnabled; - } - - private boolean isEnabled(IDiffElement element) { - if (element instanceof PatchDiffNode) { - PatchDiffNode node = (PatchDiffNode) element; - return node.isEnabled(); - } - return false; - } - - protected abstract void fillContextMenu(IMenuManager manager); - - public Viewer findStructureViewer(Viewer oldViewer, ICompareInput input, - Composite parent) { - if (org.eclipse.compare.internal.Utilities.isHunk(input)) - return null; - return super.findStructureViewer(oldViewer, input, parent); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchDiffNode.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchDiffNode.java deleted file mode 100644 index 351af89d3..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchDiffNode.java +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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.patch; - -import org.eclipse.compare.IResourceProvider; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.compare.structuremergeviewer.DiffNode; -import org.eclipse.compare.structuremergeviewer.IDiffContainer; -import org.eclipse.core.resources.IResource; - -public abstract class PatchDiffNode extends DiffNode implements IResourceProvider { - - private Object fElement; - - public PatchDiffNode(Object patchElement, IDiffContainer parent, int kind, - ITypedElement ancestor, ITypedElement left, ITypedElement right) { - super(parent, kind, ancestor, left, right); - fElement = patchElement; - } - - public PatchDiffNode(Object patchElement, IDiffContainer parent, int kind) { - super(parent, kind); - fElement = patchElement; - } - - public boolean isEnabled() { - return getPatcher().isEnabled(getPatchElement()); - } - - public void setEnabled(boolean enabled) { - getPatcher().setEnabled(getPatchElement(), enabled); - } - - protected final Patcher getPatcher() { - return Patcher.getPatcher(getConfiguration()); - } - - public Object getPatchElement() { - return fElement; - } - - protected abstract PatchConfiguration getConfiguration(); - - public boolean equals(Object other) { - if (other instanceof PatchDiffNode) { - PatchDiffNode node = (PatchDiffNode) other; - return (node.getPatchElement().equals(getPatchElement())); - } - return super.equals(other); - } - - public int hashCode() { - return getPatchElement().hashCode(); - } - - public IResource getResource() { - return null; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchErrorDialog.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchErrorDialog.java deleted file mode 100644 index e0a60b348..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchErrorDialog.java +++ /dev/null @@ -1,19 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.patch; - -public class PatchErrorDialog { - - private PatchErrorDialog() { - // no instance. - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchFileDiffNode.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchFileDiffNode.java deleted file mode 100644 index 949b1cd02..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchFileDiffNode.java +++ /dev/null @@ -1,125 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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.patch; - -import org.eclipse.compare.IContentChangeListener; -import org.eclipse.compare.IContentChangeNotifier; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.internal.core.patch.FileDiffResult; -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.compare.structuremergeviewer.DiffNode; -import org.eclipse.compare.structuremergeviewer.Differencer; -import org.eclipse.compare.structuremergeviewer.IDiffContainer; -import org.eclipse.compare.structuremergeviewer.IDiffElement; -import org.eclipse.core.resources.IResource; - -public class PatchFileDiffNode extends PatchDiffNode implements IContentChangeListener { - - private final FileDiffResult result; - - public static PatchFileDiffNode createDiffNode(DiffNode parent, FileDiffResult result) { - return new PatchFileDiffNode(result, parent, getKind(result), getAncestorElement(result), getLeftElement(result), getRightElement(result)); - } - - public static int getKind(FileDiffResult result) { - if (!result.hasMatches()) - return Differencer.NO_CHANGE; - int fileDiffKind = result.getDiff().getDiffType(result.getConfiguration().isReversed()); - int kind = convertFileDiffTypeToDifferencerType(fileDiffKind); - return kind | Differencer.RIGHT; - } - - private static int convertFileDiffTypeToDifferencerType(int fileDiffKind) { - int kind; - switch (fileDiffKind) { - case FilePatch2.ADDITION: - kind = Differencer.ADDITION; - break; - case FilePatch2.DELETION: - kind = Differencer.DELETION; - break; - case FilePatch2.CHANGE: - kind = Differencer.CHANGE; - break; - default: - kind = Differencer.CHANGE; - break; - } - return kind; - } - - public static ITypedElement getRightElement(FileDiffResult result) { - return new PatchFileTypedElement(result, true); - } - - private static ITypedElement getLeftElement(FileDiffResult result) { - return new PatchFileTypedElement(result, false); - } - - public static ITypedElement getAncestorElement(FileDiffResult result) { - return new PatchFileTypedElement(result, false); - } - - public PatchFileDiffNode(FileDiffResult result, IDiffContainer parent, int kind, - ITypedElement ancestor, ITypedElement left, ITypedElement right) { - super(result.getDiff(), parent, kind, ancestor, left, right); - this.result = result; - } - - public FileDiffResult getDiffResult() { - return result; - } - - protected PatchConfiguration getConfiguration() { - return result.getConfiguration(); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.structuremergeviewer.DiffContainer#add(org.eclipse.compare.structuremergeviewer.IDiffElement) - */ - public void add(IDiffElement diff) { - super.add(diff); - // Listen for content changes in unmatched children so we can fire an input change - if (diff instanceof HunkDiffNode) { - HunkDiffNode node = (HunkDiffNode) diff; - Object left = node.getLeft(); - if (left instanceof IContentChangeNotifier) { - IContentChangeNotifier notifier = (IContentChangeNotifier) left; - notifier.addContentChangeListener(this); - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IContentChangeListener#contentChanged(org.eclipse.compare.IContentChangeNotifier) - */ - public void contentChanged(IContentChangeNotifier source) { - fireChange(); - } - - public int getKind() { - int kind = super.getKind(); - if (kind == Differencer.NO_CHANGE && getPatcher().hasCachedContents(getDiffResult().getDiff())) { - return Differencer.CHANGE | Differencer.RIGHT; - } - return kind; - } - - public boolean fileExists() { - IResource file = getResource(); - return file != null && file.isAccessible(); - } - - public IResource getResource() { - return ((WorkspaceFileDiffResult)getDiffResult()).getTargetFile(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchFileTypedElement.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchFileTypedElement.java deleted file mode 100644 index 86c5fff2d..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchFileTypedElement.java +++ /dev/null @@ -1,128 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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.patch; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.util.List; - -import org.eclipse.compare.CompareUI; -import org.eclipse.compare.IEncodedStreamContentAccessor; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.core.patch.DiffProject; -import org.eclipse.compare.internal.core.patch.FileDiffResult; -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.jface.resource.LocalResourceManager; -import org.eclipse.swt.graphics.Image; - -public class PatchFileTypedElement implements ITypedElement, - IEncodedStreamContentAccessor { - - private final FileDiffResult result; - private final boolean isAfterState; - - public PatchFileTypedElement(FileDiffResult result, boolean isAfterState) { - this.result = result; - this.isAfterState = isAfterState; - } - - public Image getImage() { - IFile file = getPatcher().getTargetFile(result.getDiff()); - if (file == null) { - // We don't get a target file if the file doesn't exist - DiffProject project = result.getDiff().getProject(); - if (project != null) { - file = Utilities.getProject(project).getFile( - result.getDiff().getPath( - result.getConfiguration().isReversed())); - } else { - IResource target = getPatcher().getTarget(); - if (target instanceof IFile) { - file = (IFile) target; - } else if (target instanceof IContainer) { - IContainer container = (IContainer) target; - file = container.getFile(result.getTargetPath()); - } - } - } - Image image = null; - if (file != null) { - image = CompareUI.getImage(file); - } - if (result.containsProblems()) { - LocalResourceManager imageCache = PatchCompareEditorInput - .getImageCache(result.getConfiguration()); - image = HunkTypedElement.getHunkErrorImage(image, imageCache, true); - } - return image; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.compare.ITypedElement#getName() - */ - public String getName() { - return result.getTargetPath().toString(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.compare.ITypedElement#getType() - */ - public String getType() { - return result.getTargetPath().getFileExtension(); - } - - public String getCharset() throws CoreException { - return result.getCharset(); - } - - public InputStream getContents() throws CoreException { - // If there are cached contents, use them - if (isAfterState && getPatcher().hasCachedContents(result.getDiff())) - return new ByteArrayInputStream(getPatcher().getCachedContents( - result.getDiff())); - // Otherwise, get the lines from the diff result - List lines; - if (isAfterState) { - lines = result.getAfterLines(); - } else { - lines = result.getBeforeLines(); - } - String contents = LineReader.createString(getPatcher() - .isPreserveLineDelimeters(), lines); - String charSet = getCharset(); - byte[] bytes = null; - if (charSet != null) { - try { - bytes = contents.getBytes(charSet); - } catch (UnsupportedEncodingException e) { - CompareUIPlugin.log(e); - } - } - if (bytes == null) { - bytes = contents.getBytes(); - } - return new ByteArrayInputStream(bytes); - } - - private Patcher getPatcher() { - return Patcher.getPatcher(result.getConfiguration()); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java deleted file mode 100644 index 6fde7b42a..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java +++ /dev/null @@ -1,111 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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.internal.patch; - -import org.eclipse.osgi.util.NLS; - -public final class PatchMessages extends NLS { - - private static final String BUNDLE_NAME = "org.eclipse.compare.internal.patch.PatchMessages";//$NON-NLS-1$ - - private PatchMessages() { - // Do not instantiate - } - - public static String HunkMergePage_GenerateRejectFile; - public static String HunkMergePage_Merged; - public static String InputPatchPage_MalformedURL; - public static String InputPatchPage_NoURL; - public static String InputPatchPage_URLButton_text; - public static String InputPatchPage_URL_title; - public static String PatchCompareEditorInput_0; - public static String PatcherCompareEditorInput_0; - public static String PatcherCompareEditorInput_AfterPatch; - public static String PatcherCompareEditorInput_LocalCopy; - public static String PatcherCompareEditorInput_NotIncluded; - public static String PatcherCompareEditorInput_PatchContents; - public static String PatchTargetPage_0; - public static String PatchWizard_0; - public static String PatchWizard_1; - public static String PatchWizard_title; - public static String PatchWizard_unexpectedException_message; - public static String InputPatchPage_title; - public static String InputPatchPage_message; - public static String InputPatchPage_Clipboard; - public static String InputPatchPage_SelectInput; - public static String InputPatchPage_PatchErrorDialog_title; - public static String InputPatchPage_FileButton_text; - public static String InputPatchPage_ChooseFileButton_text; - public static String InputPatchPage_UseClipboardButton_text; - public static String InputPatchPage_UseWorkspaceButton_text; - public static String InputPatchPage_WorkspaceSelectPatch_text; - public static String InputPatchPage_NothingSelected_message; - public static String InputPatchPage_ClipboardIsEmpty_message; - public static String InputPatchPage_NoTextInClipboard_message; - public static String InputPatchPage_CouldNotReadClipboard_message; - public static String InputPatchPage_CannotLocatePatch_message; - public static String InputPatchPage_NoFileName_message; - public static String InputPatchPage_FileSelectedNotPatch_message; - public static String InputPatchPage_SelectPatchFileDialog_title; - public static String InputPatchPage_PatchFileNotFound_message; - public static String InputPatchPage_ParseError_message; - public static String InputPatchPage_Clipboard_title; - public static String InputPatchPage_PatchFile_title; - public static String InputPatchPage_WorkspacePatch_title; - public static String InputPatchPage_NoDiffsFound_format; - public static String InputPatchPage_SingleFileError_format; - public static String InputPatchPage_URLConnecting; - public static String InputPatchPage_URLFetchingContent; - public static String PatchTargetPage_title; - public static String PatchTargetPage_message; - public static String PreviewPatchPage_title; - public static String PreviewPatchPage_PatchOptions_title; - public static String PreviewPatchPage_IgnoreSegments_text; - public static String PreviewPatchPage_ReversePatch_text; - public static String PreviewPatchPage_FuzzFactor_text; - public static String PreviewPatchPage_FuzzFactor_tooltip; - public static String PreviewPatchPage_GuessFuzz_text; - public static String PreviewPatchPage_FuzzUsed; - public static String PreviewPatchPage_AllContextIgnored; - - static { - NLS.initializeMessages(BUNDLE_NAME, PatchMessages.class); - } - - public static String Diff_2Args; - public static String PreviewPatchPage_RetargetPatch; - public static String PreviewPatchPage_SelectProject; - public static String PreviewPatchPage_Target; - public static String PreviewPatchLabelDecorator_ProjectDoesNotExist; - public static String PreviewPatchPage2_0; - public static String PreviewPatchPage2_1; - public static String PreviewPatchPage2_2; - public static String PreviewPatchPage2_3; - public static String PreviewPatchPage2_4; - public static String PreviewPatchPage2_5; - public static String PreviewPatchPage2_6; - public static String PreviewPatchPage2_7; - public static String PreviewPatchPage2_8; - public static String PreviewPatchPage2_9; - public static String PreviewPatchPage2_CalculateReverse; - public static String PreviewPatchPage2_IgnoreWhitespace; - public static String PreviewPatchPage2_IgnoreWSAction; - public static String PreviewPatchPage2_IgnoreWSTooltip; - public static String PreviewPatchPage2_OrphanedHunk; - public static String PreviewPatchPage2_MatchedHunk; - public static String PreviewPatchPage2_PatchedLocalFile; - public static String PreviewPatchPage2_RetargetAction; - public static String PreviewPatchPage2_RetargetTooltip; - public static String PreviewPatchPage2_ShowMatched; - public static String PreviewPatchPage2_AddedRemovedLines; - public static String RetargetPatchElementDialog_0; - public static String RetargetPatchElementDialog_1; -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties deleted file mode 100644 index 95ac4b8f2..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties +++ /dev/null @@ -1,117 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 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 -# Sebastian Davids <sdavids@gmx.de> - layout tweaks -############################################################################### - -# -# 'Compare with Patch' Action -# -PatcherCompareEditorInput_LocalCopy=Local Copy -PatcherCompareEditorInput_0=Discard Changes? -PatcherCompareEditorInput_AfterPatch=After Patch - -# -# PatchWizard -# -PatchWizard_title=Apply Patch -PatchWizard_0=Patch has rejects -PatchWizard_1=The patch you are applying has segments that did not match. Are you sure you want to apply it? -PatchWizard_unexpectedException_message= Unexpected exception while applying the patch. See log for a detailed error description. -PatcherCompareEditorInput_PatchContents=Patch Contents -PatcherCompareEditorInput_NotIncluded=(Not included) - -# -# InputPatchPage -# -InputPatchPage_title= Patch Input Specification -InputPatchPage_NoURL=Please enter an URL -InputPatchPage_message= Select the patch location. -InputPatchPage_Clipboard=Clipboard -InputPatchPage_SelectInput=Apply the patch to the &selected file, folder or project: -InputPatchPage_MalformedURL=Malformed URL -InputPatchPage_PatchErrorDialog_title=Patch Error -InputPatchPage_FileButton_text=Fil&e -InputPatchPage_URLButton_text=&URL -InputPatchPage_ChooseFileButton_text=&Browse... -InputPatchPage_UseClipboardButton_text=&Clipboard -InputPatchPage_UseWorkspaceButton_text=&Workspace -InputPatchPage_WorkspaceSelectPatch_text=&Select the location of the patch: -InputPatchPage_NothingSelected_message=Select a file or folder to be patched -InputPatchPage_ClipboardIsEmpty_message=Clipboard is empty -InputPatchPage_NoTextInClipboard_message=Clipboard does not contain text -InputPatchPage_CouldNotReadClipboard_message=Cannot retrieve clipboard contents -InputPatchPage_CannotLocatePatch_message=Cannot locate patch file: -InputPatchPage_NoFileName_message=No file name -InputPatchPage_FileSelectedNotPatch_message=Selected resource is not a valid patch -#SI - Select file name ? -InputPatchPage_SelectPatchFileDialog_title=Select Patch File -InputPatchPage_PatchFileNotFound_message=Patch file not found. -InputPatchPage_ParseError_message=Error while parsing patch -InputPatchPage_Clipboard_title=Clipboard -InputPatchPage_PatchFile_title=Patch file -InputPatchPage_URL_title=URL -InputPatchPage_WorkspacePatch_title=Workspace file -InputPatchPage_NoDiffsFound_format={0} does not contain valid patch. -InputPatchPage_SingleFileError_format={0} contains multiple patches. You cannot apply them to a single file. -InputPatchPage_URLConnecting=Opening connection to the URL -InputPatchPage_URLFetchingContent=Fetching content from the URL -# -# PatchTargetPage -# -PatchTargetPage_title=Target Resource -PatchTargetPage_0=Apply the patch to the &workspace root -PatchTargetPage_message=Select the target workspace resource for the patch. -PatchCompareEditorInput_0=(file does not exist) -# -# PreviewPatchPage -# -PreviewPatchPage_title=Review Patch -PreviewPatchPage2_0=&Exclude -PreviewPatchPage2_1=&Include -PreviewPatchPage2_2=Performing this operation will require that your manual changes be discarded. -PreviewPatchPage2_3=Reversing the patch will require that your manual changes be discarded. -PreviewPatchPage2_4=Performing this operation will require that your manual changes be discarded. -PreviewPatchPage2_5=Changing the fuzz factor will require that your manual changes be discarded. -PreviewPatchPage2_6=Changing the fuzz factor will require that your manual changes be discarded. -PreviewPatchPage2_7=&Show Excluded -PreviewPatchPage2_8=Review the patch with respect to the local file system and manually merge any unmatched portions. -PreviewPatchPage2_9=Double-click on file or patch segment entries to view their content: -PreviewPatchPage_Target=(target: {0}) -PreviewPatchPage_PatchOptions_title=Patch options -PreviewPatchPage_IgnoreSegments_text=&Ignore leading path name segments: -PreviewPatchPage_ReversePatch_text=&Reverse patch -PreviewPatchPage_FuzzFactor_text=Fu&zz factor: -PreviewPatchPage2_RetargetAction=&Move -PreviewPatchPage2_RetargetTooltip=Move the selected patch element to another resource -PreviewPatchPage2_OrphanedHunk=Unmatched Patch Segment -PreviewPatchPage2_MatchedHunk=Matched Hunk -PreviewPatchPage2_IgnoreWSAction=Ignore whitespace -PreviewPatchPage_FuzzFactor_tooltip=Allow this number of context lines to be ignored -PreviewPatchPage2_IgnoreWSTooltip=Ignore whitespace -PreviewPatchPage2_IgnoreWhitespace=Ignore whitespace -PreviewPatchPage2_PatchedLocalFile=Patched Local File -PreviewPatchPage2_CalculateReverse=Calculating reverse -PreviewPatchPage_RetargetPatch=Retarget Patch -PreviewPatchPage_SelectProject=Select the new target project for the portion of the patch targeted to project ''{0}'': -PreviewPatchPage_GuessFuzz_text= &Guess -PreviewPatchPage_FuzzUsed=(fuzz factor used: {0}) -PreviewPatchPage_AllContextIgnored=(fuzz factor used: {0}, all context lines ignored) -PreviewPatchPage2_ShowMatched=Show &matched hunks -PreviewPatchPage2_AddedRemovedLines=Patch contains {0} added and {1} removed lines. -PreviewPatchLabelDecorator_ProjectDoesNotExist=(Project does not exist in workspace) - -# -# Patcher -# -Diff_2Args={0} {1} -HunkMergePage_Merged=(merged) -HunkMergePage_GenerateRejectFile=G&enerate a .rej file for unmerged hunks -RetargetPatchElementDialog_0=Select the new target file for the portion of the patch targeted to file ''{0}'' -RetargetPatchElementDialog_1=Select the new target file for this portion of the patch targeted to file ''{0}'' diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchProjectDiffNode.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchProjectDiffNode.java deleted file mode 100644 index 1aa09b3d5..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchProjectDiffNode.java +++ /dev/null @@ -1,87 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 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.patch; - -import org.eclipse.compare.CompareUI; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.internal.core.patch.DiffProject; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.compare.structuremergeviewer.Differencer; -import org.eclipse.compare.structuremergeviewer.IDiffContainer; -import org.eclipse.compare.structuremergeviewer.IDiffElement; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.jface.resource.LocalResourceManager; -import org.eclipse.swt.graphics.Image; - -public class PatchProjectDiffNode extends PatchDiffNode { - - private final DiffProject project; - private final PatchConfiguration configuration; - - public PatchProjectDiffNode(IDiffContainer parent, DiffProject project, PatchConfiguration configuration) { - super(project, parent, Differencer.NO_CHANGE); - this.project = project; - this.configuration = configuration; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.structuremergeviewer.DiffNode#getName() - */ - public String getName() { - return project.getName(); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.structuremergeviewer.DiffNode#getImage() - */ - public Image getImage() { - Image image = CompareUI.getImage(Utilities.getProject(project)); - if (containsProblems()) { - LocalResourceManager imageCache = PatchCompareEditorInput.getImageCache(getConfiguration()); - image = HunkTypedElement.getHunkErrorImage(image, imageCache, true); - } - return image; - } - - private boolean containsProblems() { - IDiffElement[] elements = getChildren(); - for (int i = 0; i < elements.length; i++) { - IDiffElement diffElement = elements[i]; - if (diffElement instanceof PatchFileDiffNode) { - PatchFileDiffNode node = (PatchFileDiffNode) diffElement; - if (node.getDiffResult().containsProblems()) - return true; - } - } - return false; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.structuremergeviewer.DiffNode#getType() - */ - public String getType() { - return ITypedElement.FOLDER_TYPE; - } - - protected PatchConfiguration getConfiguration() { - return configuration; - } - - public DiffProject getDiffProject() { - return project; - } - - public IResource getResource() { - return ResourcesPlugin.getWorkspace().getRoot().getProject(getDiffProject().getName()); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchTargetPage.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchTargetPage.java deleted file mode 100644 index 0f7317461..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchTargetPage.java +++ /dev/null @@ -1,231 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 2010 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.patch; - -import com.ibm.icu.text.MessageFormat; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Text; -import org.eclipse.swt.widgets.Tree; - -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IWorkspaceRoot; -import org.eclipse.core.resources.ResourcesPlugin; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.wizard.IWizardPage; -import org.eclipse.jface.wizard.WizardPage; - -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.model.WorkbenchContentProvider; -import org.eclipse.ui.model.WorkbenchLabelProvider; -import org.eclipse.ui.views.navigator.ResourceComparator; - -import org.eclipse.compare.internal.ICompareContextIds; -import org.eclipse.compare.internal.Utilities; - -/*** - * This page only shows up if the user is trying to apply - * a non-workspace rooted patch. - */ -public class PatchTargetPage extends WizardPage { - - private boolean fShowError = false; - - // SWT widgets - private TreeViewer fPatchTargets; - private Button useWorkspaceAsTarget; - private Button selectTarget; - - protected WorkspacePatcher fPatcher; - - protected final static String PATCHTARGETPAGE_NAME = "PatchTargetPage"; //$NON-NLS-1$ - - public PatchTargetPage(WorkspacePatcher patcher) { - super(PATCHTARGETPAGE_NAME, PatchMessages.PatchTargetPage_title, null); - setMessage(PatchMessages.PatchTargetPage_message); - fPatcher = patcher; - } - - /* - * Get a path from the supplied text widget. - * @return org.eclipse.core.runtime.IPath - */ - protected IPath getPathFromText(Text textField) { - return (new Path(textField.getText())).makeAbsolute(); - } - - public void createControl(Composite parent) { - - Composite composite = new Composite(parent, SWT.NULL); - composite.setLayout(new GridLayout()); - composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); - setControl(composite); - - useWorkspaceAsTarget = createRadioButton(composite, PatchMessages.PatchTargetPage_0, 1); - selectTarget = createRadioButton(composite, PatchMessages.InputPatchPage_SelectInput, 1); - - buildInputGroup(composite); - - updateWidgetEnablements(); - - Dialog.applyDialogFont(composite); - PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ICompareContextIds.PATCH_INPUT_WIZARD_PAGE); - - useWorkspaceAsTarget.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - fShowError = true; - if (useWorkspaceAsTarget.getSelection()) { - fPatchTargets.getTree().setEnabled(false); - fPatcher.setTarget(ResourcesPlugin.getWorkspace().getRoot()); - } else { - fPatchTargets.getTree().setEnabled(true); - fPatcher.setTarget(Utilities.getFirstResource(fPatchTargets.getSelection())); - } - updateWidgetEnablements(); - } - }); - } - - private Button createRadioButton(Composite parent, String label, int span) { - Button button = new Button(parent, SWT.RADIO); - button.setText(label); - GridData data = new GridData(); - data.horizontalSpan = span; - button.setLayoutData(data); - return button; - } - - /* (non-JavaDoc) - * Method declared in IWizardPage. - */ - public IWizardPage getNextPage() { - - // if selected target is file ensure that patch file - // contains only a patch for a single file - if (!fPatcher.isWorkspacePatch() && fPatcher.getTarget() instanceof IFile && fPatcher.getDiffs().length > 1) { - InputPatchPage inputPage = (InputPatchPage) getWizard().getPage(InputPatchPage.INPUTPATCHPAGE_NAME); - String source = ""; //$NON-NLS-1$ - switch (inputPage.getInputMethod()) { - case InputPatchPage.CLIPBOARD : - source = PatchMessages.InputPatchPage_Clipboard_title; - break; - - case InputPatchPage.FILE : - source = PatchMessages.InputPatchPage_PatchFile_title; - break; - - case InputPatchPage.WORKSPACE : - source = PatchMessages.InputPatchPage_WorkspacePatch_title; - break; - } - String format = PatchMessages.InputPatchPage_SingleFileError_format; - String message = MessageFormat.format(format, new String[] {source}); - MessageDialog.openInformation(null, PatchMessages.InputPatchPage_PatchErrorDialog_title, message); - return this; - } - - return super.getNextPage(); - } - - /* (non-JavaDoc) - * Method declared in IWizardPage. - */ - public boolean canFlipToNextPage() { - // we can't call getNextPage to determine if flipping is allowed since computing - // the next page is quite expensive. So we say yes if the page is complete. - return isPageComplete(); - } - - private void buildInputGroup(Composite parent) { - Tree tree = new Tree(parent, SWT.BORDER); - GridData gd = new GridData(GridData.FILL_BOTH); - gd.heightHint = 200; - tree.setLayoutData(gd); - - fPatchTargets = new TreeViewer(tree); - fPatchTargets.setLabelProvider(new WorkbenchLabelProvider()); - fPatchTargets.setContentProvider(new WorkbenchContentProvider()); - fPatchTargets.setComparator(new ResourceComparator(ResourceComparator.NAME)); - fPatchTargets.setInput(ResourcesPlugin.getWorkspace().getRoot()); - - IResource target = fPatcher.getTarget(); - if (target != null && !(target instanceof IWorkspaceRoot)) { - fPatchTargets.expandToLevel(target, 0); - fPatchTargets.setSelection(new StructuredSelection(target)); - } - - // register listeners - fPatchTargets.addSelectionChangedListener(new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent event) { - fShowError = true; - fPatcher.setTarget(Utilities.getFirstResource(event.getSelection())); - updateWidgetEnablements(); - } - }); - - fPatchTargets.addDoubleClickListener(new IDoubleClickListener() { - public void doubleClick(DoubleClickEvent event) { - ((PatchWizard)getWizard()).showPage(getNextPage()); - } - }); - } - - /** - * Updates the enable state of this page's controls. - */ - private void updateWidgetEnablements() { - String error = null; - - if (fPatcher.getTarget() == null) { - useWorkspaceAsTarget.setSelection(false); - selectTarget.setSelection(true); - error = PatchMessages.InputPatchPage_NothingSelected_message; - setPageComplete(false); - if (fShowError) - setErrorMessage(error); - return; - } - setErrorMessage(null); - useWorkspaceAsTarget.setSelection(fPatcher.getTarget() instanceof IWorkspaceRoot); - selectTarget.setSelection(!useWorkspaceAsTarget.getSelection()); - setPageComplete(true); - } - - /** - * The Finish button was pressed. Try to do the required work now and answer - * a boolean indicating success. If false is returned then the wizard will - * not close. - * - * @return boolean - */ - public boolean finish() { - return true; - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizard.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizard.java deleted file mode 100644 index ede6e0649..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizard.java +++ /dev/null @@ -1,236 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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.patch; - -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.ExceptionHandler; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IStorage; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.jobs.ISchedulingRule; -import org.eclipse.core.runtime.jobs.MultiRule; -import org.eclipse.jface.dialogs.ErrorDialog; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.wizard.IWizardPage; -import org.eclipse.jface.wizard.Wizard; -import org.eclipse.ui.actions.WorkspaceModifyOperation; - -public class PatchWizard extends Wizard { - - // dialog store id constants - private final static String DIALOG_SETTINGS_KEY= "PatchWizard"; //$NON-NLS-1$ - - private boolean fHasNewDialogSettings; - - protected InputPatchPage fPatchWizardPage; - protected PatchTargetPage fPatchTargetPage; - protected PreviewPatchPage2 fPreviewPage2; - - private final WorkspacePatcher fPatcher; - - private CompareConfiguration fConfiguration; - private IStorage patch; - - private boolean patchReadIn = false; - - public PatchWizard(IStorage patch, IResource target, CompareConfiguration configuration) { - Assert.isNotNull(configuration); - this.fConfiguration = configuration; - setDefaultPageImageDescriptor(CompareUIPlugin.getImageDescriptor("wizban/applypatch_wizban.png")); //$NON-NLS-1$ - setWindowTitle(PatchMessages.PatchWizard_title); - initializeDialogSettings(); - fPatcher= new WorkspacePatcher(target); - if (patch != null) { - try { - fPatcher.parse(patch); - this.patch = patch; - patchReadIn = true; - } catch (IOException e) { - MessageDialog.openError(null, - PatchMessages.InputPatchPage_PatchErrorDialog_title, - PatchMessages.InputPatchPage_ParseError_message); - } catch (CoreException e) { - ErrorDialog.openError(getShell(), - PatchMessages.InputPatchPage_PatchErrorDialog_title, - PatchMessages.InputPatchPage_PatchFileNotFound_message, e.getStatus()); - } - } - } - - private void initializeDialogSettings() { - IDialogSettings workbenchSettings= CompareUIPlugin.getDefault().getDialogSettings(); - IDialogSettings section= workbenchSettings.getSection(DIALOG_SETTINGS_KEY); - if (section == null) { - fHasNewDialogSettings= true; - } else { - fHasNewDialogSettings= false; - setDialogSettings(section); - } - } - - protected WorkspacePatcher getPatcher() { - return fPatcher; - } - - protected IStorage getPatch() { - return patch; - } - - IResource getTarget() { - return fPatcher.getTarget(); - } - - /* (non-Javadoc) - * Method declared on IWizard. - */ - public void addPages() { - if (patch == null) - addPage(fPatchWizardPage = new InputPatchPage(this)); - if (patch == null || !fPatcher.isWorkspacePatch()) - addPage(fPatchTargetPage = new PatchTargetPage(fPatcher)); - fPreviewPage2 = new PreviewPatchPage2(fPatcher, fConfiguration); - addPage(fPreviewPage2); - } - - /* (non-Javadoc) - * Method declared on IWizard. - */ - public boolean performFinish() { - - IWizardPage currentPage = getContainer().getCurrentPage(); - if (currentPage.getName().equals(PreviewPatchPage2.PREVIEWPATCHPAGE_NAME)){ - PreviewPatchPage2 previewPage = (PreviewPatchPage2) currentPage; - previewPage.ensureContentsSaved(); - } - - if (fPatchWizardPage != null){ - // make sure that the patch has been read - if (!fPatchWizardPage.isPatchRead()) - fPatchWizardPage.readInPatch(); - fPatcher.refresh(); - } else { - //either we have a patch from the patch input page or one has - //been specified; double check this - Assert.isNotNull(patch); - //make sure that the patch has been read in - Assert.isTrue(patchReadIn); - } - - if (!currentPage.getName().equals(PreviewPatchPage2.PREVIEWPATCHPAGE_NAME) && fPatcher.hasRejects()){ - if (!MessageDialog.openConfirm(getShell(), PatchMessages.PatchWizard_0, PatchMessages.PatchWizard_1)) { - return false; - } - } - - try { - // create scheduling rule based on the type of patch - single or workspace - ISchedulingRule scheduleRule = null; - if (fPatcher.isWorkspacePatch()) { - // workspace patch - ISchedulingRule[] projectRules = fPatcher.getTargetProjects(); - scheduleRule = new MultiRule(projectRules); - } else { - // single patch - IResource resource = getTarget(); - if (resource.getType() == IResource.FILE) { - // For a file, use the modify rule for the parent since we may need to include a reject file - resource = resource.getParent(); - } - scheduleRule = ResourcesPlugin.getWorkspace().getRuleFactory().modifyRule(resource); - } - - WorkspaceModifyOperation op = new WorkspaceModifyOperation(scheduleRule) { - protected void execute(IProgressMonitor monitor) throws InvocationTargetException { - try { - fPatcher.applyAll(monitor, new Patcher.IFileValidator() { - public boolean validateResources(IFile[] resoures) { - return Utilities.validateResources(resoures, getShell(), PatchMessages.PatchWizard_title); - } - }); - } catch (CoreException e) { - throw new InvocationTargetException(e); - } - } - }; - getContainer().run(true, false, op); - - } catch (InvocationTargetException e) { - ExceptionHandler.handle(e, PatchMessages.PatchWizard_title, PatchMessages.PatchWizard_unexpectedException_message); - } catch (InterruptedException e) { - // cannot happen - // NeedWork: use assert! - } - - // Save the dialog settings - if (fHasNewDialogSettings) { - IDialogSettings workbenchSettings = CompareUIPlugin.getDefault().getDialogSettings(); - IDialogSettings section = workbenchSettings.getSection(DIALOG_SETTINGS_KEY); - section = workbenchSettings.addNewSection(DIALOG_SETTINGS_KEY); - setDialogSettings(section); - } - - if (fPatchWizardPage != null) - fPatchWizardPage.saveWidgetValues(); - fPreviewPage2.saveWidgetValues(); - return true; - } - - public void showPage(IWizardPage page) { - getContainer().showPage(page); - } - - public IWizardPage getNextPage(IWizardPage page) { - //no patch has been read in yet, input patch page - if (!patchReadIn) - return fPatchWizardPage; - - //Check to see if we're already on the patch target page and if - //a target has been set - if it has return the next page in sequence (the preview patch page) - if (page instanceof PatchTargetPage && getTarget() != null) { - return super.getNextPage(page); - } else if (page instanceof InputPatchPage && !fPatcher.isWorkspacePatch()) { - //Check to see if we need a target - return fPatchTargetPage; - } - return super.getNextPage(page); - } - - /** - * Used to report that the patch has - * - */ - protected void patchReadIn() { - patchReadIn = true; - } - - public CompareConfiguration getCompareConfiguration() { - return fConfiguration; - } - - public boolean canFinish() { - IWizardPage currentPage = getContainer().getCurrentPage(); - if (currentPage.getName().equals(PreviewPatchPage2.PREVIEWPATCHPAGE_NAME)){ - return currentPage.isPageComplete(); - } - return super.canFinish(); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizardDialog.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizardDialog.java deleted file mode 100644 index bd61ac389..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizardDialog.java +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 2006 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.patch; - -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.wizard.IWizard; -import org.eclipse.jface.wizard.WizardDialog; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Shell; - -public class PatchWizardDialog extends WizardDialog { - private static final String PATCH_WIZARD_SETTINGS_SECTION = "PatchWizard"; //$NON-NLS-1$ - - public PatchWizardDialog(Shell parent, IWizard wizard) { - super(parent, wizard); - - setShellStyle(getShellStyle() | SWT.RESIZE); - setMinimumPageSize(700, 500); - } - - protected IDialogSettings getDialogBoundsSettings() { - IDialogSettings settings = CompareUIPlugin.getDefault().getDialogSettings(); - IDialogSettings section = settings.getSection(PATCH_WIZARD_SETTINGS_SECTION); - if (section == null) { - section = settings.addNewSection(PATCH_WIZARD_SETTINGS_SECTION); - } - return section; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Patcher.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Patcher.java deleted file mode 100644 index a059819db..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Patcher.java +++ /dev/null @@ -1,763 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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 - * Martin Burger <m@rtin-burger.de> patch for #93810 and #93901 - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.eclipse.compare.internal.core.Messages; -import org.eclipse.compare.internal.core.patch.DiffProject; -import org.eclipse.compare.internal.core.patch.FileDiffResult; -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.compare.internal.core.patch.Hunk; -import org.eclipse.compare.internal.core.patch.PatchReader; -import org.eclipse.compare.patch.IHunk; -import org.eclipse.compare.patch.IHunkFilter; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IFolder; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IStorage; -import org.eclipse.core.resources.IWorkspaceRoot; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.SubProgressMonitor; - -/** - * A Patcher - * - knows how to parse various patch file formats into some in-memory structure, - * - holds onto the parsed data and the options to use when applying the patches, - * - knows how to apply the patches to files and folders. - */ -public class Patcher implements IHunkFilter { - - static protected final String REJECT_FILE_EXTENSION= ".rej"; //$NON-NLS-1$ - - static protected final String MARKER_TYPE= "org.eclipse.compare.rejectedPatchMarker"; //$NON-NLS-1$ - - /** - * Property used to associate a patcher with a {@link PatchConfiguration} - */ - public static final String PROP_PATCHER = "org.eclipse.compare.patcher"; //$NON-NLS-1$ - - public interface IFileValidator { - boolean validateResources(IFile[] array); - } - - // diff formats - // private static final int CONTEXT= 0; - // private static final int ED= 1; - // private static final int NORMAL= 2; - // private static final int UNIFIED= 3; - - private FilePatch2[] fDiffs; - private IResource fTarget; - // patch options - private Set disabledElements = new HashSet(); - private Map diffResults = new HashMap(); - private final Map contentCache = new HashMap(); - private Set mergedHunks = new HashSet(); - - private final PatchConfiguration configuration; - private boolean fGenerateRejectFile = false; - - public Patcher() { - configuration = new PatchConfiguration(); - configuration.setProperty(PROP_PATCHER, this); - configuration.addHunkFilter(this); - } - - /* - * Returns an array of Diffs after a sucessfull call to <code>parse</code>. - * If <code>parse</code> hasn't been called returns <code>null</code>. - */ - public FilePatch2[] getDiffs() { - if (fDiffs == null) - return new FilePatch2[0]; - return fDiffs; - } - - public IPath getPath(FilePatch2 diff) { - return diff.getStrippedPath(getStripPrefixSegments(), isReversed()); - } - - /* - * Returns <code>true</code> if new value differs from old. - */ - public boolean setStripPrefixSegments(int strip) { - if (strip != getConfiguration().getPrefixSegmentStripCount()) { - getConfiguration().setPrefixSegmentStripCount(strip); - return true; - } - return false; - } - - int getStripPrefixSegments() { - return getConfiguration().getPrefixSegmentStripCount(); - } - - /* - * Returns <code>true</code> if new value differs from old. - */ - public boolean setFuzz(int fuzz) { - if (fuzz != getConfiguration().getFuzz()) { - getConfiguration().setFuzz(fuzz); - return true; - } - return false; - } - - public int getFuzz(){ - return getConfiguration().getFuzz(); - } - - /* - * Returns <code>true</code> if new value differs from old. - */ - public boolean setIgnoreWhitespace(boolean ignoreWhitespace) { - if (ignoreWhitespace != getConfiguration().isIgnoreWhitespace()) { - getConfiguration().setIgnoreWhitespace(ignoreWhitespace); - return true; - } - return false; - } - - public boolean isIgnoreWhitespace() { - return getConfiguration().isIgnoreWhitespace(); - } - - public boolean isGenerateRejectFile() { - return fGenerateRejectFile; - } - - public void setGenerateRejectFile(boolean generateRejectFile) { - fGenerateRejectFile = generateRejectFile; - } - - //---- parsing patch files - - public void parse(IStorage storage) throws IOException, CoreException { - BufferedReader reader = Utilities.createReader(storage); - try { - parse(reader); - } finally { - try { - reader.close(); - } catch (IOException e) { //ignored - } - } - } - - public void parse(BufferedReader reader) throws IOException { - PatchReader patchReader = new PatchReader() { - protected FilePatch2 createFileDiff(IPath oldPath, long oldDate, - IPath newPath, long newDate) { - return new FilePatch(oldPath, oldDate, newPath, newDate); - } - }; - patchReader.parse(reader); - patchParsed(patchReader); - } - - protected void patchParsed(PatchReader patchReader) { - fDiffs = patchReader.getDiffs(); - } - - public void countLines() { - FilePatch2[] fileDiffs = getDiffs(); - for (int i = 0; i < fileDiffs.length; i++) { - int addedLines = 0; - int removedLines = 0; - FilePatch2 fileDiff = fileDiffs[i]; - for (int j = 0; j < fileDiff.getHunkCount(); j++) { - IHunk hunk = fileDiff.getHunks()[j]; - String[] lines = ((Hunk) hunk).getLines(); - for (int k = 0; k < lines.length; k++) { - char c = lines[k].charAt(0); - switch (c) { - case '+': - addedLines++; - continue; - case '-': - removedLines++; - continue; - } - } - } - fileDiff.setAddedLines(addedLines); - fileDiff.setRemovedLines(removedLines); - } - } - - //---- applying a patch file - - public void applyAll(IProgressMonitor pm, IFileValidator validator) throws CoreException { - - int i; - - IFile singleFile= null; // file to be patched - IContainer container= null; - if (fTarget instanceof IContainer) - container= (IContainer) fTarget; - else if (fTarget instanceof IFile) { - singleFile= (IFile) fTarget; - container= singleFile.getParent(); - } else { - Assert.isTrue(false); - } - - // get all files to be modified in order to call validateEdit - List list= new ArrayList(); - if (singleFile != null) - list.add(singleFile); - else { - for (i= 0; i < fDiffs.length; i++) { - FilePatch2 diff= fDiffs[i]; - if (isEnabled(diff)) { - switch (diff.getDiffType(isReversed())) { - case FilePatch2.CHANGE: - list.add(createPath(container, getPath(diff))); - break; - } - } - } - } - if (! validator.validateResources((IFile[])list.toArray(new IFile[list.size()]))) { - return; - } - - final int WORK_UNIT= 10; - if (pm != null) { - String message= Messages.Patcher_0; - pm.beginTask(message, fDiffs.length*WORK_UNIT); - } - - for (i= 0; i < fDiffs.length; i++) { - - int workTicks= WORK_UNIT; - - FilePatch2 diff= fDiffs[i]; - if (isEnabled(diff)) { - - IPath path= getPath(diff); - if (pm != null) - pm.subTask(path.toString()); - - IFile file= singleFile != null - ? singleFile - : createPath(container, path); - - List failed= new ArrayList(); - - int type= diff.getDiffType(isReversed()); - switch (type) { - case FilePatch2.ADDITION: - // patch it and collect rejected hunks - List result= apply(diff, file, true, failed); - if (result != null) - store(LineReader.createString(isPreserveLineDelimeters(), result), file, new SubProgressMonitor(pm, workTicks)); - workTicks-= WORK_UNIT; - break; - case FilePatch2.DELETION: - file.delete(true, true, new SubProgressMonitor(pm, workTicks)); - workTicks-= WORK_UNIT; - break; - case FilePatch2.CHANGE: - // patch it and collect rejected hunks - result= apply(diff, file, false, failed); - if (result != null) - store(LineReader.createString(isPreserveLineDelimeters(), result), file, new SubProgressMonitor(pm, workTicks)); - workTicks-= WORK_UNIT; - break; - } - - if (isGenerateRejectFile() && failed.size() > 0) { - IPath pp = getRejectFilePath(path); - file= createPath(container, pp); - if (file != null) { - store(getRejected(failed), file, pm); - try { - IMarker marker= file.createMarker(MARKER_TYPE); - marker.setAttribute(IMarker.MESSAGE, Messages.Patcher_1); - marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH); - } catch (CoreException ex) { - // NeedWork - } - } - } - } - - if (pm != null) { - if (pm.isCanceled()) - break; - if (workTicks > 0) - pm.worked(workTicks); - } - } - } - - private IPath getRejectFilePath(IPath path) { - IPath pp= null; - if (path.segmentCount() > 1) { - pp= path.removeLastSegments(1); - pp= pp.append(path.lastSegment() + REJECT_FILE_EXTENSION); - } else - pp= new Path(path.lastSegment() + REJECT_FILE_EXTENSION); - return pp; - } - - List apply(FilePatch2 diff, IFile file, boolean create, List failedHunks) { - FileDiffResult result = getDiffResult(diff); - List lines = LineReader.load(file, create); - result.patch(lines, null); - failedHunks.addAll(result.getFailedHunks()); - if (hasCachedContents(diff)) { - // Used the cached contents since they would have been provided by the user - return getCachedLines(diff); - } else if (!result.hasMatches()) { - // Return null if there were no matches - return null; - } - return result.getLines(); - } - - /* - * Converts the string into bytes and stores them in the given file. - */ - protected void store(String contents, IFile file, IProgressMonitor pm) throws CoreException { - - byte[] bytes; - try { - bytes= contents.getBytes(Utilities.getCharset(file)); - } catch (UnsupportedEncodingException x) { - // uses default encoding - bytes= contents.getBytes(); - } - - store(bytes,file, pm); - } - - protected void store(byte[] bytes, IFile file, IProgressMonitor pm) throws CoreException { - InputStream is= new ByteArrayInputStream(bytes); - try { - if (file.exists()) { - file.setContents(is, false, true, pm); - } else { - file.create(is, false, pm); - } - } finally { - if (is != null) - try { - is.close(); - } catch(IOException ex) { - // silently ignored - } - } - } - - public boolean isPreserveLineDelimeters() { - return true; - } - - public static String getRejected(List failedHunks) { - if (failedHunks.size() <= 0) - return null; - - String lineSeparator= System.getProperty("line.separator"); //$NON-NLS-1$ - StringBuffer sb= new StringBuffer(); - Iterator iter= failedHunks.iterator(); - while (iter.hasNext()) { - Hunk hunk= (Hunk) iter.next(); - sb.append(hunk.getRejectedDescription()); - sb.append(lineSeparator); - sb.append(hunk.getContent()); - } - return sb.toString(); - } - - /* - * Ensures that a file with the given path exists in - * the given container. Folder are created as necessary. - */ - protected IFile createPath(IContainer container, IPath path) throws CoreException { - if (path.segmentCount() > 1) { - IContainer childContainer; - if (container instanceof IWorkspaceRoot) { - IProject project = ((IWorkspaceRoot)container).getProject(path.segment(0)); - if (!project.exists()) - project.create(null); - if (!project.isOpen()) - project.open(null); - childContainer = project; - } else { - IFolder f= container.getFolder(path.uptoSegment(1)); - if (!f.exists()) - f.create(false, true, null); - childContainer = f; - } - return createPath(childContainer, path.removeFirstSegments(1)); - } - // a leaf - return container.getFile(path); - } - - public IResource getTarget() { - return fTarget; - } - - public void setTarget(IResource target) { - fTarget= target; - } - - - public IFile getTargetFile(FilePatch2 diff) { - IPath path = diff.getStrippedPath(getStripPrefixSegments(), isReversed()); - return existsInTarget(path); - } - - /** - * Iterates through all of the resources contained in the Patch Wizard target - * and looks to for a match to the passed in file - * @param path - * @return IFile which matches the passed in path or null if none found - */ - public IFile existsInTarget(IPath path) { - if (fTarget instanceof IFile) { // special case - IFile file= (IFile) fTarget; - if (matches(file.getFullPath(), path)) - return file; - } else if (fTarget instanceof IContainer) { - IContainer c= (IContainer) fTarget; - if (c.exists(path)) - return c.getFile(path); - } - return null; - } - - /** - * Returns true if path completely matches the end of fullpath - * @param fullpath - * @param path - * @return true if path matches, false otherwise - */ - private boolean matches(IPath fullpath, IPath path) { - for (IPath p= fullpath; path.segmentCount()<=p.segmentCount(); p= p.removeFirstSegments(1)) { - if (p.equals(path)) - return true; - } - return false; - } - - public int calculatePrefixSegmentCount() { - //Update prefix count - go through all of the diffs and find the smallest - //path segment contained in all diffs. - int length= 99; - if (fDiffs!=null) - for (int i= 0; i<fDiffs.length; i++) { - FilePatch2 diff= fDiffs[i]; - length= Math.min(length, diff.segmentCount()); - } - return length; - } - - public void addDiff(FilePatch2 newDiff){ - FilePatch2[] temp = new FilePatch2[fDiffs.length + 1]; - System.arraycopy(fDiffs,0, temp, 0, fDiffs.length); - temp[fDiffs.length] = newDiff; - fDiffs = temp; - } - - public void removeDiff(FilePatch2 diffToRemove){ - FilePatch2[] temp = new FilePatch2[fDiffs.length - 1]; - int counter = 0; - for (int i = 0; i < fDiffs.length; i++) { - if (fDiffs[i] != diffToRemove){ - temp[counter++] = fDiffs[i]; - } - } - fDiffs = temp; - } - - public void setEnabled(Object element, boolean enabled) { - if (element instanceof DiffProject) - setEnabledProject((DiffProject) element, enabled); - if (element instanceof FilePatch2) - setEnabledFile((FilePatch2)element, enabled); - if (element instanceof Hunk) - setEnabledHunk((Hunk) element, enabled); - } - - private void setEnabledProject(DiffProject projectDiff, boolean enabled) { - FilePatch2[] diffFiles = projectDiff.getFileDiffs(); - for (int i = 0; i < diffFiles.length; i++) { - setEnabledFile(diffFiles[i], enabled); - } - } - - private void setEnabledFile(FilePatch2 fileDiff, boolean enabled) { - IHunk[] hunks = fileDiff.getHunks(); - for (int i = 0; i < hunks.length; i++) { - setEnabledHunk((Hunk) hunks[i], enabled); - } - } - - private void setEnabledHunk(Hunk hunk, boolean enabled) { - if (enabled) { - disabledElements.remove(hunk); - FilePatch2 file = hunk.getParent(); - disabledElements.remove(file); - DiffProject project = file.getProject(); - if (project != null) - disabledElements.remove(project); - } else { - disabledElements.add(hunk); - FilePatch2 file = hunk.getParent(); - if (disabledElements.containsAll(Arrays.asList(file.getHunks()))) { - disabledElements.add(file); - DiffProject project = file.getProject(); - if (project != null - && disabledElements.containsAll(Arrays.asList(project - .getFileDiffs()))) - disabledElements.add(project); - } - } - } - - public boolean isEnabled(Object element) { - if (disabledElements.contains(element)) - return false; - Object parent = getElementParent(element); - if (parent == null) - return true; - return isEnabled(parent); - } - - protected Object getElementParent(Object element) { - if (element instanceof Hunk) { - Hunk hunk = (Hunk) element; - return hunk.getParent(); - } - return null; - } - - /** - * Calculate the fuzz factor that will allow the most hunks to be matched. - * @param monitor a progress monitor - * @return the fuzz factor or <code>-1</code> if no hunks could be matched - */ - public int guessFuzzFactor(IProgressMonitor monitor) { - try { - monitor.beginTask(Messages.Patcher_2, IProgressMonitor.UNKNOWN); - FilePatch2[] diffs= getDiffs(); - if (diffs==null||diffs.length<=0) - return -1; - int fuzz= -1; - for (int i= 0; i<diffs.length; i++) { - FilePatch2 d= diffs[i]; - IFile file= getTargetFile(d); - if (file != null && file.exists()) { - List lines= LineReader.load(file, false); - FileDiffResult result = getDiffResult(d); - int f = result.calculateFuzz(lines, monitor); - if (f > fuzz) - fuzz = f; - } - } - return fuzz; - } finally { - monitor.done(); - } - } - - public void refresh() { - diffResults.clear(); - refresh(getDiffs()); - } - - public void refresh(FilePatch2[] diffs) { - for (int i = 0; i < diffs.length; i++) { - FilePatch2 diff = diffs[i]; - FileDiffResult result = getDiffResult(diff); - ((WorkspaceFileDiffResult)result).refresh(); - } - } - - public FileDiffResult getDiffResult(FilePatch2 diff) { - FileDiffResult result = (FileDiffResult)diffResults.get(diff); - if (result == null) { - result = new WorkspaceFileDiffResult(diff, getConfiguration()); - diffResults.put(diff, result); - } - return result; - } - - public PatchConfiguration getConfiguration() { - return configuration; - } - - /** - * Return the project that contains this diff or <code>null</code> - * if the patch is not a workspace patch. - * @param diff the diff - * @return the project that contains the diff - */ - public DiffProject getProject(FilePatch2 diff) { - return diff.getProject(); - } - - /* - * Returns <code>true</code> if new value differs from old. - */ - public boolean setReversed(boolean reverse) { - if (getConfiguration().isReversed() != reverse) { - getConfiguration().setReversed(reverse); - refresh(); - return true; - } - return false; - } - - public boolean isReversed() { - return getConfiguration().isReversed(); - } - - /** - * Cache the contents for the given file diff. These contents - * will be used for the diff when the patch is applied. When the - * patch is applied, it is assumed that the provided contents - * already have all relevant hunks applied. - * @param diff the file diff - * @param contents the contents for the file diff - */ - public void cacheContents(FilePatch2 diff, byte[] contents) { - contentCache.put(diff, contents); - } - - /** - * Return whether contents have been cached for the - * given file diff. - * @param diff the file diff - * @return whether contents have been cached for the file diff - * @see #cacheContents(FilePatch2, byte[]) - */ - public boolean hasCachedContents(FilePatch2 diff) { - return contentCache.containsKey(diff); - } - - /** - * Return the content lines that are cached for the given - * file diff. - * @param diff the file diff - * @return the content lines that are cached for the file diff - */ - public List getCachedLines(FilePatch2 diff) { - byte[] contents = (byte[])contentCache.get(diff); - if (contents != null) { - BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(contents))); - return LineReader.readLines(reader); - } - return null; - } - - /** - * Return the contents that are cached for the given diff or - * <code>null</code> if there is no contents cached. - * @param diff the diff - * @return the contents that are cached for the given diff or - * <code>null</code> - */ - public byte[] getCachedContents(FilePatch2 diff) { - return (byte[])contentCache.get(diff); - } - - /** - * Return whether the patcher has any cached contents. - * @return whether the patcher has any cached contents - */ - public boolean hasCachedContents() { - return !contentCache.isEmpty(); - } - - /** - * Clear any cached contents. - */ - public void clearCachedContents() { - contentCache.clear(); - mergedHunks.clear(); - } - - public void setProperty(String key, Object value) { - getConfiguration().setProperty(key, value); - } - - public Object getProperty(String key) { - return getConfiguration().getProperty(key); - } - - public boolean isManuallyMerged(Hunk hunk) { - return mergedHunks.contains(hunk); - } - - public void setManuallyMerged(Hunk hunk, boolean merged) { - if (merged) - mergedHunks.add(hunk); - else - mergedHunks.remove(hunk); - } - - public IProject getTargetProject(FilePatch2 diff) { - DiffProject dp = getProject(diff); - if (dp != null) - return Utilities.getProject(dp); - IResource tr = getTarget(); - if (tr instanceof IWorkspaceRoot) { - IWorkspaceRoot root = (IWorkspaceRoot) tr; - return root.getProject(diff.getPath(isReversed()).segment(0)); - } - return tr.getProject(); - } - - public static Patcher getPatcher(PatchConfiguration configuration) { - return (Patcher)configuration.getProperty(PROP_PATCHER); - } - - public boolean hasRejects() { - for (Iterator iterator = diffResults.values().iterator(); iterator.hasNext();) { - FileDiffResult result = (FileDiffResult) iterator.next(); - if (result.hasRejects()) - return true; - } - return false; - } - - public boolean select(IHunk hunk) { - return isEnabled(hunk); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PreviewPatchPage2.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PreviewPatchPage2.java deleted file mode 100644 index 7414cbef3..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PreviewPatchPage2.java +++ /dev/null @@ -1,747 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 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.internal.patch; - -import java.lang.reflect.InvocationTargetException; -import java.util.Iterator; -import java.util.regex.Pattern; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareUI; -import org.eclipse.compare.internal.ComparePreferencePage; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.ICompareUIConstants; -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.compare.internal.core.patch.Hunk; -import org.eclipse.compare.patch.IHunk; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.TreeSelection; -import org.eclipse.jface.window.Window; -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.forms.events.ExpansionAdapter; -import org.eclipse.ui.forms.events.ExpansionEvent; -import org.eclipse.ui.forms.widgets.ExpandableComposite; -import org.eclipse.ui.forms.widgets.Form; -import org.eclipse.ui.forms.widgets.FormToolkit; - - -public class PreviewPatchPage2 extends WizardPage { - - protected final static String PREVIEWPATCHPAGE_NAME= "PreviewPatchPage"; //$NON-NLS-1$ - - private static final String EXPAND_PATCH_OPTIONS = "expandPatchOptions"; //$NON-NLS-1$ - private static final String GENERATE_REJECTS = "generateRejects"; //$NON-NLS-1$ - - final WorkspacePatcher fPatcher; - private final CompareConfiguration fConfiguration; - private PatchCompareEditorInput fInput; - - private Combo fStripPrefixSegments; - private Text fFuzzField; - private Label addedRemovedLines; - - private Action fExcludeAction; - private Action fIncludeAction; - private Action fIgnoreWhiteSpace; - private Action fReversePatch; - private Action fMoveAction; - - protected boolean pageRecalculate= true; - - private IDialogSettings settings; - private ExpandableComposite patchOptions; - private Button generateRejects; - private FormToolkit fToolkit; - - public PreviewPatchPage2(WorkspacePatcher patcher, CompareConfiguration configuration) { - super(PREVIEWPATCHPAGE_NAME, PatchMessages.PreviewPatchPage_title, null); - setDescription(PatchMessages.PreviewPatchPage2_8); - Assert.isNotNull(patcher); - Assert.isNotNull(configuration); - this.fPatcher = patcher; - this.fConfiguration = configuration; - this.fConfiguration.addPropertyChangeListener(new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - if (event.getProperty().equals(CompareConfiguration.IGNORE_WHITESPACE)){ - rebuildTree(); - } - } - }); - } - - public void createControl(Composite parent) { - fToolkit = new FormToolkit(parent.getDisplay()); - fToolkit.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); - - final Form form = fToolkit.createForm(parent); - Composite composite = form.getBody(); - composite.setLayout(new GridLayout()); - composite.setLayoutData(new GridData(GridData.FILL_BOTH)); - initializeDialogUnits(parent); - - fInput = new PatchCompareEditorInput(getPatcher(), getCompareConfiguration()) { - protected void fillContextMenu(IMenuManager manager) { - if (isShowAll()) { - manager.add(fIncludeAction); - } - manager.add(fExcludeAction); - manager.add(new Separator()); - manager.add(fMoveAction); - } - }; - - buildPatchOptionsGroup(form); - - // Initialize the input - try { - fInput.run(null); - } catch (InterruptedException e) {//ignore - } catch (InvocationTargetException e) {//ignore - } - - Label label = new Label(composite, SWT.NONE); - label.setText(PatchMessages.PreviewPatchPage2_9); - Control c = fInput.createContents(composite); - initializeActions(); - fInput.contributeDiffViewerToolbarItems(getContributedActions(), getPatcher().isWorkspacePatch()); - fInput.getViewer().addSelectionChangedListener(new ISelectionChangedListener(){ - public void selectionChanged(SelectionChangedEvent event) { - ISelection s = event.getSelection(); - if (s != null && !s.isEmpty()) { - if (s instanceof IStructuredSelection) { - IStructuredSelection ss = (IStructuredSelection) s; - updateActions(ss); - } - } - }}); - - c.setLayoutData(new GridData(GridData.FILL_BOTH)); - - addedRemovedLines = new Label(composite, SWT.NONE); - addedRemovedLines.setLayoutData(new GridData(GridData.FILL_HORIZONTAL - | GridData.VERTICAL_ALIGN_BEGINNING)); - - setControl(composite); - - restoreWidgetValues(); - - Dialog.applyDialogFont(composite); - } - - private void updateActions(IStructuredSelection ss) { - fExcludeAction.setEnabled(false); - fIncludeAction.setEnabled(false); - for (Iterator it = ss.iterator(); it.hasNext();) { - Object element = it.next(); - if (element instanceof PatchDiffNode) { - if (((PatchDiffNode) element).isEnabled()) { - fExcludeAction.setEnabled(true); - } else { - fIncludeAction.setEnabled(true); - } - } - } - } - - /** - * Makes sure that at least one hunk is checked off in the tree before - * allowing the patch to be applied. - */ - private void updateEnablements() { - boolean atLeastOneIsEnabled = false; - if (fInput != null) - atLeastOneIsEnabled = fInput.hasResultToApply(); - setPageComplete(atLeastOneIsEnabled); - } - - private Action[] getContributedActions() { - return new Action[]{ fIgnoreWhiteSpace }; - } - - private void initializeActions() { - - fMoveAction = new Action(PatchMessages.PreviewPatchPage2_RetargetAction, null) { - public void run() { - Shell shell = getShell(); - ISelection selection = fInput.getViewer().getSelection(); - PatchDiffNode node = null; - if (selection instanceof IStructuredSelection) { - IStructuredSelection ss = (IStructuredSelection) selection; - if (ss.getFirstElement() instanceof PatchDiffNode) { - node = (PatchDiffNode) ss.getFirstElement(); - } - } - if (node == null) - return; - final RetargetPatchElementDialog dialog = new RetargetPatchElementDialog(shell, fPatcher, node); - int returnCode = dialog.open(); - if (returnCode == Window.OK) { - // TODO: This could be a problem. We should only rebuild the affected nodes - rebuildTree(); - } - } - }; - fMoveAction .setToolTipText(PatchMessages.PreviewPatchPage2_RetargetTooltip); - fMoveAction.setEnabled(true); - fInput.getViewer().addSelectionChangedListener(new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent event) { - IStructuredSelection sel= (IStructuredSelection) event.getSelection(); - Object obj= sel.getFirstElement(); - boolean enable = false; - if (obj instanceof PatchProjectDiffNode) { - enable = true; - } else if (obj instanceof PatchFileDiffNode) { - PatchFileDiffNode node = (PatchFileDiffNode) obj; - enable = node.getDiffResult().getDiffProblem(); - } else if (obj instanceof HunkDiffNode) { - enable = true; - } - fMoveAction.setEnabled(enable); - } - }); - - fExcludeAction = new Action(PatchMessages.PreviewPatchPage2_0) { - public void run() { - ISelection selection = fInput.getViewer().getSelection(); - if (selection instanceof TreeSelection){ - TreeSelection treeSelection = (TreeSelection) selection; - Iterator iter = treeSelection.iterator(); - while (iter.hasNext()){ - Object obj = iter.next(); - if (obj instanceof PatchDiffNode){ - PatchDiffNode node = ((PatchDiffNode) obj); - node.setEnabled(false); - // TODO: This may require a rebuild if matched hunks are shown - } - } - updateActions(treeSelection); - } - fInput.getViewer().refresh(); - } - }; - fExcludeAction.setEnabled(true); - - fIncludeAction = new Action(PatchMessages.PreviewPatchPage2_1) { - public void run() { - ISelection selection = fInput.getViewer().getSelection(); - if (selection instanceof TreeSelection){ - TreeSelection treeSelection = (TreeSelection) selection; - Iterator iter = treeSelection.iterator(); - while (iter.hasNext()){ - Object obj = iter.next(); - if (obj instanceof PatchDiffNode){ - PatchDiffNode node = ((PatchDiffNode) obj); - node.setEnabled(true); - // TODO: This may require a rebuild if matched hunks are shown - } - } - updateActions(treeSelection); - } - fInput.getViewer().refresh(); - } - }; - fIncludeAction.setEnabled(true); - - fIgnoreWhiteSpace = new Action(PatchMessages.PreviewPatchPage2_IgnoreWSAction, CompareUIPlugin.getImageDescriptor(ICompareUIConstants.IGNORE_WHITESPACE_ENABLED)){ - public void run(){ - try { - getContainer().run(false, true, new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - monitor.beginTask(PatchMessages.PreviewPatchPage2_IgnoreWhitespace, IProgressMonitor.UNKNOWN); - if (isChecked() != getPatcher().isIgnoreWhitespace()) { - if (promptToRebuild(PatchMessages.PreviewPatchPage2_2)) { - if (getPatcher().setIgnoreWhitespace(isChecked())){ - getCompareConfiguration().setProperty(CompareConfiguration.IGNORE_WHITESPACE, new Boolean(isChecked())); - } - } else { - fIgnoreWhiteSpace.setChecked(!isChecked()); - } - } - monitor.done(); - } - }); - } catch (InvocationTargetException e) { //ignore - } catch (InterruptedException e) { //ignore - } - } - }; - fIgnoreWhiteSpace.setChecked(false); - fIgnoreWhiteSpace.setToolTipText(PatchMessages.PreviewPatchPage2_IgnoreWSTooltip); - fIgnoreWhiteSpace.setDisabledImageDescriptor(CompareUIPlugin.getImageDescriptor(ICompareUIConstants.IGNORE_WHITESPACE_DISABLED)); - - fReversePatch = new Action(PatchMessages.PreviewPatchPage_ReversePatch_text){ - public void run(){ - try { - getContainer().run(true, true, new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - monitor.beginTask(PatchMessages.PreviewPatchPage2_CalculateReverse, IProgressMonitor.UNKNOWN); - if (isChecked() != getPatcher().isReversed()) { - if (promptToRebuild(PatchMessages.PreviewPatchPage2_3)) { - if (getPatcher().setReversed(isChecked())){ - rebuildTree(); - } - } else { - fReversePatch.setChecked(!isChecked()); - } - } - monitor.done(); - } - }); - } catch (InvocationTargetException e) { //ignore - } catch (InterruptedException e) { //ignore - } - - } - - }; - fReversePatch.setChecked(false); - fReversePatch.setToolTipText(PatchMessages.PreviewPatchPage_ReversePatch_text); - } - - public void setVisible(boolean visible) { - super.setVisible(visible); - //Need to handle input and rebuild tree only when becoming visible - if (visible){ - fillSegmentCombo(); - // TODO: We should only do this if the tree needs to be rebuilt - rebuildTree(); - updateEnablements(); - addedRemovedLines.setText(countLines()); - // expand the first tree item i.e. change - getCompareConfiguration().getContainer().getNavigator().selectChange(true); - getContainer().updateButtons(); - getShell().getDefaultButton().setFocus(); - } - } - - private boolean promptToRebuild(final String promptToConfirm){ - final Control ctrl = getControl(); - final boolean[] result = new boolean[] { false }; - if (ctrl != null && !ctrl.isDisposed()){ - Runnable runnable = new Runnable() { - public void run() { - if (!ctrl.isDisposed()) { - // flush any viewers before prompting - try { - fInput.saveChanges(null); - } catch (CoreException e) { - CompareUIPlugin.log(e); - } - result[0] = fInput.confirmRebuild(promptToConfirm); - } - } - }; - if (Display.getCurrent() == null) - ctrl.getDisplay().syncExec(runnable); - else - runnable.run(); - } - return result[0]; - } - - private void rebuildTree(){ - final Control ctrl = getControl(); - if (ctrl != null && !ctrl.isDisposed()){ - Runnable runnable = new Runnable() { - public void run() { - if (!ctrl.isDisposed()) { - fInput.buildTree(); - updateEnablements(); - } - } - }; - if (Display.getCurrent() == null) - ctrl.getDisplay().syncExec(runnable); - else - runnable.run(); - } - } - - private void fillSegmentCombo() { - if (getPatcher().isWorkspacePatch()) { - fStripPrefixSegments.setEnabled(false); - } else { - fStripPrefixSegments.setEnabled(true); - int length= 99; - if (fStripPrefixSegments!=null && pageRecalculate) { - length= getPatcher().calculatePrefixSegmentCount(); - if (length!=99) { - for (int k= 1; k<length; k++) - fStripPrefixSegments.add(Integer.toString(k)); - pageRecalculate= false; - } - } - } - } - /* - * Create the group for setting various patch options - */ - private void buildPatchOptionsGroup(final Form form) { - Composite parent = form.getBody(); - - patchOptions = fToolkit.createExpandableComposite(parent, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT); - patchOptions.setText(PatchMessages.PreviewPatchPage_PatchOptions_title); - patchOptions.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT)); - patchOptions.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 3, 1)); - patchOptions.addExpansionListener(new ExpansionAdapter() { - public void expansionStateChanged(ExpansionEvent e) { - form.layout(); - } - }); - - Composite c = new Composite(patchOptions, SWT.NONE); - patchOptions.setClient(c); - patchOptions.setExpanded(true); - GridLayout gl= new GridLayout(); gl.numColumns= 3; - c.setLayout(gl); - c.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL|GridData.GRAB_HORIZONTAL)); - - // 1st row - createStripSegmentCombo(c); - createShowMatchedToggle(c); - createFuzzFactorChooser(c); - - // 2nd row - createReversePatchToggle(c); - createShowRemovedToggle(c); - createGenerateRejectsToggle(c); - - // register listeners - final WorkspacePatcher patcher= getPatcher(); - if (fStripPrefixSegments!=null) - fStripPrefixSegments.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (patcher.getStripPrefixSegments() != getStripPrefixSegments()) { - if (promptToRebuild(PatchMessages.PreviewPatchPage2_4)) { - if (patcher.setStripPrefixSegments(getStripPrefixSegments())) - rebuildTree(); - } - } - } - } - ); - - - fFuzzField.addModifyListener( - new ModifyListener() { - public void modifyText(ModifyEvent e) { - if (patcher.getFuzz() != getFuzzFactor()) { - if (promptToRebuild(PatchMessages.PreviewPatchPage2_5)) { - if (patcher.setFuzz(getFuzzFactor())) - rebuildTree(); - } else { - fFuzzField.setText(Integer.toString(patcher.getFuzz())); - } - } - } - }); - } - - private void createFuzzFactorChooser(Composite parent) { - final WorkspacePatcher patcher= getPatcher(); - Composite pair= new Composite(parent, SWT.NONE); - GridLayout gl= new GridLayout(); gl.numColumns= 3; gl.marginHeight= gl.marginWidth= 0; - pair.setLayout(gl); - GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); - pair.setLayoutData(gd); - - Label l= new Label(pair, SWT.NONE); - l.setText(PatchMessages.PreviewPatchPage_FuzzFactor_text); - l.setToolTipText(PatchMessages.PreviewPatchPage_FuzzFactor_tooltip); - gd= new GridData(GridData.VERTICAL_ALIGN_CENTER|GridData.HORIZONTAL_ALIGN_BEGINNING|GridData.GRAB_HORIZONTAL); - l.setLayoutData(gd); - - fFuzzField= new Text(pair, SWT.BORDER); - fFuzzField.setText("0"); //$NON-NLS-1$ - gd= new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.HORIZONTAL_ALIGN_END); - gd.widthHint= 30; - fFuzzField.setLayoutData(gd); - - Button b= new Button(pair, SWT.PUSH); - b.setText(PatchMessages.PreviewPatchPage_GuessFuzz_text); - b.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (promptToRebuild(PatchMessages.PreviewPatchPage2_6)) { - // Reset the fuzz. We don't use HunkResult.MAXIMUM_FUZZ_FACTOR on purpose here, - // in order to refresh the tree the result of the calculation needs to be different - // than the fuzz set in the configuration (see fFuzzField modify listener). - patcher.setFuzz(-1); - int fuzz= guessFuzzFactor(patcher); - if (fuzz>=0) - fFuzzField.setText(Integer.toString(fuzz)); - } - } - } - ); - gd= new GridData(GridData.VERTICAL_ALIGN_CENTER); - int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); - Point minSize = b.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); - gd.widthHint = Math.max(widthHint, minSize.x); - b.setLayoutData(gd); - } - - private void createGenerateRejectsToggle(Composite pair) { - generateRejects = new Button(pair, SWT.CHECK); - generateRejects.setText(PatchMessages.HunkMergePage_GenerateRejectFile); - GridData gd = new GridData(GridData.VERTICAL_ALIGN_CENTER - | GridData.HORIZONTAL_ALIGN_BEGINNING - | GridData.GRAB_HORIZONTAL); - generateRejects.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - getPatcher().setGenerateRejectFile( - generateRejects.getSelection()); - } - }); - generateRejects.setSelection(false); - generateRejects.setLayoutData(gd); - } - - private void createShowRemovedToggle(Composite pair) { - final Button showRemoved = new Button(pair, SWT.CHECK); - showRemoved.setText(PatchMessages.PreviewPatchPage2_7); - GridData gd = new GridData(GridData.VERTICAL_ALIGN_CENTER - | GridData.HORIZONTAL_ALIGN_BEGINNING - | GridData.GRAB_HORIZONTAL); - showRemoved.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - fInput.setShowAll(showRemoved.getSelection()); - fInput.updateTree(); - } - }); - showRemoved.setSelection(fInput.isShowAll()); - showRemoved.setLayoutData(gd); - } - - private void createReversePatchToggle(Composite pair) { - final Button reversePatch = new Button(pair, SWT.CHECK); - reversePatch.setText(PatchMessages.PreviewPatchPage_ReversePatch_text); - GridData gd = new GridData(GridData.VERTICAL_ALIGN_CENTER - | GridData.HORIZONTAL_ALIGN_BEGINNING - | GridData.GRAB_HORIZONTAL); - reversePatch.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (fReversePatch != null) { - fReversePatch.setChecked(reversePatch.getSelection()); - fReversePatch.run(); - if (fReversePatch.isChecked() != reversePatch.getSelection()) { - reversePatch.setSelection(fReversePatch.isChecked()); - } - } - } - }); - reversePatch.setSelection(getPatcher().isReversed()); - reversePatch.setLayoutData(gd); - } - - private void createStripSegmentCombo(Composite parent) { - final WorkspacePatcher patcher= getPatcher(); - - Composite pair= new Composite(parent, SWT.NONE); - GridLayout gl= new GridLayout(); gl.numColumns= 2; gl.marginHeight= gl.marginWidth= 0; - pair.setLayout(gl); - GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); - pair.setLayoutData(gd); - - Label l= new Label(pair, SWT.NONE); - l.setText(PatchMessages.PreviewPatchPage_IgnoreSegments_text); - gd= new GridData(GridData.VERTICAL_ALIGN_CENTER|GridData.HORIZONTAL_ALIGN_BEGINNING); - l.setLayoutData(gd); - - fStripPrefixSegments= new Combo(pair, SWT.DROP_DOWN|SWT.READ_ONLY|SWT.SIMPLE); - int prefixCnt= patcher.getStripPrefixSegments(); - String prefix= Integer.toString(prefixCnt); - fStripPrefixSegments.add(prefix); - fStripPrefixSegments.setText(prefix); - gd= new GridData(GridData.VERTICAL_ALIGN_CENTER|GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.GRAB_HORIZONTAL); - fStripPrefixSegments.setLayoutData(gd); - } - - private void createShowMatchedToggle(Composite parent) { - final Button showMatched = new Button(parent, SWT.CHECK); - showMatched.setText(PatchMessages.PreviewPatchPage2_ShowMatched); - GridData gd = new GridData(GridData.VERTICAL_ALIGN_CENTER - | GridData.HORIZONTAL_ALIGN_BEGINNING - | GridData.GRAB_HORIZONTAL); - showMatched.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - fInput.setShowMatched(showMatched.getSelection()); - rebuildTree(); - } - }); - showMatched.setSelection(fInput.isShowMatched()); - showMatched.setLayoutData(gd); - } - - public int getFuzzFactor() { - int fuzzFactor= 0; - if (fFuzzField!=null) { - String s= fFuzzField.getText(); - try { - fuzzFactor= Integer.parseInt(s); - } catch (NumberFormatException ex) { - // silently ignored - } - } - return fuzzFactor; - } - - public int getStripPrefixSegments() { - int stripPrefixSegments= 0; - if (fStripPrefixSegments!=null) { - String s= fStripPrefixSegments.getText(); - try { - stripPrefixSegments= Integer.parseInt(s); - } catch (NumberFormatException ex) { - // silently ignored - } - } - return stripPrefixSegments; - } - - private int guessFuzzFactor(final WorkspacePatcher patcher) { - final int[] result= new int[] { -1 }; - try { - PlatformUI.getWorkbench().getProgressService().run(true, true, - new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) { - result[0]= patcher.guessFuzzFactor(monitor); - } - } - ); - } catch (InvocationTargetException ex) { - // NeedWork - } catch (InterruptedException ex) { - // NeedWork - } - return result[0]; - } - - public void ensureContentsSaved() { - try { - fInput.saveChanges(new NullProgressMonitor()); - } catch (CoreException e) { - //ignore - } - } - - public WorkspacePatcher getPatcher() { - return fPatcher; - } - - public CompareConfiguration getCompareConfiguration() { - return fConfiguration; - } - - private void restoreWidgetValues() { - IDialogSettings dialogSettings = CompareUI.getPlugin().getDialogSettings(); - settings = dialogSettings.getSection(PREVIEWPATCHPAGE_NAME); - if (settings == null) { - settings = dialogSettings.addNewSection(PREVIEWPATCHPAGE_NAME); - } - if (settings != null) { - if (settings.get(EXPAND_PATCH_OPTIONS) != null) - patchOptions.setExpanded(settings.getBoolean(EXPAND_PATCH_OPTIONS)); - if (settings.get(GENERATE_REJECTS) != null) { - generateRejects.setSelection(settings.getBoolean(GENERATE_REJECTS)); - getPatcher().setGenerateRejectFile(generateRejects.getSelection()); - } - } - } - - void saveWidgetValues() { - settings.put(EXPAND_PATCH_OPTIONS, patchOptions.isExpanded()); - settings.put(GENERATE_REJECTS, generateRejects.getSelection()); - } - - private String countLines() { - int added = 0, removed = 0; - - IPreferenceStore store = CompareUIPlugin.getDefault().getPreferenceStore(); - String addedLinesRegex = store.getString(ComparePreferencePage.ADDED_LINES_REGEX); - String removedLinesRegex = store.getString(ComparePreferencePage.REMOVED_LINES_REGEX); - - if ((addedLinesRegex == null || "".equals(addedLinesRegex)) //$NON-NLS-1$ - && (removedLinesRegex == null || "".equals(removedLinesRegex))) { //$NON-NLS-1$ - - fPatcher.countLines(); - FilePatch2[] fileDiffs = fPatcher.getDiffs(); - for (int i = 0; i < fileDiffs.length; i++) { - added += fileDiffs[i].getAddedLines(); - removed += fileDiffs[i].getRemovedLines(); - } - - } else { - - Pattern addedPattern = Pattern.compile(addedLinesRegex); - Pattern removedPattern = Pattern.compile(removedLinesRegex); - - FilePatch2[] fileDiffs = fPatcher.getDiffs(); - for (int i = 0; i < fileDiffs.length; i++) { - IHunk[] hunks = fileDiffs[i].getHunks(); - for (int j = 0; j < hunks.length; j++) { - String[] lines = ((Hunk) hunks[j]).getLines(); - for (int k = 0; k < lines.length; k++) { - String line = lines[k]; - if (addedPattern.matcher(line).find()) - added++; - if (removedPattern.matcher(line).find()) - removed++; - } - } - } - } - - return NLS.bind(PatchMessages.PreviewPatchPage2_AddedRemovedLines, - new String[] { added + "", removed + "" }); //$NON-NLS-1$ //$NON-NLS-2$ - } - - public void dispose() { - fToolkit.dispose(); - super.dispose(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/RetargetPatchElementDialog.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/RetargetPatchElementDialog.java deleted file mode 100644 index 3efc37027..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/RetargetPatchElementDialog.java +++ /dev/null @@ -1,224 +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.internal.patch; - -import java.util.ArrayList; - -import org.eclipse.compare.internal.core.patch.DiffProject; -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.compare.internal.core.patch.Hunk; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.viewers.*; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.*; -import org.eclipse.ui.model.BaseWorkbenchContentProvider; -import org.eclipse.ui.model.WorkbenchLabelProvider; -import org.eclipse.ui.views.navigator.ResourceComparator; - -class RetargetPatchElementDialog extends Dialog { - - private static class RetargetPatchContentProvider extends BaseWorkbenchContentProvider { - private final PatchDiffNode node; - public RetargetPatchContentProvider(PatchDiffNode node) { - this.node = node; - } - public Object[] getChildren(Object element) { - if (element instanceof IWorkspaceRoot) { - // Don't show closed projects - IProject[] allProjects= ((IWorkspaceRoot) element).getProjects(); - ArrayList accessibleProjects= new ArrayList(); - for (int i= 0; i<allProjects.length; i++) { - if (allProjects[i].isOpen()) { - accessibleProjects.add(allProjects[i]); - } - } - return accessibleProjects.toArray(); - } - // When retargeting a diff project, don't support expansion - if (element instanceof IProject && node instanceof PatchProjectDiffNode) { - return new Object[0]; - } - return super.getChildren(element); - } - } - - private final PatchDiffNode fSelectedNode; - private final WorkspacePatcher fPatcher; - private TreeViewer fViewer; - private IResource fSelectedResource; - - public RetargetPatchElementDialog(Shell shell, WorkspacePatcher patcher, PatchDiffNode node) { - super(shell); - Assert.isNotNull(patcher); - Assert.isNotNull(node); - setShellStyle(getShellStyle() | SWT.RESIZE); - this.fPatcher = patcher; - fSelectedNode= node; - } - - protected Control createButtonBar(Composite parent) { - Control control = super.createButtonBar(parent); - Button okButton = this.getButton(IDialogConstants.OK_ID); - okButton.setEnabled(false); - return control; - } - - protected Control createDialogArea(Composite parent) { - Composite composite= (Composite) super.createDialogArea(parent); - - initializeDialogUnits(parent); - - getShell().setText(PatchMessages.PreviewPatchPage_RetargetPatch); - - GridLayout layout= new GridLayout(); - layout.numColumns= 1; - layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); - layout.marginWidth= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); - composite.setLayout(layout); - final GridData data= new GridData(SWT.FILL, SWT.FILL, true, true); - composite.setLayoutData(data); - - //add controls to composite as necessary - Label label= new Label(composite, SWT.LEFT|SWT.WRAP); - label.setText(getTreeLabel()); - final GridData data2= new GridData(SWT.FILL, SWT.BEGINNING, true, false); - label.setLayoutData(data2); - - fViewer= new TreeViewer(composite, SWT.BORDER); - GridData gd= new GridData(SWT.FILL, SWT.FILL, true, true); - gd.widthHint= 0; - gd.heightHint= 0; - fViewer.getTree().setLayoutData(gd); - fViewer.setContentProvider(new RetargetPatchContentProvider(fSelectedNode)); - fViewer.setLabelProvider(new WorkbenchLabelProvider()); - fViewer.setComparator(new ResourceComparator(ResourceComparator.NAME)); - fViewer.setInput(getViewerInput()); - IResource resource = getInitialSelection(); - if (resource != null) { - fViewer.setSelection(new StructuredSelection(resource)); - fViewer.expandToLevel(resource, 0); - } - setupListeners(); - - Dialog.applyDialogFont(composite); - return parent; - } - - private IResource getViewerInput() { - if (fPatcher.isWorkspacePatch()) - return ResourcesPlugin.getWorkspace().getRoot(); - return fPatcher.getTarget(); - } - - private IResource getInitialSelection() { - if (fSelectedNode instanceof PatchFileDiffNode) { - PatchFileDiffNode node = (PatchFileDiffNode) fSelectedNode; - return fPatcher.getTargetFile(node.getDiffResult().getDiff()); - } else if (fSelectedNode instanceof HunkDiffNode) { - HunkDiffNode node = (HunkDiffNode) fSelectedNode; - return fPatcher.getTargetFile(node.getHunkResult().getDiffResult().getDiff()); - } else if (fSelectedNode instanceof PatchProjectDiffNode) { - PatchProjectDiffNode node = (PatchProjectDiffNode) fSelectedNode; - DiffProject diffProject = node.getDiffProject(); - return Utilities.getProject(diffProject); - } - return null; - } - - private String getTreeLabel() { - if (fSelectedNode instanceof PatchProjectDiffNode) { - PatchProjectDiffNode node = (PatchProjectDiffNode) fSelectedNode; - DiffProject project = node.getDiffProject(); - return NLS.bind(PatchMessages.PreviewPatchPage_SelectProject, project.getName()); - } else if (fSelectedNode instanceof PatchFileDiffNode) { - PatchFileDiffNode node = (PatchFileDiffNode) fSelectedNode; - //copy over all hunks to new target resource - FilePatch2 diff = node.getDiffResult().getDiff(); - return NLS.bind(PatchMessages.RetargetPatchElementDialog_0, fPatcher.getPath(diff)); - } else if (fSelectedNode instanceof HunkDiffNode) { - HunkDiffNode node = (HunkDiffNode) fSelectedNode; - Hunk hunk = node.getHunkResult().getHunk(); - return NLS.bind(PatchMessages.RetargetPatchElementDialog_1, fPatcher.getPath(hunk.getParent())); - } - return ""; //$NON-NLS-1$ - } - - protected void okPressed() { - if (fSelectedResource != null){ - if (fSelectedNode instanceof PatchProjectDiffNode && fSelectedResource instanceof IProject) { - PatchProjectDiffNode node = (PatchProjectDiffNode) fSelectedNode; - DiffProject project = node.getDiffProject(); - fPatcher.retargetProject(project, (IProject)fSelectedResource); - } else if (fSelectedNode instanceof PatchFileDiffNode && fSelectedResource instanceof IFile) { - PatchFileDiffNode node = (PatchFileDiffNode) fSelectedNode; - //copy over all hunks to new target resource - FilePatch2 diff = node.getDiffResult().getDiff(); - fPatcher.retargetDiff(diff, (IFile)fSelectedResource); - } else if (fSelectedNode instanceof HunkDiffNode && fSelectedResource instanceof IFile) { - HunkDiffNode node = (HunkDiffNode) fSelectedNode; - fPatcher.retargetHunk(node.getHunkResult().getHunk(), (IFile)fSelectedResource); - } - } - super.okPressed(); - } - - void setupListeners() { - fViewer.addSelectionChangedListener(new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent event) { - IStructuredSelection s= (IStructuredSelection) event.getSelection(); - Object obj= s.getFirstElement(); - if (obj instanceof IResource){ - fSelectedResource = (IResource) obj; - if (fSelectedNode instanceof PatchProjectDiffNode) { - if (fSelectedResource instanceof IProject){ - Button okButton = getButton(IDialogConstants.OK_ID); - okButton.setEnabled(true); - } - } else if (fSelectedNode instanceof PatchFileDiffNode - || fSelectedNode instanceof HunkDiffNode) { - if (fSelectedResource instanceof IFile){ - Button okButton = getButton(IDialogConstants.OK_ID); - okButton.setEnabled(true); - } - } - } - } - }); - - fViewer.addDoubleClickListener(new IDoubleClickListener() { - public void doubleClick(DoubleClickEvent event) { - ISelection s= event.getSelection(); - if (s instanceof IStructuredSelection) { - Object item= ((IStructuredSelection) s).getFirstElement(); - if (fViewer.getExpandedState(item)) - fViewer.collapseToLevel(item, 1); - else - fViewer.expandToLevel(item, 1); - } - } - }); - - } - - protected Point getInitialSize() { - final Point size= super.getInitialSize(); - size.x= convertWidthInCharsToPixels(75); - size.y+= convertHeightInCharsToPixels(20); - return size; - } -}
\ No newline at end of file diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/UnmatchedHunkTypedElement.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/UnmatchedHunkTypedElement.java deleted file mode 100644 index 09eb69c83..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/UnmatchedHunkTypedElement.java +++ /dev/null @@ -1,115 +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.internal.patch; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.util.List; - -import org.eclipse.compare.IContentChangeListener; -import org.eclipse.compare.IContentChangeNotifier; -import org.eclipse.compare.IEditableContent; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.ContentChangeNotifier; -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.compare.internal.core.patch.HunkResult; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.runtime.CoreException; - -public class UnmatchedHunkTypedElement extends HunkTypedElement implements IContentChangeNotifier, IEditableContent { - - private ContentChangeNotifier changeNotifier; - - public UnmatchedHunkTypedElement(HunkResult result) { - // An unmatched hunk element is always used for the before state and is full context - super(result, false, true); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IContentChangeNotifier#addContentChangeListener(org.eclipse.compare.IContentChangeListener) - */ - public synchronized void addContentChangeListener(IContentChangeListener listener) { - if (changeNotifier == null) - changeNotifier = new ContentChangeNotifier(this); - changeNotifier.addContentChangeListener(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IContentChangeNotifier#removeContentChangeListener(org.eclipse.compare.IContentChangeListener) - */ - public synchronized void removeContentChangeListener(IContentChangeListener listener) { - if (changeNotifier != null) - changeNotifier.removeContentChangeListener(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IEditableContent#isEditable() - */ - public boolean isEditable() { - IFile file = ((WorkspaceFileDiffResult)getHunkResult().getDiffResult()).getTargetFile(); - return file != null && file.isAccessible(); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IEditableContent#replace(org.eclipse.compare.ITypedElement, org.eclipse.compare.ITypedElement) - */ - public ITypedElement replace(ITypedElement dest, ITypedElement src) { - // Not supported - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IEditableContent#setContent(byte[]) - */ - public void setContent(byte[] newContent) { - getPatcher().setManuallyMerged(getHunkResult().getHunk(), true); - getPatcher().cacheContents(getDiff(), newContent); - if (changeNotifier != null) - changeNotifier.fireContentChanged(); - } - - private FilePatch2 getDiff() { - return getHunkResult().getDiffResult().getDiff(); - } - - private Patcher getPatcher() { - return Patcher.getPatcher(getConfiguration()); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.internal.patch.HunkTypedElement#getContents() - */ - public InputStream getContents() throws CoreException { - // If there are cached contents, use them - if (getPatcher().hasCachedContents(getDiff())) - return new ByteArrayInputStream(getPatcher().getCachedContents(getDiff())); - // Otherwise return the after state of the diff result - List lines = getHunkResult().getDiffResult().getAfterLines(); - String content = LineReader.createString(getHunkResult().getDiffResult().isPreserveLineDelimeters(), lines); - byte[] bytes = null; - if (getCharset() != null) - try { - bytes = content.getBytes(getCharset()); - } catch (UnsupportedEncodingException e) { - CompareUIPlugin.log(e); - } - if (bytes == null) - bytes = content.getBytes(); - return new ByteArrayInputStream(bytes); - } - - private PatchConfiguration getConfiguration() { - return getHunkResult().getDiffResult().getConfiguration(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Utilities.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Utilities.java deleted file mode 100644 index 17c2d88a7..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Utilities.java +++ /dev/null @@ -1,106 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 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.internal.patch; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.io.UnsupportedEncodingException; - -import org.eclipse.compare.internal.CompareMessages; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.core.patch.DiffProject; -import org.eclipse.compare.patch.ReaderCreator; -import org.eclipse.core.resources.IEncodedStorage; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IStorage; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; - -public class Utilities { - - public static String getCharset(Object resource) { - if (resource instanceof IEncodedStorage) { - try { - return ((IEncodedStorage) resource).getCharset(); - } catch (CoreException ex) { - CompareUIPlugin.log(ex); - } - } - return ResourcesPlugin.getEncoding(); - } - - public static IProject getProject(DiffProject diffProject) { - return ResourcesPlugin.getWorkspace().getRoot().getProject( - diffProject.getName()); - } - - public static ReaderCreator getReaderCreator(final IStorage storage) { - return new ReaderCreator() { - public Reader createReader() throws CoreException { - return Utilities.createReader(storage); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.compare.patch.ReaderCreator#canCreateReader() - */ - public boolean canCreateReader() { - if (storage == null - || (storage != null && storage instanceof IFile && !((IFile) storage) - .isAccessible())) { - return false; - } - return true; - } - }; - } - - public static BufferedReader createReader(IStorage storage) - throws CoreException { - if (storage == null - || (storage != null && storage instanceof IFile && !((IFile) storage) - .isAccessible())) { - throw new CoreException(new Status(IStatus.WARNING, - CompareUIPlugin.PLUGIN_ID, - CompareMessages.ReaderCreator_fileIsNotAccessible)); - } - String charset = null; - if (storage instanceof IEncodedStorage) { - IEncodedStorage es = (IEncodedStorage) storage; - charset = es.getCharset(); - } - InputStreamReader in = null; - if (charset != null) { - InputStream contents = storage.getContents(); - try { - in = new InputStreamReader(contents, charset); - } catch (UnsupportedEncodingException e) { - CompareUIPlugin.log(e); - try { - contents.close(); - } catch (IOException e1) { - // Ignore - } - } - } - if (in == null) { - in = new InputStreamReader(storage.getContents()); - } - return new BufferedReader(in); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/WorkspaceFileDiffResult.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/WorkspaceFileDiffResult.java deleted file mode 100644 index 494dda42c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/WorkspaceFileDiffResult.java +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 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.patch; - -import java.util.List; - -import org.eclipse.compare.internal.core.patch.FileDiffResult; -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.compare.patch.PatchConfiguration; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IStorage; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; - -public class WorkspaceFileDiffResult extends FileDiffResult { - - public WorkspaceFileDiffResult(FilePatch2 diff, - PatchConfiguration configuration) { - super(diff, configuration); - } - - protected boolean canCreateTarget(IStorage storage) { - IProject project = getPatcher().getTargetProject(getDiff()); - return project != null && project.isAccessible(); - } - - protected boolean targetExists(IStorage storage) { - IFile file= (IFile)storage; - return file != null && file.isAccessible(); - } - - protected List getLines(IStorage storage, boolean create) { - IFile file= getTargetFile(); - List lines = LineReader.load(file, create); - return lines; - } - - protected Patcher getPatcher() { - return Patcher.getPatcher(getConfiguration()); - } - - public IFile getTargetFile() { - return getPatcher().getTargetFile(getDiff()); - } - - public void refresh() { - refresh(Utilities.getReaderCreator(getTargetFile()), null); - } - - public String getCharset() { - IFile file = getTargetFile(); - try { - if (file != null) - return file.getCharset(); - } catch (CoreException e) { - } - return ResourcesPlugin.getEncoding(); - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/WorkspacePatcher.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/WorkspacePatcher.java deleted file mode 100644 index 0699d116c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/WorkspacePatcher.java +++ /dev/null @@ -1,382 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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.internal.patch; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.compare.internal.core.Messages; -import org.eclipse.compare.internal.core.patch.DiffProject; -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.compare.internal.core.patch.Hunk; -import org.eclipse.compare.internal.core.patch.PatchReader; -import org.eclipse.compare.patch.IHunk; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IProjectDescription; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IResourceRuleFactory; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.SubProgressMonitor; -import org.eclipse.core.runtime.jobs.ISchedulingRule; -import org.eclipse.core.runtime.jobs.MultiRule; - -/** - * A Patcher - * - knows how to parse various patch file formats into some in-memory structure, - * - holds onto the parsed data and the options to use when applying the patches, - * - knows how to apply the patches to files and folders. - */ -public class WorkspacePatcher extends Patcher { - - private DiffProject[] fDiffProjects; - private boolean fIsWorkspacePatch= false; - private final Map retargetedDiffs = new HashMap(); - - public WorkspacePatcher() { - // nothing to do - } - - public WorkspacePatcher(IResource target) { - setTarget(target); - } - - protected void patchParsed(PatchReader patchReader) { - super.patchParsed(patchReader); - fDiffProjects = patchReader.getDiffProjects(); - fIsWorkspacePatch = patchReader.isWorkspacePatch(); - } - - public DiffProject[] getDiffProjects() { - return fDiffProjects; - } - - public boolean isWorkspacePatch() { - return fIsWorkspacePatch; - } - - //---- parsing patch files - - public void applyAll(IProgressMonitor pm, IFileValidator validator) throws CoreException { - if (!fIsWorkspacePatch) { - super.applyAll(pm, validator); - } else { - final int WORK_UNIT= 10; - - // get all files to be modified in order to call validateEdit - List list= new ArrayList(); - for (int j= 0; j < fDiffProjects.length; j++) { - DiffProject diffProject= fDiffProjects[j]; - if (Utilities.getProject(diffProject).isAccessible()) - list.addAll(Arrays.asList(getTargetFiles(diffProject))); - } - // validate the files for editing - if (!validator.validateResources((IFile[])list.toArray(new IFile[list.size()]))) { - return; - } - - FilePatch2[] diffs = getDiffs(); - if (pm != null) { - String message= Messages.WorkspacePatcher_0; - pm.beginTask(message, diffs.length * WORK_UNIT); - } - - for (int i= 0; i < diffs.length; i++) { - - int workTicks= WORK_UNIT; - - FilePatch2 diff= diffs[i]; - if (isAccessible(diff)) { - IFile file= getTargetFile(diff); - IPath path= file.getProjectRelativePath(); - if (pm != null) - pm.subTask(path.toString()); - createPath(file.getProject(), path); - - List failed= new ArrayList(); - - int type= diff.getDiffType(isReversed()); - switch (type) { - case FilePatch2.ADDITION : - // patch it and collect rejected hunks - List result= apply(diff, file, true, failed); - if (result != null) - store(LineReader.createString(isPreserveLineDelimeters(), result), file, new SubProgressMonitor(pm, workTicks)); - workTicks -= WORK_UNIT; - break; - case FilePatch2.DELETION : - file.delete(true, true, new SubProgressMonitor(pm, workTicks)); - workTicks -= WORK_UNIT; - break; - case FilePatch2.CHANGE : - // patch it and collect rejected hunks - result= apply(diff, file, false, failed); - if (result != null) - store(LineReader.createString(isPreserveLineDelimeters(), result), file, new SubProgressMonitor(pm, workTicks)); - workTicks -= WORK_UNIT; - break; - } - - if (isGenerateRejectFile() && failed.size() > 0) { - IPath pp= null; - if (path.segmentCount() > 1) { - pp= path.removeLastSegments(1); - pp= pp.append(path.lastSegment() + REJECT_FILE_EXTENSION); - } else - pp= new Path(path.lastSegment() + REJECT_FILE_EXTENSION); - file= createPath(file.getProject(), pp); - if (file != null) { - store(getRejected(failed), file, pm); - try { - IMarker marker= file.createMarker(MARKER_TYPE); - marker.setAttribute(IMarker.MESSAGE, Messages.WorkspacePatcher_1); - marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH); - } catch (CoreException ex) { - // NeedWork - } - } - } - } - - if (pm != null) { - if (pm.isCanceled()) - break; - if (workTicks > 0) - pm.worked(workTicks); - } - } - } - } - - private boolean isAccessible(FilePatch2 diff) { - return isEnabled(diff) && Utilities.getProject(diff.getProject()).isAccessible(); - } - - /** - * Returns the target files of all the Diffs contained by this - * DiffProject. - * @param project - * @return An array of IFiles that are targeted by the Diffs - */ - public IFile[] getTargetFiles(DiffProject project) { - List files= new ArrayList(); - FilePatch2[] diffs = project.getFileDiffs(); - for (int i = 0; i < diffs.length; i++) { - FilePatch2 diff = diffs[i]; - if (isEnabled(diff)) { - files.add(getTargetFile(diff)); - } - } - return (IFile[]) files.toArray(new IFile[files.size()]); - } - - public IFile getTargetFile(FilePatch2 diff) { - IPath path = diff.getStrippedPath(getStripPrefixSegments(), isReversed()); - DiffProject project = getProject(diff); - if (project != null) - return Utilities.getProject(project).getFile(path); - return super.getTargetFile(diff); - } - - private IPath getFullPath(FilePatch2 diff) { - IPath path = diff.getStrippedPath(getStripPrefixSegments(), isReversed()); - DiffProject project = getProject(diff); - if (project != null) - return Utilities.getProject(project).getFile(path).getFullPath(); - return getTarget().getFullPath().append(path); - } - - public ISchedulingRule[] getTargetProjects() { - List projects= new ArrayList(); - IResourceRuleFactory ruleFactory= ResourcesPlugin.getWorkspace().getRuleFactory(); - // Determine the appropriate scheduling rules - for (int i= 0; i < fDiffProjects.length; i++) { - IProject tempProject= Utilities.getProject(fDiffProjects[i]); - // The goal here is to lock as little of the workspace as necessary - // but still allow the patcher to obtain the locks it needs. - // As such, we need to get the modify rules from the rule factory for the .project file. A pessimistic - // rule factory will return the root, while others might return just the project. Combining - // this rule with the project will result in the smallest possible locking set. - ISchedulingRule scheduleRule= ruleFactory.modifyRule(tempProject.getFile(IProjectDescription.DESCRIPTION_FILE_NAME)); - MultiRule multiRule= new MultiRule(new ISchedulingRule[] { scheduleRule, tempProject } ); - projects.add(multiRule); - } - - return (ISchedulingRule[]) projects.toArray(new ISchedulingRule[projects.size()]); - } - - public void setDiffProjects(DiffProject[] newProjectArray) { - fDiffProjects = new DiffProject[newProjectArray.length]; - System.arraycopy(newProjectArray,0, fDiffProjects, 0, newProjectArray.length); - } - - public void removeProject(DiffProject project) { - DiffProject[] temp = new DiffProject[fDiffProjects.length - 1]; - int counter = 0; - for (int i = 0; i < fDiffProjects.length; i++) { - if (fDiffProjects[i] != project){ - temp[counter++] = fDiffProjects[i]; - } - } - fDiffProjects = temp; - } - - protected Object getElementParent(Object element) { - if (element instanceof FilePatch2 && fDiffProjects != null) { - FilePatch2 diff = (FilePatch2) element; - for (int i = 0; i < fDiffProjects.length; i++) { - DiffProject project = fDiffProjects[i]; - if (project.contains(diff)) - return project; - } - } - return null; - } - - public boolean isRetargeted(Object object) { - return retargetedDiffs.containsKey(object); - } - - public IPath getOriginalPath(Object object) { - return (IPath)retargetedDiffs.get(object); - } - - public void retargetDiff(FilePatch2 diff, IFile file) { - retargetedDiffs.put(diff, diff.getPath(false)); - IHunk[] hunks = diff.getHunks(); - - if (isWorkspacePatch()){ - //since the diff has no more hunks to apply, remove it from the parent and the patcher - diff.getProject().remove(diff); - } - removeDiff(diff); - FilePatch2 newDiff = getDiffForFile(file); - for (int i = 0; i < hunks.length; i++) { - Hunk hunk = (Hunk) hunks[i]; - newDiff.add(hunk); - } - } - - private FilePatch2 getDiffForFile(IFile file) { - DiffProject diffProject = null; - FilePatch2[] diffsToCheck; - if (isWorkspacePatch()){ - // Check if the diff project already exists for the file - IProject project = file.getProject(); - DiffProject[] diffProjects = getDiffProjects(); - for (int i = 0; i < diffProjects.length; i++) { - if (Utilities.getProject(diffProjects[i]).equals(project)){ - diffProject = diffProjects[i]; - break; - } - } - // If the project doesn't exist yet, create it and add it to the project list - if (diffProject == null){ - diffProject = addDiffProjectForProject(project); - } - diffsToCheck = diffProject.getFileDiffs(); - } else { - diffsToCheck = getDiffs(); - } - // Check to see if a diff already exists for the file - for (int i = 0; i < diffsToCheck.length; i++) { - FilePatch2 fileDiff = diffsToCheck[i]; - if (isDiffForFile(fileDiff, file)) { - return fileDiff; - } - } - - // Create a new diff for the file - IPath path = getDiffPath(file); - FilePatch2 newDiff = new FilePatch2(path, 0, path, 0); - if (diffProject != null){ - diffProject.add(newDiff); - } - addDiff(newDiff); - return newDiff; - } - - private IPath getDiffPath(IFile file) { - DiffProject project = getDiffProject(file.getProject()); - if (project != null) { - return file.getProjectRelativePath(); - } - return file.getFullPath().removeFirstSegments(getTarget().getFullPath().segmentCount()); - } - - private boolean isDiffForFile(FilePatch2 fileDiff, IFile file) { - return getFullPath(fileDiff).equals(file.getFullPath()); - } - - private DiffProject addDiffProjectForProject(IProject project) { - DiffProject[] diffProjects = getDiffProjects(); - DiffProject diffProject = new DiffProject(project.getName()); - DiffProject[] newProjectArray = new DiffProject[diffProjects.length + 1]; - System.arraycopy(diffProjects, 0, newProjectArray, 0, diffProjects.length); - newProjectArray[diffProjects.length] = diffProject; - setDiffProjects(newProjectArray); - return diffProject; - } - - public void retargetHunk(Hunk hunk, IFile file) { - FilePatch2 newDiff = getDiffForFile(file); - newDiff.add(hunk); - } - - public void retargetProject(DiffProject project, IProject targetProject) { - retargetedDiffs.put(project, Utilities.getProject(project).getFullPath()); - FilePatch2[] diffs = project.getFileDiffs(); - DiffProject selectedProject = getDiffProject(targetProject); - if (selectedProject == null) - selectedProject = addDiffProjectForProject(targetProject); - // Copy over the diffs to the new project - for (int i = 0; i < diffs.length; i++) { - selectedProject.add(diffs[i]); - } - // Since the project has been retargeted, remove it from the patcher - removeProject(project); - } - - /** - * Return the diff project for the given project - * or <code>null</code> if the diff project doesn't exist - * or if the patch is not a workspace patch. - * @param project the project - * @return the diff project for the given project - * or <code>null</code> - */ - private DiffProject getDiffProject(IProject project) { - if (!isWorkspacePatch()) - return null; - DiffProject[] projects = getDiffProjects(); - for (int i = 0; i < projects.length; i++) { - if (Utilities.getProject(projects[i]).equals(project)) - return projects[i]; - } - return null; - } - - public int getStripPrefixSegments() { - // Segments are never stripped from a workspace patch - if (isWorkspacePatch()) - return 0; - return super.getStripPrefixSegments(); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/package.html b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/package.html deleted file mode 100644 index 96ffb6342..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/package.html +++ /dev/null @@ -1,113 +0,0 @@ -<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> - <meta name="Author" content="IBM"> - <meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]"> - <title>Package-level Javadoc</title> -</head> -<body> -Provides support for performing structural and textual -compare operations on arbitrary data and displaying the results. -<h2> -Package Specification</h2> - -The class <b>CompareUI</b> defines the entry point to initiate a configurable -compare operation on arbitrary resources. The result of the compare is -opened into a compare editor where the details can be browsed and edited -in dynamically selected structure and content viewers. -<p> - -A compare operation must be implemented as a subclass of <b>CompareEditorInput</b>. -A <b>CompareEditorInput</b> runs a (potentially lengthy) compare operation -under progress monitor control, creates a UI for drilling-down into the -compare results, tracks the dirty state of the result in case of merge, -and saves any changes that occured during a merge. -<p> - -The <b>NavigationAction</b> is used to navigate (step) through the individual -differences of a <b>CompareEditorInput</b>. -<p> - -An instance of <b>CompareConfiguration</b> configures various UI aspects -of compare/merge viewers like title labels and images, or whether a side -of a merge viewer is editable. It is passed to the <b>CompareEditorInput</b> -on creation. -<p> - -When implementing a hierarchical compare operation as a subclass of -<b>CompareEditorInput</b> clients have to provide a tree of objects where each -node implements the interface -<b>org.eclipse.compare.structuremergeviewer.IStructureComparator</b>. -This interface is used by the hierarchical differencing engine -(<b>org.eclipse.compare.structuremergeviewer.Differencer</b>) to walk the tree. -<br> -In addition every leaf of the tree must implement the <b>IStreamContentAccessor</b> -or <b>IEncodedStreamContentAccessor</b> -interfaces in order to give the differencing engine access to its stream content -and to its encoding (with IEncodedStreamContentAccessor). -<p> - -The abstract class <b>BufferedContent</b> provides a default implementation -for the <b>IStreamContentAccessor</b> and <b>IContentChangeNotifier</b> interfaces. -Its subclass <b>ResourceNode</b> adds an implementation for the -<b>IStructureComparator</b> and <b>ITypedElement</b> interfaces -based on Eclipse workbench resources (org.eclipse.core.resources.IResource). -It can be used without modification as the input to the differencing engine. -<p> - -The <b>ZipFileStructureCreator</b> is an implementation of the -<b>org.eclipse.compare.structuremergeviewer.IStructureCreator</b> interface -and makes the contents of a zip archive available as a -hierarchical structure of <b>IStructureComparator</b>s which can be easily compared -by the differencing engine (<b>org.eclipse.compare.structuremergeviewer.Differencer</b>). -It is a good example for how to make structured files available to the hierarchical -compare functionality of the Compare plugin. -<p> - -The <b>EditionSelectionDialog</b> is a simple selection dialog where -one input element can be compared against a list of historic variants (<i>editions</i>) -of the same input element. The dialog can be used to implement functions -like <i>"Replace with Version"</i> or <i>"Replace with Edition"</i> on workbench resources. -<p> - -In addition it is possible to specify a subsection of the input element -(e.g. a method in a Java source file) by means of a <i>path</i>. In this -case the dialog compares only the subsection (as specified by the path) -with the corresponding subsection in the list of editions. This functionality -can be used to implement <i>"Replace with Method Edition"</i> for the Java -language. -<p> - -The <b>EditionSelectionDialog</b> requires that the editions implement -the <b>IStreamContentAccessor</b> and <b>IModificationDate</b> interfaces. -The <b>HistoryItem</b> is a convenience class that implements these interfaces -for <b>IFileState</b> objects. -<p> - - -The <b>CompareViewerPane</b> is a convenience class which provides -a label and local toolbar for a compare viewer (or any other subclass of a -JFace <b>Viewer</b>). -<br> -Its abstract subclass <b>CompareViewerSwitchingPane</b> supports <i>dynamic -viewer switching</i>, that is the viewer installed in the pane is dynamically -determined by the pane's input object. -Both classes are useful if you want to use compare viewers outside the context of -a compare editor, for example in a dialog or wizard. -<p> - -A <b>Splitter</b> is an extension of a SashForm that supports nesting, maximizing of panes, -and propagating the visibility state of panes. -<p> - -The interface <b>IStreamMerger</b> defines a single operation for performing a three-way merge on three -input streams. The merged result is written to an output stream. -<br> -Clients must implement this interface when contributing new mergers to the -<code>org.eclipse.compare.streamMergers</code> extension point. -New <b>IStreamMerger</b>s can be created for registered types with the createStreamMerger methods of CompareUI. - - -</body> -</html> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/patch/ApplyPatchOperation.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/patch/ApplyPatchOperation.java deleted file mode 100644 index 3cc73973c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/patch/ApplyPatchOperation.java +++ /dev/null @@ -1,234 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 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.patch; - -import java.io.BufferedReader; -import java.io.IOException; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.internal.ComparePreferencePage; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.core.patch.FilePatch2; -import org.eclipse.compare.internal.core.patch.PatchReader; -import org.eclipse.compare.internal.patch.FilePatch; -import org.eclipse.compare.internal.patch.PatchWizard; -import org.eclipse.compare.internal.patch.PatchWizardDialog; -import org.eclipse.compare.internal.patch.Utilities; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IStorage; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.ide.IDE; - -/** - * An operation that provides an interface to the Apply Patch Wizard. Users specify - * the input in terms of an <code>IStorage</code> (note: input must be in unified diff - * format), an <code>IResource</code> target to apply the patch to and can provide <code>CompareConfiguration</code> - * elements to supply the label and images used on the preview page and hunk merge page. Finally, the - * user can also supply a title and image to override the default ones provided by the Apply Patch Wizard. - * Note that the Apply Patch Wizard does not require any particular set of inputs, and in the absence of - * any user supplied values, it will work in default mode. - * - * @since 3.3 - * - */ -public class ApplyPatchOperation implements Runnable { - - private IWorkbenchPart part; - - /** - * Used for the Preview Patch page. - */ - private CompareConfiguration configuration; - - /** - * The patch to use as an input into the Apply Patch wizard - */ - private IStorage patch; - - /** - * Specific <code>IResource</code> target to patch. - */ - private IResource target; - - /** - * An optional image for the patch wizard - */ - private ImageDescriptor patchWizardImage; - - - /** - * An optional title for the patchWizard - */ - private String patchWizardTitle; - - private boolean saveAllEditors = true; - - /** - * Return whether the given storage contains a patch. - * @param storage the storage - * @return whether the given storage contains a patch - * @throws CoreException if an error occurs reading the contents from the storage - */ - public static boolean isPatch(IStorage storage) throws CoreException { - return internalParsePatch(storage).length > 0; - } - - /** - * Parse the given patch and return the set of file patches that it contains. - * @param storage the storage that contains the patch - * @return the set of file patches that the storage contains - * @throws CoreException if an error occurs reading the contents from the storage - */ - public static IFilePatch[] parsePatch(IStorage storage) throws CoreException { - return internalParsePatch(storage); - } - - /** - * Creates a new ApplyPatchOperation with the supplied compare configuration, patch and target. - * The behaviour of the Apply Patch wizard is controlled by the number of parameters supplied: - * <ul> - * <li>If a patch is supplied, the initial input page is skipped. If a patch is not supplied the wizard - * will open on the input page.</li> - * <li>If the patch is a workspace patch, the target selection page is skipped and the preview page is - * displayed.</li> - * <li>If the patch is not a workspace patch and the target is specified, the target page is still - * shown with the target selected.</li> - * </ul> - * - * @param part an IWorkbenchPart or <code>null</code> - * @param patch an IStorage containing a patch in unified diff format or <code>null</code> - * @param target an IResource which the patch is to be applied to or <code>null</code> - * @param configuration a CompareConfiguration supplying the labels and images for the preview patch page - */ - public ApplyPatchOperation(IWorkbenchPart part, IStorage patch, IResource target, CompareConfiguration configuration) { - Assert.isNotNull(configuration); - this.part = part; - this.patch = patch; - this.target = target; - this.configuration = configuration; - } - - /** - * Create an operation for the given part and resource. This method is a convenience - * method that calls {@link #ApplyPatchOperation(IWorkbenchPart, IStorage, IResource, CompareConfiguration)} - * with appropriate defaults for the other parameters. - * @param targetPart an IResource which the patch is to be applied to or <code>null</code> - * @param resource an IResource which the patch is to be applied to or <code>null</code> - * @see #ApplyPatchOperation(IWorkbenchPart, IStorage, IResource, CompareConfiguration) - */ - public ApplyPatchOperation(IWorkbenchPart targetPart, IResource resource) { - this(targetPart, null, resource, new CompareConfiguration()); - } - - /** - * Open the Apply Patch wizard using the values associated with this operation. - * This method must be called from the UI thread. - */ - public void openWizard() { - saveAllEditors(); - - if (saveAllEditors) { - PatchWizard wizard = new PatchWizard(patch, target, configuration); - if (patchWizardImage != null) - wizard.setDefaultPageImageDescriptor(patchWizardImage); - if (patchWizardTitle != null) - wizard.setWindowTitle(patchWizardTitle); - wizard.setNeedsProgressMonitor(true); - - new PatchWizardDialog(getShell(), wizard).open(); - } - } - - /** - * Return the parent shell to be used when the wizard is opened. - * By default, the site of the part is used to get the shell. - * Subclasses may override. - * @return the parent shell to be used when the wizard is opened - */ - protected Shell getShell() { - if (part == null) - return CompareUIPlugin.getShell(); - return part.getSite().getShell(); - } - - /** - * This method will save all dirty editors. It will prompt the user if the Compare preference to save - * dirty editors before viewing a patch is <code>false</code>. Clients can use this or provide their own - * implementation. - */ - protected void saveAllEditors(){ - saveAllEditors = IDE.saveAllEditors(new IResource[]{ResourcesPlugin.getWorkspace().getRoot()}, !ComparePreferencePage.getSaveAllEditors()); - } - - /** - * Sets the title of the patch wizard. Needs to be set before {@link #openWizard()} is called. - * @param title a string to display in the title bar - */ - public void setPatchWizardTitle(String title){ - this.patchWizardTitle = title; - } - - /** - * Sets the image descriptor to use in the patch wizard. Needs to be set before {@link #openWizard()} is called. - * @param descriptor an image descriptor - */ - public void setPatchWizardImageDescriptor(ImageDescriptor descriptor){ - this.patchWizardImage = descriptor; - } - - /* (non-Javadoc) - * @see java.lang.Runnable#run() - */ - public void run() { - openWizard(); - } - - private static IFilePatch[] internalParsePatch(IStorage storage) - throws CoreException { - BufferedReader reader = Utilities.createReader(storage); - try { - PatchReader patchReader = new PatchReader() { - protected FilePatch2 createFileDiff(IPath oldPath, long oldDate, - IPath newPath, long newDate) { - return new FilePatch(oldPath, oldDate, newPath, - newDate); - } - }; - patchReader.parse(reader); - FilePatch2[] fileDiffs = patchReader.getAdjustedDiffs(); - - IFilePatch[] filePatch = new IFilePatch[fileDiffs.length]; - for (int i = 0; i < fileDiffs.length; i++) { - filePatch[i] = (FilePatch) fileDiffs[i]; - } - - return filePatch; - } catch (IOException e) { - throw new CoreException(new Status(IStatus.ERROR, - CompareUIPlugin.PLUGIN_ID, 0, e.getMessage(), e)); - } finally { - try { - reader.close(); - } catch (IOException e) { // ignored - } - } - } - - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/patch/IFilePatch.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/patch/IFilePatch.java deleted file mode 100644 index f1377392e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/patch/IFilePatch.java +++ /dev/null @@ -1,86 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 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.patch; - -import org.eclipse.core.resources.IStorage; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; - -/** - * A representation of a file patch that can be applied to an input stream. - * - * @see ApplyPatchOperation#parsePatch(org.eclipse.core.resources.IStorage) - * @since 3.3 - * @noimplement This interface is not intended to be implemented by clients. - * Clients can obtain file patches by calling - * {@link ApplyPatchOperation#parsePatch(org.eclipse.core.resources.IStorage)}. - */ -public interface IFilePatch extends IFilePatch2 { - - /** - * Special constant that will be returned from get getBeforeDate() or - * getAfterDate() if the date is unknown. Equal to Midnight, Jan 1, 1970 - * GMT. - * - * @since 3.4 - */ - public static long DATE_UNKNOWN = 0; - - /** - * Return the target path for this patch. The target path may differ - * depending on whether the patch is being reversed or not. - * - * @param configuration the patch configuration - * @return the target path for this patch - * @see PatchConfiguration#isReversed() - */ - public IPath getTargetPath(PatchConfiguration configuration); - - /** - * Apply this patch to the given file contents. The result provides the - * original and patch contents and also indicates whether some portions of - * the patch (called hunks) failed to apply. - * - * @param contents the file contents - * @param configuration the patch configuration - * @param monitor a progress monitor - * @return the result of the patch application - */ - public IFilePatchResult apply(IStorage contents, - PatchConfiguration configuration, IProgressMonitor monitor); - - /** - * Return the header information of the patch or - * <code>null</code> if there was no header text. - * The header may be multi-line. - * @return the header information of the patch or - * <code>null</code> - */ - public String getHeader(); - - /** - * Returns the milliseconds time value of the before date from the patch, or - * DATE_UNKNOWN if the date is unknown. - * - * @return milliseconds time value of the before date from the patch - * @since 3.4 - */ - public long getBeforeDate(); - - /** - * Returns the milliseconds time value of the after date from the patch, or - * DATE_UNKNOWN if the date is unknown. - * - * @return milliseconds time value of the after date from the patch - * @since 3.4 - */ - public long getAfterDate(); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/patch/WorkspacePatcherUI.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/patch/WorkspacePatcherUI.java deleted file mode 100644 index d19688b08..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/patch/WorkspacePatcherUI.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 2008 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.patch; - -import org.eclipse.compare.internal.core.patch.PatchReader; -import org.eclipse.core.resources.IProject; - -/** - * Provides the headers required to create a workspace patch. - * @since 3.2 - * @noinstantiate This class is not intended to be instantiated by clients. - * @noextend This class is not intended to be subclassed by clients. - */ -public class WorkspacePatcherUI { - /** - * Returns a string that must be the first line of a workspace patch (a multi-project patch - * that is understood by the Apply Patch wizard). Each project to be included in the patch - * must be prefixed by the line obtained from the <code>getWorkspacePatchProjectHeader()</code>. - * This snippet outlines how the a workspace patch is to be created: - * <pre> - * //Write out workspace patch header - * stream.println(CompareUI.getWorkspacePatchHeader()); - * for (int i=0; i<projects.length; i++){ - * //Write out project header - * stream.println(CompareUI.getWorkspacePatchProjectHeader(projects[i]); - * //Write out patches in Unified Diff format - * } - * </pre> - * @return String - * @see WorkspacePatcherUI#getWorkspacePatchProjectHeader(IProject) - * @since 3.2 - */ - public static String getWorkspacePatchHeader() { - return PatchReader.MULTIPROJECTPATCH_HEADER+" "+PatchReader.MULTIPROJECTPATCH_VERSION; //$NON-NLS-1$ - } - - /** - * Returns the project header that must appear before any patches that apply to that - * project. All patches that are encountered after this header and before the next header - * are understood to belong the the project. - * @param project project to be patched - * @return String - * @see WorkspacePatcherUI#getWorkspacePatchHeader() - * @since 3.2 - */ - public static String getWorkspacePatchProjectHeader(IProject project) { - return PatchReader.MULTIPROJECTPATCH_PROJECT+" "+ project.getName(); //$NON-NLS-1$ - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffContainer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffContainer.java deleted file mode 100644 index 78ca3588c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffContainer.java +++ /dev/null @@ -1,107 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.util.ArrayList; - -/** - * The standard implementation of a diff container element. - * <p> - * This class may be instantiated, or further subclassed. - * </p> - */ -public abstract class DiffContainer extends DiffElement implements IDiffContainer { - - private static IDiffElement[] fgEmptyArray= new IDiffElement[0]; - private ArrayList fChildren; - - /** - * Creates a new container with the specified kind under the given parent. - * - * @param parent under which the new container is added as a child or <code>null</code>. - * @param kind of difference (defined in <code>Differencer</code>). - */ - public DiffContainer(IDiffContainer parent, int kind) { - super(parent, kind); - } - - /** - * Tries to find the child with the given name. - * Returns <code>null</code> if no such child exists. - * - * @param name of the child to find - * @return the first element with a matching name - */ - public IDiffElement findChild(String name) { - Object[] children= getChildren(); - for (int i= 0; i < children.length; i++) { - IDiffElement child= (IDiffElement) children[i]; - if (name.equals(child.getName())) - return child; - } - return null; - } - - /* (non Javadoc) - * see IDiffContainer.add - */ - public void add(IDiffElement diff) { - if (fChildren == null) - fChildren= new ArrayList(); - fChildren.add(diff); - diff.setParent(this); - } - - /* - * Removes the given child from this container. - * If the container becomes empty it is removed from its container. - */ - public void removeToRoot(IDiffElement child) { - if (fChildren != null) { - fChildren.remove(child); - child.setParent(null); - if (fChildren.size() == 0) { - IDiffContainer p= getParent(); - if (p != null) - p.removeToRoot(this); - } - } - } - - /** - * Removes the given child (non-recursively) from this container. - * - * @param child to remove - */ - public void remove(IDiffElement child) { - if (fChildren != null) { - fChildren.remove(child); - child.setParent(null); - } - } - - /* (non Javadoc) - * see IDiffContainer.hasChildren - */ - public boolean hasChildren() { - return fChildren != null && fChildren.size() > 0; - } - - /* (non Javadoc) - * see IDiffContainer.getChildren - */ - public IDiffElement[] getChildren() { - if (fChildren != null) - return (IDiffElement[]) fChildren.toArray(fgEmptyArray); - return fgEmptyArray; - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffElement.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffElement.java deleted file mode 100644 index e4c309e06..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffElement.java +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.swt.graphics.Image; -import org.eclipse.compare.ITypedElement; - -/** - * An abstract base implementation of the <code>IDiffElement</code> interface. - * <p> - * Subclasses may add behavior and state, and may override <code>getImage</code> - * and <code>getType</code> to suit. - * </p> - */ -public abstract class DiffElement implements IDiffElement { - - private int fKind; - private IDiffContainer fParent; - - /** - * Creates a new <code>DiffElement</code> as a child of the given parent. - * If parent is not <code>null</code> the new element is added to the parent. - * - * @param parent the parent of this child; if not <code>null</code> this element is automatically added as a child - * @param kind the kind of change - */ - public DiffElement(IDiffContainer parent, int kind) { - fParent= parent; - fKind= kind; - if (parent != null) - parent.add(this); - } - - /** - * The <code>DiffElement</code> implementation of this <code>ITypedInput</code> - * method returns <code>null</code>. Subclasses may re-implement to provide - * an image for this element. - * @return <code>null</code>. - */ - public Image getImage() { - return null; - } - - /** - * The <code>DiffElement</code> implementation of this <code>ITypedElement</code> - * method returns <code>ITypedElement.UNKNOWN_TYPE</code>. Subclasses may - * re-implement to provide a type for this element. - * @return <code>ITypedElement.UNKNOWN_TYPE</code>. - */ - public String getType() { - return ITypedElement.UNKNOWN_TYPE; - } - - /** - * Sets the kind of difference for this element. - * - * @param kind set the kind of difference this element represents - * @see Differencer - */ - public void setKind(int kind) { - fKind= kind; - } - - /* (non Javadoc) - * see IDiffElement.getKind - */ - public int getKind() { - return fKind; - } - - /* (non Javadoc) - * see IDiffElement.getParent - */ - public IDiffContainer getParent() { - return fParent; - } - - /* (non Javadoc) - * see IDiffElement.setParent - */ - public void setParent(IDiffContainer parent) { - fParent= parent; - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffNode.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffNode.java deleted file mode 100644 index c9ee82d77..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffNode.java +++ /dev/null @@ -1,364 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2010 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 org.eclipse.compare.IEditableContent; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.swt.graphics.Image; - -import com.ibm.icu.text.MessageFormat; - -/** - * Diff node are used as the compare result of the differencing engine. - * Since it implements the <code>ITypedElement</code> and <code>ICompareInput</code> - * interfaces it can be used directly to display the - * compare result in a <code>DiffTreeViewer</code> and as the input to any other - * compare/merge viewer. - * <p> - * <code>DiffNode</code>s are typically created as the result of performing - * a compare with the <code>Differencer</code>. - * <p> - * Clients typically use this class as is, but may subclass if required. - * - * @see DiffTreeViewer - * @see Differencer - */ -public class DiffNode extends DiffContainer implements ICompareInput { - - private ITypedElement fAncestor; - private ITypedElement fLeft; - private ITypedElement fRight; - private boolean fDontExpand; - private ListenerList fListener; - private boolean fSwapSides; - - - /** - * Creates a new <code>DiffNode</code> and initializes with the given values. - * - * @param parent under which the new container is added as a child or <code>null</code> - * @param kind of difference (defined in <code>Differencer</code>) - * @param ancestor the common ancestor input to a compare - * @param left the left input to a compare - * @param right the right input to a compare - */ - public DiffNode(IDiffContainer parent, int kind, ITypedElement ancestor, ITypedElement left, ITypedElement right) { - this(parent, kind); - fAncestor= ancestor; - fLeft= left; - fRight= right; - } - - /** - * Creates a new <code>DiffNode</code> with diff kind <code>Differencer.CHANGE</code> - * and initializes with the given values. - * - * @param left the left input to a compare - * @param right the right input to a compare - */ - public DiffNode(ITypedElement left, ITypedElement right) { - this(null, Differencer.CHANGE, null, left, right); - } - - /** - * Creates a new <code>DiffNode</code> and initializes with the given values. - * - * @param kind of difference (defined in <code>Differencer</code>) - * @param ancestor the common ancestor input to a compare - * @param left the left input to a compare - * @param right the right input to a compare - */ - public DiffNode(int kind, ITypedElement ancestor, ITypedElement left, ITypedElement right) { - this(null, kind, ancestor, left, right); - } - - /** - * Creates a new <code>DiffNode</code> with the given diff kind. - * - * @param kind of difference (defined in <code>Differencer</code>) - */ - public DiffNode(int kind) { - super(null, kind); - } - - /** - * Creates a new <code>DiffNode</code> and initializes with the given values. - * - * @param parent under which the new container is added as a child or <code>null</code> - * @param kind of difference (defined in <code>Differencer</code>) - */ - public DiffNode(IDiffContainer parent, int kind) { - super(parent, kind); - } - - /** - * Registers a listener for changes of this <code>ICompareInput</code>. - * Has no effect if an identical listener is already registered. - * - * @param listener the listener to add - */ - public void addCompareInputChangeListener(ICompareInputChangeListener listener) { - if (fListener == null) - fListener= new ListenerList(); - fListener.add(listener); - } - - /** - * Unregisters a <code>ICompareInput</code> listener. - * Has no effect if listener is not registered. - * - * @param listener the listener to remove - */ - public void removeCompareInputChangeListener(ICompareInputChangeListener listener) { - if (fListener != null) { - fListener.remove(listener); - if (fListener.isEmpty()) - fListener= null; - } - } - - /** - * Sends out notification that a change has occurred on the <code>ICompareInput</code>. - */ - protected void fireChange() { - if (fListener != null) { - Object[] listeners= fListener.getListeners(); - for (int i= 0; i < listeners.length; i++) - ((ICompareInputChangeListener) listeners[i]).compareInputChanged(this); - } - } - - //---- getters & setters - - /** - * Returns <code>true</code> if this node shouldn't automatically be expanded in - * a </code>DiffTreeViewer</code>. - * - * @return <code>true</code> if node shouldn't automatically be expanded - */ - public boolean dontExpand() { - return fDontExpand; - } - - /** - * Controls whether this node is not automatically expanded when displayed in - * a </code>DiffTreeViewer</code>. - * - * @param dontExpand if <code>true</code> this node is not automatically expanded in </code>DiffTreeViewer</code> - */ - public void setDontExpand(boolean dontExpand) { - fDontExpand= dontExpand; - } - - /** - * Returns the first not-<code>null</code> input of this node. - * Method checks the three inputs in the order: ancestor, right, left. - * - * @return the first not-<code>null</code> input of this node - */ - public ITypedElement getId() { - if (fAncestor != null) - return fAncestor; - if (fRight != null) - return fRight; - return fLeft; - } - - /** - * Returns the (non-<code>null</code>) name of the left or right side if they are identical. - * Otherwise both names are concatenated (separated with a slash ('/')). - * <p> - * Subclasses may re-implement to provide a different name for this node. - * @return the name of this node. - */ - public String getName() { - String right= null; - if (fRight != null) - right= fRight.getName(); - - String left= null; - if (fLeft != null) - left= fLeft.getName(); - - if (right == null && left == null) { - if (fAncestor != null) - return fAncestor.getName(); - return Utilities.getString("DiffNode.noName"); //$NON-NLS-1$ - } - - if (right == null) - return left; - if (left == null) - return right; - - if (right.equals(left)) - return right; - - String s1; - String s2; - - if (fSwapSides) { - s1= left; - s2= right; - } else { - s1= right; - s2= left; - } - - String fmt= Utilities.getString("DiffNode.nameFormat"); //$NON-NLS-1$ - return MessageFormat.format(fmt, new String[] { s1, s2 }); - } - - void swapSides(boolean swap) { - fSwapSides= swap; - } - - /* (non Javadoc) - * see ITypedElement.getImage - */ - public Image getImage() { - ITypedElement id= getId(); - if (id != null) - return id.getImage(); - return null; - } - - /* (non Javadoc) - * see ITypedElement.getType - */ - public String getType() { - ITypedElement id= getId(); - if (id != null) - return id.getType(); - return ITypedElement.UNKNOWN_TYPE; - } - - /** - * Sets the ancestor input to the given value. - * - * @param ancestor the new value for the ancestor input - * @since 3.0 - */ - public void setAncestor(ITypedElement ancestor) { - fAncestor= ancestor; - } - - /* (non Javadoc) - * see ICompareInput.getAncestor - */ - public ITypedElement getAncestor() { - return fAncestor; - } - - /** - * Sets the left input to the given value. - * - * @param left the new value for the left input - */ - public void setLeft(ITypedElement left) { - fLeft= left; - } - - /* (non Javadoc) - * see ICompareInput.getLeft - */ - public ITypedElement getLeft() { - return fLeft; - } - - /** - * Sets the right input to the given value. - * - * @param right the new value for the right input - */ - public void setRight(ITypedElement right) { - fRight= right; - } - - /* (non Javadoc) - * see ICompareInput.getRight - */ - public ITypedElement getRight() { - return fRight; - } - - /* (non Javadoc) - * see ICompareInput.copy - */ - public void copy(boolean leftToRight) { - //System.out.println("DiffNode.copy: " + leftToRight); - - IDiffContainer pa= getParent(); - if (pa instanceof ICompareInput) { - ICompareInput parent= (ICompareInput) pa; - Object dstParent= leftToRight ? parent.getRight() : parent.getLeft(); - - if (dstParent instanceof IEditableContent) { - ITypedElement dst= leftToRight ? getRight() : getLeft(); - ITypedElement src= leftToRight ? getLeft() : getRight(); - dst= ((IEditableContent)dstParent).replace(dst, src); - if (leftToRight) - setRight(dst); - else - setLeft(dst); - - //setKind(Differencer.NO_CHANGE); - - fireChange(); - } - } - } - - /* (non Javadoc) - * see Object.hashCode - */ - public int hashCode() { - String[] path= getPath(this, 0); - int hashCode= 1; - for (int i= 0; i < path.length; i++) { - String s= path[i]; - hashCode= (31*hashCode) + (s != null ? s.hashCode() : 0); - } - return hashCode; - } - - /* (non Javadoc) - * see Object.equals - */ - public boolean equals(Object other) { - if (other != null && getClass() == other.getClass()) { - String[] path1= getPath(this, 0); - String[] path2= getPath((DiffNode) other, 0); - if (path1.length != path2.length) - return false; - for (int i= 0; i < path1.length; i++) - if (! path1[i].equals(path2[i])) - return false; - return true; - } - return super.equals(other); - } - - private static String[] getPath(ITypedElement el, int level) { - String[] path= null; - if (el instanceof IDiffContainer) { - IDiffContainer parent= ((IDiffContainer)el).getParent(); - if (parent != null) - path= getPath(parent, level+1); - } - if (path == null) - path= new String[level+1]; - path[(path.length-1)-level]= el.getName(); - return path; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java deleted file mode 100644 index 44d9c907e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java +++ /dev/null @@ -1,728 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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.util.Iterator; -import java.util.ResourceBundle; - -import org.eclipse.compare.*; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.internal.patch.DiffViewerComparator; -import org.eclipse.jface.action.*; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.*; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.*; - -/** - * A tree viewer that works on objects implementing - * the <code>IDiffContainer</code> and <code>IDiffElement</code> interfaces. - * <p> - * This class may be instantiated; it is not intended to be subclassed outside - * this package. - * </p> - * - * @see IDiffContainer - * @see IDiffElement - * @noextend This class is not intended to be subclassed by clients. - */ -public class DiffTreeViewer extends TreeViewer { - - class DiffViewerContentProvider implements ITreeContentProvider { - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - // empty implementation - } - - public boolean isDeleted(Object element) { - return false; - } - - public void dispose() { - inputChanged(DiffTreeViewer.this, getInput(), null); - } - - public Object getParent(Object element) { - if (element instanceof IDiffElement) - return ((IDiffElement)element).getParent(); - return null; - } - - public final boolean hasChildren(Object element) { - if (element instanceof IDiffContainer) - return ((IDiffContainer)element).hasChildren(); - return false; - } - - public final Object[] getChildren(Object element) { - if (element instanceof IDiffContainer) - return ((IDiffContainer)element).getChildren(); - return new Object[0]; - } - - public Object[] getElements(Object element) { - return getChildren(element); - } - } - - /* - * Takes care of swapping left and right if fLeftIsLocal - * is true. - */ - class DiffViewerLabelProvider extends LabelProvider { - - public String getText(Object element) { - - if (element instanceof IDiffElement) - return ((IDiffElement)element).getName(); - - return Utilities.getString(fBundle, "defaultLabel"); //$NON-NLS-1$ - } - - public Image getImage(Object element) { - if (element instanceof IDiffElement) { - IDiffElement input= (IDiffElement) element; - - int kind= input.getKind(); - if (fLeftIsLocal) { - switch (kind & Differencer.DIRECTION_MASK) { - case Differencer.LEFT: - kind= (kind &~ Differencer.LEFT) | Differencer.RIGHT; - break; - case Differencer.RIGHT: - kind= (kind &~ Differencer.RIGHT) | Differencer.LEFT; - break; - } - } - - return fCompareConfiguration.getImage(input.getImage(), kind); - } - return null; - } - } - - static class FilterSame extends ViewerFilter { - public boolean select(Viewer viewer, Object parentElement, Object element) { - if (element instanceof IDiffElement) - return (((IDiffElement)element).getKind() & Differencer.PSEUDO_CONFLICT) == 0; - return true; - } - public boolean isFilterProperty(Object element, Object property) { - return false; - } - } - - private ResourceBundle fBundle; - private CompareConfiguration fCompareConfiguration; - /* package */ boolean fLeftIsLocal; - private IPropertyChangeListener fPropertyChangeListener; - - private Action fCopyLeftToRightAction; - private Action fCopyRightToLeftAction; - private Action fEmptyMenuAction; - private Action fExpandAllAction; - - /** - * Creates a new viewer for the given SWT tree control with the specified configuration. - * - * @param tree the tree control - * @param configuration the configuration for this viewer - */ - public DiffTreeViewer(Tree tree, CompareConfiguration configuration) { - super(tree); - initialize(configuration == null ? new CompareConfiguration() : configuration); - } - - /** - * Creates a new viewer under the given SWT parent and with the specified configuration. - * - * @param parent the SWT control under which to create the viewer - * @param configuration the configuration for this viewer - */ - public DiffTreeViewer(Composite parent, CompareConfiguration configuration) { - super(new Tree(parent, SWT.MULTI)); - initialize(configuration == null ? new CompareConfiguration() : configuration); - } - - private void initialize(CompareConfiguration configuration) { - - Control tree= getControl(); - - INavigatable nav= new INavigatable() { - public boolean selectChange(int flag) { - if (flag == INavigatable.FIRST_CHANGE) { - setSelection(StructuredSelection.EMPTY); - flag = INavigatable.NEXT_CHANGE; - } else if (flag == INavigatable.LAST_CHANGE) { - setSelection(StructuredSelection.EMPTY); - flag = INavigatable.PREVIOUS_CHANGE; - } - // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - return internalNavigate(flag == INavigatable.NEXT_CHANGE, true); - } - public Object getInput() { - return DiffTreeViewer.this.getInput(); - } - public boolean openSelectedChange() { - return internalOpen(); - } - public boolean hasChange(int changeFlag) { - return getNextItem(changeFlag == INavigatable.NEXT_CHANGE, false) != null; - } - }; - tree.setData(INavigatable.NAVIGATOR_PROPERTY, nav); - - fLeftIsLocal= Utilities.getBoolean(configuration, "LEFT_IS_LOCAL", false); //$NON-NLS-1$ - - tree.setData(CompareUI.COMPARE_VIEWER_TITLE, getTitle()); - - Composite parent= tree.getParent(); - - fBundle= ResourceBundle.getBundle("org.eclipse.compare.structuremergeviewer.DiffTreeViewerResources"); //$NON-NLS-1$ - - // register for notification with the CompareConfiguration - fCompareConfiguration= configuration; - if (fCompareConfiguration != null) { - fPropertyChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - DiffTreeViewer.this.propertyChange(event); - } - }; - fCompareConfiguration.addPropertyChangeListener(fPropertyChangeListener); - } - - setContentProvider(new DiffViewerContentProvider()); - setLabelProvider(new DiffViewerLabelProvider()); - - addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent se) { - updateActions(); - } - } - ); - - setComparator(new DiffViewerComparator()); - - ToolBarManager tbm= CompareViewerPane.getToolBarManager(parent); - if (tbm != null) { - tbm.removeAll(); - - tbm.add(new Separator("merge")); //$NON-NLS-1$ - tbm.add(new Separator("modes")); //$NON-NLS-1$ - tbm.add(new Separator("navigation")); //$NON-NLS-1$ - - createToolItems(tbm); - updateActions(); - - tbm.update(true); - } - - MenuManager mm= new MenuManager(); - mm.setRemoveAllWhenShown(true); - mm.addMenuListener( - new IMenuListener() { - public void menuAboutToShow(IMenuManager mm2) { - fillContextMenu(mm2); - if (mm2.isEmpty()) { - if (fEmptyMenuAction == null) { - fEmptyMenuAction= new Action(Utilities.getString(fBundle, "emptyMenuItem")) { //$NON-NLS-1$ - // left empty - }; - fEmptyMenuAction.setEnabled(false); - } - mm2.add(fEmptyMenuAction); - } - } - } - ); - tree.setMenu(mm.createContextMenu(tree)); - } - - /** - * Returns the viewer's name. - * - * @return the viewer's name - */ - public String getTitle() { - String title= Utilities.getString(fBundle, "title", null); //$NON-NLS-1$ - if (title == null) - title= Utilities.getString("DiffTreeViewer.title"); //$NON-NLS-1$ - return title; - } - - /** - * Returns the resource bundle. - * - * @return the viewer's resource bundle - */ - protected ResourceBundle getBundle() { - return fBundle; - } - - /** - * Returns the compare configuration of this viewer. - * - * @return the compare configuration of this viewer - */ - public CompareConfiguration getCompareConfiguration() { - return fCompareConfiguration; - } - - /** - * Called on the viewer disposal. - * Unregisters from the compare configuration. - * Clients may extend if they have to do additional cleanup. - * @param event dispose event that triggered call to this method - */ - protected void handleDispose(DisposeEvent event) { - - if (fCompareConfiguration != null) { - if (fPropertyChangeListener != null) - fCompareConfiguration.removePropertyChangeListener(fPropertyChangeListener); - fCompareConfiguration= null; - } - fPropertyChangeListener= null; - - super.handleDispose(event); - } - - /** - * Tracks property changes of the configuration object. - * Clients may extend to track their own property changes. - * @param event property change event that triggered call to this method - */ - protected void propertyChange(PropertyChangeEvent event) { - // empty default implementation - } - - protected void inputChanged(Object in, Object oldInput) { - super.inputChanged(in, oldInput); - - if (in != oldInput) { - initialSelection(); - updateActions(); - } - } - - /** - * This hook method is called from within <code>inputChanged</code> - * after a new input has been set but before any controls are updated. - * This default implementation calls <code>navigate(true)</code> - * to select and expand the first leaf node. - * Clients can override this method and are free to decide whether - * they want to call the inherited method. - * - * @since 2.0 - */ - protected void initialSelection() { - navigate(true); - } - - /** - * Overridden to avoid expanding <code>DiffNode</code>s that shouldn't expand. - * @param node the node to expand - * @param level non-negative level, or <code>ALL_LEVELS</code> to collapse all levels of the tree - */ - protected void internalExpandToLevel(Widget node, int level) { - - Object data= node.getData(); - - if (dontExpand(data)) - return; - - super.internalExpandToLevel(node, level); - } - - /** - * This hook method is called from within <code>internalExpandToLevel</code> - * to control whether a given model node should be expanded or not. - * This default implementation checks whether the object is a <code>DiffNode</code> and - * calls <code>dontExpand()</code> on it. - * Clients can override this method and are free to decide whether - * they want to call the inherited method. - * - * @param o the model object to be expanded - * @return <code>false</code> if a node should be expanded, <code>true</code> to prevent expanding - * @since 2.0 - */ - protected boolean dontExpand(Object o) { - return o instanceof DiffNode && ((DiffNode)o).dontExpand(); - } - - //---- merge action support - - /** - * This factory method is called after the viewer's controls have been created. - * It installs four actions in the given <code>ToolBarManager</code>. Two actions - * allow for copying one side of a <code>DiffNode</code> to the other side. - * Two other actions are for navigating from one node to the next (previous). - * <p> - * Clients can override this method and are free to decide whether they want to call - * the inherited method. - * - * @param toolbarManager the toolbar manager for which to add the actions - */ - protected void createToolItems(ToolBarManager toolbarManager) { - -// fCopyLeftToRightAction= new Action() { -// public void run() { -// copySelected(true); -// } -// }; -// Utilities.initAction(fCopyLeftToRightAction, fBundle, "action.TakeLeft."); -// toolbarManager.appendToGroup("merge", fCopyLeftToRightAction); - -// fCopyRightToLeftAction= new Action() { -// public void run() { -// copySelected(false); -// } -// }; -// Utilities.initAction(fCopyRightToLeftAction, fBundle, "action.TakeRight."); -// toolbarManager.appendToGroup("merge", fCopyRightToLeftAction); - -// fNextAction= new Action() { -// public void run() { -// navigate(true); -// } -// }; -// Utilities.initAction(fNextAction, fBundle, "action.NextDiff."); //$NON-NLS-1$ -// toolbarManager.appendToGroup("navigation", fNextAction); //$NON-NLS-1$ - -// fPreviousAction= new Action() { -// public void run() { -// navigate(false); -// } -// }; -// Utilities.initAction(fPreviousAction, fBundle, "action.PrevDiff."); //$NON-NLS-1$ -// toolbarManager.appendToGroup("navigation", fPreviousAction); //$NON-NLS-1$ - } - - /** - * This method is called to add actions to the viewer's context menu. - * It installs actions for expanding tree nodes, copying one side of a <code>DiffNode</code> to the other side. - * Clients can override this method and are free to decide whether they want to call - * the inherited method. - * - * @param manager the menu manager for which to add the actions - */ - protected void fillContextMenu(IMenuManager manager) { - if (fExpandAllAction == null) { - fExpandAllAction= new Action() { - public void run() { - expandSelection(); - } - }; - Utilities.initAction(fExpandAllAction, fBundle, "action.ExpandAll."); //$NON-NLS-1$ - } - - boolean enable= false; - ISelection selection= getSelection(); - if (selection instanceof IStructuredSelection) { - Iterator elements= ((IStructuredSelection)selection).iterator(); - while (elements.hasNext()) { - Object element= elements.next(); - if (element instanceof IDiffContainer) { - if (((IDiffContainer)element).hasChildren()) { - enable= true; - break; - } - } - } - } - fExpandAllAction.setEnabled(enable); - - manager.add(fExpandAllAction); - - if (fCopyLeftToRightAction != null) - manager.add(fCopyLeftToRightAction); - if (fCopyRightToLeftAction != null) - manager.add(fCopyRightToLeftAction); - } - - /** - * Expands to infinity all items in the selection. - * - * @since 2.0 - */ - protected void expandSelection() { - ISelection selection= getSelection(); - if (selection instanceof IStructuredSelection) { - Iterator elements= ((IStructuredSelection)selection).iterator(); - while (elements.hasNext()) { - Object next= elements.next(); - expandToLevel(next, ALL_LEVELS); - } - } - } - - /** - * Copies one side of all <code>DiffNode</code>s in the current selection to the other side. - * Called from the (internal) actions for copying the sides of a <code>DiffNode</code>. - * Clients may override. - * - * @param leftToRight if <code>true</code> the left side is copied to the right side. - * If <code>false</code> the right side is copied to the left side - */ - protected void copySelected(boolean leftToRight) { - ISelection selection= getSelection(); - if (selection instanceof IStructuredSelection) { - Iterator e= ((IStructuredSelection) selection).iterator(); - while (e.hasNext()) { - Object element= e.next(); - if (element instanceof ICompareInput) - copyOne((ICompareInput) element, leftToRight); - } - } - } - - /** - * Called to copy one side of the given node to the other. - * This default implementation delegates the call to <code>ICompareInput.copy(...)</code>. - * Clients may override. - * @param node the node to copy - * @param leftToRight if <code>true</code> the left side is copied to the right side. - * If <code>false</code> the right side is copied to the left side - */ - protected void copyOne(ICompareInput node, boolean leftToRight) { - - node.copy(leftToRight); - - // update node's image - update(new Object[] { node }, null); - } - - /** - * Selects the next (or previous) node of the current selection. - * If there is no current selection the first (last) node in the tree is selected. - * Wraps around at end or beginning. - * Clients may override. - * - * @param next if <code>true</code> the next node is selected, otherwise the previous node - */ - protected void navigate(boolean next) { - // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - internalNavigate(next, false); - } - - //---- private - - /** - * Selects the next (or previous) node of the current selection. - * If there is no current selection the first (last) node in the tree is selected. - * Wraps around at end or beginning. - * Clients may override. - * - * @param next if <code>true</code> the next node is selected, otherwise the previous node - * @param fireOpen if <code>true</code> an open event is fired. - * @return <code>true</code> if at end (or beginning) - */ - private boolean internalNavigate(boolean next, boolean fireOpen) { - Control c= getControl(); - if (!(c instanceof Tree) || c.isDisposed()) - return false; - TreeItem item = getNextItem(next, true); - if (item != null) { - internalSetSelection(item, fireOpen); - } - return item == null; - } - - private TreeItem getNextItem(boolean next, boolean expand) { - Control c= getControl(); - if (!(c instanceof Tree) || c.isDisposed()) - return null; - - Tree tree= (Tree) c; - TreeItem item= null; - TreeItem children[]= tree.getSelection(); - if (children != null && children.length > 0) - item= children[0]; - if (item == null) { - children= tree.getItems(); - if (children != null && children.length > 0) { - item= children[0]; - if (item != null && item.getItemCount() <= 0) { - return item; - } - } - } - - while (true) { - item= findNextPrev(item, next, expand); - if (item == null) - break; - if (item.getItemCount() <= 0) - break; - } - return item; - } - - private TreeItem findNextPrev(TreeItem item, boolean next, boolean expand) { - - if (item == null) - return null; - - TreeItem children[]= null; - - if (!next) { - - TreeItem parent= item.getParentItem(); - if (parent != null) - children= parent.getItems(); - else - children= item.getParent().getItems(); - - if (children != null && children.length > 0) { - // goto previous child - int index= 0; - for (; index < children.length; index++) - if (children[index] == item) - break; - - if (index > 0) { - - item= children[index-1]; - - while (true) { - createChildren(item); - int n= item.getItemCount(); - if (n <= 0) - break; - - if (expand) - item.setExpanded(true); - item= item.getItems()[n-1]; - } - - // previous - return item; - } - } - - // go up - item= parent; - - } else { - if (expand) - item.setExpanded(true); - createChildren(item); - - if (item.getItemCount() > 0) { - // has children: go down - children= item.getItems(); - return children[0]; - } - - while (item != null) { - children= null; - TreeItem parent= item.getParentItem(); - if (parent != null) - children= parent.getItems(); - else - children= item.getParent().getItems(); - - if (children != null && children.length > 0) { - // goto next child - int index= 0; - for (; index < children.length; index++) - if (children[index] == item) - break; - - if (index < children.length-1) { - // next - return children[index+1]; - } - } - - // go up - item= parent; - } - } - - return item; - } - - private void internalSetSelection(TreeItem ti, boolean fireOpen) { - if (ti != null) { - Object data= ti.getData(); - if (data != null) { - // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - ISelection selection= new StructuredSelection(data); - setSelection(selection, true); - ISelection currentSelection= getSelection(); - if (fireOpen && currentSelection != null && selection.equals(currentSelection)) { - fireOpen(new OpenEvent(this, selection)); - } - } - } - } - - private final boolean isEditable(Object element, boolean left) { - if (element instanceof ICompareInput) { - ICompareInput diff= (ICompareInput) element; - Object side= left ? diff.getLeft() : diff.getRight(); - if (side == null && diff instanceof IDiffElement) { - IDiffContainer container= ((IDiffElement)diff).getParent(); - if (container instanceof ICompareInput) { - ICompareInput parent= (ICompareInput) container; - side= left ? parent.getLeft() : parent.getRight(); - } - } - if (side instanceof IEditableContent) - return ((IEditableContent) side).isEditable(); - } - return false; - } - - private void updateActions() { - int leftToRight= 0; - int rightToLeft= 0; - ISelection selection= getSelection(); - if (selection instanceof IStructuredSelection) { - IStructuredSelection ss= (IStructuredSelection) selection; - Iterator e= ss.iterator(); - while (e.hasNext()) { - Object element= e.next(); - if (element instanceof ICompareInput) { - if (isEditable(element, false)) - leftToRight++; - if (isEditable(element, true)) - rightToLeft++; - if (leftToRight > 0 && rightToLeft > 0) - break; - } - } - if (fExpandAllAction != null) - fExpandAllAction.setEnabled(selection.isEmpty()); - } - if (fCopyLeftToRightAction != null) - fCopyLeftToRightAction.setEnabled(leftToRight > 0); - if (fCopyRightToLeftAction != null) - fCopyRightToLeftAction.setEnabled(rightToLeft > 0); - } - - /* - * Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - */ - private boolean internalOpen() { - ISelection selection= getSelection(); - if (selection != null && !selection.isEmpty()) { - fireOpen(new OpenEvent(this, selection)); - return true; - } - return false; - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewerResources.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewerResources.properties deleted file mode 100644 index 76ae2b89d..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewerResources.properties +++ /dev/null @@ -1,53 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2006 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 -############################################################################### - -# @(#)DiffTreeViewerResources.properties -# -# Resource strings for DiffTreeViewer.java - -title= Structure Compare -defaultLabel= <no name> - -##################################################### -# Dummy menu item for empty context menu -##################################################### - -emptyMenuItem= <Empty Menu> - -##################################################### -# Actions -##################################################### - -action.Smart.label=Smart -action.Smart.tooltip=Guess Similar Elements -action.Smart.image=smartmode_co.gif - -action.ExpandAll.label=Expand All -action.ExpandAll.tooltip=Expand All Nodes - -action.CompareContents.label= Show Content Comparison -action.CompareContents.tooltip= Show Content Comparison - -action.NextDiff.label=Next -action.NextDiff.tooltip=Select Next Change -action.NextDiff.image=next_nav.gif - -action.PrevDiff.label=Previous -action.PrevDiff.tooltip=Select Previous Change -action.PrevDiff.image=prev_nav.gif - -action.TakeLeft.label=Copy Left to Right -action.TakeLeft.tooltip=Copy Selected Nodes from Left to Right -action.TakeLeft.image=copycont_r_co.gif - -action.TakeRight.label=Copy Right to Left -action.TakeRight.tooltip=Copy Selected Nodes from Right to Left -action.TakeRight.image=copycont_l_co.gif diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/Differencer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/Differencer.java deleted file mode 100644 index 60fa61b97..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/Differencer.java +++ /dev/null @@ -1,534 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.eclipse.compare.IStreamContentAccessor; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; - -import com.ibm.icu.text.MessageFormat; - -/** - * A generic two-way or three-way differencing engine. - * <p> - * The engine is used by calling one of the <code>findDifferences</code> methods and passing - * in the objects to compare. - * The engine calls the following methods on the input objects to perform the compare: - * <UL> - * <LI><code>getChildren</code>: for enumerating the children of an object (if any), - * <LI><code>contentsEqual</code>: for comparing the content of leaf objects, that is, objects without children, - * <LI><code>visit</code>: for every pair of compared object the compare result is passed in. - * </UL> - * Clients may use as is, or subclass to provide a custom implementation for the three hooks. - * However the default implementation already deals with the typical case: - * <UL> - * <LI><code>getChildren</code>: tries to apply the <code>IStructureComparator</code> - * interface to enumerate the children, - * <LI><code>contentsEqual</code>: tries to apply the <code>IStreamContentAccessor</code> interface - * to perform a byte-wise content comparison, - * <LI><code>visit</code>: creates a <code>DiffNode</code> for any detected difference between the compared objects and - * links it under a parent node effectively creating a tree of differences. - * </UL> - * The different kind of changes detected by the engine are decoded as follows: - * In the two-way case only NO_CHANGE, ADDITION, DELETION, and CHANGE are used. - * In the three-way case these constants are bitwise ORed with one of directional constants - * LEFT, RIGHT, and CONFLICTING. - */ -public class Differencer { - - // The kind of differences. - /** - * Difference constant (value 0) indicating no difference. - */ - public static final int NO_CHANGE= 0; - /** - * Difference constant (value 1) indicating one side was added. - */ - public static final int ADDITION= 1; - /** - * Difference constant (value 2) indicating one side was removed. - */ - public static final int DELETION= 2; - /** - * Difference constant (value 3) indicating side changed. - */ - public static final int CHANGE= 3; - - /** - * Bit mask (value 3) for extracting the kind of difference. - */ - public static final int CHANGE_TYPE_MASK= 3; - - // The direction of a three-way change. - /** - * Three-way change constant (value 4) indicating a change on left side. - */ - public static final int LEFT= 4; - - /** - * Three-way change constant (value 8) indicating a change on right side. - */ - public static final int RIGHT= 8; - - /** - * Three-way change constant (value 12) indicating a change on left and - * right sides. - */ - public static final int CONFLICTING= 12; - - /** - * Bit mask (value 12) for extracting the direction of a three-way change. - */ - public static final int DIRECTION_MASK= 12; - - /** - * Constant (value 16) indicating a change on left and - * right side (with respect to ancestor) but left and right are identical. - */ - public static final int PSEUDO_CONFLICT= 16; - - - static class Node { - List fChildren; - int fCode; - Object fAncestor; - Object fLeft; - Object fRight; - - Node() { - // nothing to do - } - Node(Node parent, Object ancestor, Object left, Object right) { - parent.add(this); - fAncestor= ancestor; - fLeft= left; - fRight= right; - } - void add(Node child) { - if (fChildren == null) - fChildren= new ArrayList(); - fChildren.add(child); - } - Object visit(Differencer d, Object parent, int level) { - if (fCode == NO_CHANGE) - return null; - //dump(level); - Object data= d.visit(parent, fCode, fAncestor, fLeft, fRight); - if (fChildren != null) { - Iterator i= fChildren.iterator(); - while (i.hasNext()) { - Node n= (Node) i.next(); - n.visit(d, data, level+1); - } - } - return data; - } -// private void dump(int level) { -// String name= null; -// if (fAncestor instanceof ITypedElement) -// name= ((ITypedElement)fAncestor).getName(); -// if (name == null && fLeft instanceof ITypedElement) -// name= ((ITypedElement)fLeft).getName(); -// if (name == null && fRight instanceof ITypedElement) -// name= ((ITypedElement)fRight).getName(); -// if (name == null) -// name= "???"; //$NON-NLS-1$ -// -// for (int i= 0; i < level; i++) -// System.out.print(" "); //$NON-NLS-1$ -// -// System.out.println(getDiffType(fCode) + name); -// } - -// private String getDiffType(int code) { -// String dir= " "; //$NON-NLS-1$ -// switch (code & DIRECTION_MASK) { -// case LEFT: -// dir= ">"; //$NON-NLS-1$ -// break; -// case RIGHT: -// dir= "<"; //$NON-NLS-1$ -// break; -// case CONFLICTING: -// dir= "!"; //$NON-NLS-1$ -// break; -// } -// String change= "="; //$NON-NLS-1$ -// switch (code & CHANGE_TYPE_MASK) { -// case ADDITION: -// change= "+"; //$NON-NLS-1$ -// break; -// case DELETION: -// change= "-"; //$NON-NLS-1$ -// break; -// case CHANGE: -// change= "#"; //$NON-NLS-1$ -// break; -// } -// return dir + change + " "; //$NON-NLS-1$ -// } - } - - /** - * Creates a new differencing engine. - */ - public Differencer() { - // nothing to do - } - - /** - * Starts the differencing engine on the three input objects. If threeWay is <code>true</code> a - * three-way comparison is performed, otherwise a two-way compare (in the latter case the ancestor argument is ignored). - * The progress monitor is passed to the method <code>updateProgress</code> which is called for every node or - * leaf compare. The method returns the object that was returned from the top-most call to method <code>visit</code>. - * At most two of the ancestor, left, and right parameters are allowed to be <code>null</code>. - * - * @param threeWay if <code>true</code> a three-way comparison is performed, otherwise a two-way compare - * @param pm a progress monitor which is passed to method <code>updateProgress</code> - * @param data a client data that is passed to the top-level call to <code>visit</code> - * @param ancestor the ancestor object of the compare (may be <code>null</code>) - * @param left the left object of the compare - * @param right the right object of the compare - * @return the object returned from the top most call to method <code>visit</code>, - * possibly <code>null</code> - */ - public Object findDifferences(boolean threeWay, IProgressMonitor pm, Object data, Object ancestor, Object left, Object right) { - - Node root= new Node(); - - int code= traverse(threeWay, root, pm, threeWay ? ancestor : null, left, right); - - if (code != NO_CHANGE) { - List l= root.fChildren; - if (l.size() > 0) { - Node first= (Node)l.get(0); - return first.visit(this, data, 0); - } - } - return null; - } - - /* - * Traverse tree in postorder. - */ - private int traverse(boolean threeWay, Node parent, IProgressMonitor pm, Object ancestor, Object left, Object right) { - - Object[] ancestorChildren= getChildren(ancestor); - Object[] rightChildren= getChildren(right); - Object[] leftChildren= getChildren(left); - - int code= NO_CHANGE; - - Node node= new Node(parent, ancestor, left, right); - - boolean content= true; // we reset this if we have at least one child - - if (((threeWay && ancestorChildren != null) || !threeWay) - && rightChildren != null && leftChildren != null) { - // we only recurse down if no leg is null - // a node - - Set allSet= new HashSet(20); - Map ancestorSet= null; - Map rightSet= null; - Map leftSet= null; - - if (ancestorChildren != null) { - ancestorSet= new HashMap(10); - for (int i= 0; i < ancestorChildren.length; i++) { - Object ancestorChild= ancestorChildren[i]; - ancestorSet.put(ancestorChild, ancestorChild); - allSet.add(ancestorChild); - } - } - - if (rightChildren != null) { - rightSet= new HashMap(10); - for (int i= 0; i < rightChildren.length; i++) { - Object rightChild= rightChildren[i]; - rightSet.put(rightChild, rightChild); - allSet.add(rightChild); - } - } - - if (leftChildren != null) { - leftSet= new HashMap(10); - for (int i= 0; i < leftChildren.length; i++) { - Object leftChild= leftChildren[i]; - leftSet.put(leftChild, leftChild); - allSet.add(leftChild); - } - } - - Iterator e= allSet.iterator(); - while (e.hasNext()) { - Object keyChild= e.next(); - - if (pm != null) { - - if (pm.isCanceled()) - throw new OperationCanceledException(); - - updateProgress(pm, keyChild); - } - - Object ancestorChild= ancestorSet != null ? ancestorSet.get(keyChild) : null; - Object leftChild= leftSet != null ? leftSet.get(keyChild) : null; - Object rightChild= rightSet != null ? rightSet.get(keyChild) : null; - - int c= traverse(threeWay, node, pm, ancestorChild, leftChild, rightChild); - - if ((c & CHANGE_TYPE_MASK) != NO_CHANGE) { - code|= CHANGE; // deletions and additions of child result in a change of the container - code|= (c & DIRECTION_MASK); // incoming & outgoing are just ored - content= false; - } - } - } - - if (content) // a leaf - code= compare(threeWay, ancestor, left, right); - - node.fCode= code; - - return code; - } - - /** - * Called for every node or leaf comparison. - * The differencing engine passes in the input objects of the compare and the result of the compare. - * The data object is the value returned from a call to the <code>visit</code> method on the parent input. - * It can be considered the "parent" reference and is useful when building a tree. - * <p> - * The <code>Differencer</code> implementation returns a new - * <code>DiffNode</code> which is initialized with the corresponding values. - * Subclasses may override. - * - * @param data object returned from parent call to <code>visit</code>, - * possibly <code>null</code> - * @param result the result of the compare operation performed on the three inputs - * @param ancestor the compare ancestor of the left and right inputs - * @param left the left input to the compare - * @param right the right input to the compare - * @return the result, possibly <code>null</code> - */ - protected Object visit(Object data, int result, Object ancestor, Object left, Object right) { - return new DiffNode((IDiffContainer) data, result, (ITypedElement)ancestor, (ITypedElement)left, (ITypedElement)right); - } - - /* - * Performs a 2-way or 3-way compare of the given leaf elements and returns an integer - * describing the kind of difference. - */ - private int compare(boolean threeway, Object ancestor, Object left, Object right) { - - int description= NO_CHANGE; - - if (threeway) { - if (ancestor == null) { - if (left == null) { - if (right == null) { - Assert.isTrue(false); - // shouldn't happen - } else { - description= RIGHT | ADDITION; - } - } else { - if (right == null) { - description= LEFT | ADDITION; - } else { - description= CONFLICTING | ADDITION; - if (contentsEqual(left, right)) - description|= PSEUDO_CONFLICT; - } - } - } else { - if (left == null) { - if (right == null) { - description= CONFLICTING | DELETION | PSEUDO_CONFLICT; - } else { - if (contentsEqual(ancestor, right)) - description= LEFT | DELETION; - else - description= CONFLICTING | CHANGE; - } - } else { - if (right == null) { - if (contentsEqual(ancestor, left)) - description= RIGHT | DELETION; - else - description= CONFLICTING | CHANGE; - } else { - boolean ay= contentsEqual(ancestor, left); - boolean am= contentsEqual(ancestor, right); - - if (ay && am) { - // empty - } else if (ay && !am) { - description= RIGHT | CHANGE; - } else if (!ay && am) { - description= LEFT | CHANGE; - } else { - description= CONFLICTING | CHANGE; - if (contentsEqual(left, right)) - description|= PSEUDO_CONFLICT; - } - } - } - } - } else { // two way compare ignores ancestor - if (left == null) { - if (right == null) { - Assert.isTrue(false); - // shouldn't happen - } else { - description= ADDITION; - } - } else { - if (right == null) { - description= DELETION; - } else { - if (! contentsEqual(left, right)) - description= CHANGE; - } - } - } - - return description; - } - - /** - * Performs a content compare on the two given inputs. - * <p> - * The <code>Differencer</code> implementation - * returns <code>true</code> if both inputs implement <code>IStreamContentAccessor</code> - * and their byte contents is identical. Subclasses may override to implement - * a different content compare on the given inputs. - * </p> - * - * @param input1 first input to contents compare - * @param input2 second input to contents compare - * @return <code>true</code> if content is equal - */ - protected boolean contentsEqual(Object input1, Object input2) { - - if (input1 == input2) - return true; - - InputStream is1= getStream(input1); - InputStream is2= getStream(input2); - - if (is1 == null && is2 == null) // no byte contents - return true; - - try { - if (is1 == null || is2 == null) // only one has contents - return false; - - while (true) { - int c1= is1.read(); - int c2= is2.read(); - if (c1 == -1 && c2 == -1) - return true; - if (c1 != c2) - break; - - } - } catch (IOException ex) { - // NeedWork - } finally { - if (is1 != null) { - try { - is1.close(); - } catch(IOException ex) { - // silently ignored - } - } - if (is2 != null) { - try { - is2.close(); - } catch(IOException ex) { - // silently ignored - } - } - } - return false; - } - - /* - * Tries to return an InputStream for the given object. - * Returns <code>null</code> if the object not an IStreamContentAccessor - * or an error occurred. - */ - private InputStream getStream(Object o) { - if (o instanceof IStreamContentAccessor) { - try { - return ((IStreamContentAccessor)o).getContents(); - } catch(CoreException ex) { - // NeedWork - } - } - return null; - } - - /** - * Returns the children of the given input or <code>null</code> if there are no children. - * <p> - * The <code>Differencer</code> implementation checks whether the input - * implements the <code>IStructureComparator</code> interface. If yes it is used - * to return an array containing all children. Otherwise <code>null</code> is returned. - * Subclasses may override to implement a different strategy to enumerate children. - * </p> - * - * @param input the object for which to return children - * @return the children of the given input or <code>null</code> if there are no children. - */ - protected Object[] getChildren(Object input) { - if (input instanceof IStructureComparator) - return ((IStructureComparator)input).getChildren(); - return null; - } - - /** - * Called for every leaf or node compare to update progress information. - * <p> - * The <code>Differencer</code> implementation shows the name of the input object - * as a subtask. Subclasses may override. - * </p> - * - * @param progressMonitor the progress monitor for reporting progress - * @param node the currently processed non-<code>null</code> node - */ - protected void updateProgress(IProgressMonitor progressMonitor, Object node) { - if (node instanceof ITypedElement) { - String name= ((ITypedElement)node).getName(); - String fmt= Utilities.getString("Differencer.progressFormat"); //$NON-NLS-1$ - String msg= MessageFormat.format(fmt, new String[] { name }); - progressMonitor.subTask(msg); - //progressMonitor.worked(1); - } - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DocumentRangeNode.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DocumentRangeNode.java deleted file mode 100644 index 4ffee0189..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DocumentRangeNode.java +++ /dev/null @@ -1,468 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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.ByteArrayInputStream; -import java.io.InputStream; -import java.util.ArrayList; - -import org.eclipse.compare.*; -import org.eclipse.compare.contentmergeviewer.IDocumentRange; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.core.runtime.*; -import org.eclipse.jface.text.*; -import org.eclipse.swt.widgets.Shell; - - -/** - * A document range node represents a structural element - * when performing a structure compare of documents. - * <code>DocumentRangeNodes</code> are created while parsing the document and represent - * a semantic entity (e.g. a Java class or method). - * As a consequence of the parsing a <code>DocumentRangeNode</code> maps to a range - * of characters in the document. - * <p> - * Since a <code>DocumentRangeNode</code> implements the <code>IStructureComparator</code> - * and <code>IStreamContentAccessor</code> interfaces it can be used as input to the - * differencing engine. This makes it possible to perform - * a structural diff on a document and have the nodes and leaves of the compare easily map - * to character ranges within the document. - * <p> - * Clients need to be aware that this node registers position updaters with the document - * using {@link IDocument#addPosition(String, Position)} with the category set to - * {@link IDocumentRange#RANGE_CATEGORY}. The {@link StructureDiffViewer} will - * remove the category when the nodes are no longer being used. Other clients - * must do the same. - * <p> - * Subclasses may add additional state collected while parsing the document. - * </p> - * @see Differencer - */ -public class DocumentRangeNode - implements IDocumentRange, IStructureComparator, IEditableContent, IEncodedStreamContentAccessor, IAdaptable, IEditableContentExtension { - - private static final String UTF_16= "UTF-16"; //$NON-NLS-1$ - - private IDocument fBaseDocument; - private Position fRange; // the range in the base document - private int fTypeCode; - private String fID; - private Position fAppendPosition; // a position where to insert a child textually - private ArrayList fChildren; - private final DocumentRangeNode fParent; - - /** - * Creates a new <code>DocumentRangeNode</code> for the given range within the specified - * document. The <code>typeCode</code> is uninterpreted client data. The ID is used when comparing - * two nodes with each other: i.e. the differencing engine performs a content compare - * on two nodes if their IDs are equal. - * - * @param typeCode a type code for this node - * @param id an identifier for this node - * @param document document on which this node is based on - * @param start start position of range within document - * @param length length of range - */ - public DocumentRangeNode(int typeCode, String id, IDocument document, int start, int length) { - this(null, typeCode, id, document, start, length); - } - - /** - * Creates a new <code>DocumentRangeNode</code> for the given range within the specified - * document. The <code>typeCode</code> is uninterpreted client data. The ID is used when comparing - * two nodes with each other: i.e. the differencing engine performs a content compare - * on two nodes if their IDs are equal. - * - * @param parent the parent node - * @param typeCode a type code for this node - * @param id an identifier for this node - * @param document document on which this node is based on - * @param start start position of range within document - * @param length length of range - * @since 3.3 - */ - public DocumentRangeNode(DocumentRangeNode parent, int typeCode, String id, IDocument document, int start, int length) { - fParent = parent; - fTypeCode= typeCode; - fID= id; - fBaseDocument= document; - registerPositionUpdater(start, length); - } - - private void registerPositionUpdater(int start, int length) { - fBaseDocument.addPositionCategory(RANGE_CATEGORY); - fRange= new Position(start, length); - try { - fBaseDocument.addPosition(RANGE_CATEGORY, fRange); - } catch (BadPositionCategoryException ex) { - CompareUIPlugin.log(ex); - } catch (BadLocationException ex) { - CompareUIPlugin.log(ex); - } - } - - /* (non Javadoc) - * see IDocumentRange.getDocument - */ - public IDocument getDocument() { - return fBaseDocument; - } - - /* (non Javadoc) - * see IDocumentRange.getRange - */ - public Position getRange() { - return fRange; - } - - /** - * Returns the type code of this node. - * The type code is uninterpreted client data which can be set in the constructor. - * - * @return the type code of this node - */ - public int getTypeCode() { - return fTypeCode; - } - - /** - * Returns this node's id. - * It is used in <code>equals</code> and <code>hashcode</code>. - * - * @return the node's id - */ - public String getId() { - return fID; - } - - /** - * Sets this node's id. - * It is used in <code>equals</code> and <code>hashcode</code>. - * - * @param id the new id for this node - */ - public void setId(String id) { - fID= id; - } - - /** - * Adds the given node as a child. - * - * @param node the node to add as a child - */ - public void addChild(DocumentRangeNode node) { - if (fChildren == null) - fChildren= new ArrayList(); - fChildren.add(node); - } - - /* (non Javadoc) - * see IStructureComparator.getChildren - */ - public Object[] getChildren() { - if (fChildren != null) - return fChildren.toArray(); - return new Object[0]; - } - - /** - * Sets the length of the range of this node. - * - * @param length the length of the range - */ - public void setLength(int length) { - getRange().setLength(length); - } - - /** - * Sets a position within the document range that can be used to (legally) insert - * text without breaking the syntax of the document. - * <p> - * E.g. when parsing a Java document the "append position" of a <code>DocumentRangeNode</code> - * representing a Java class could be the character position just before the closing bracket. - * Inserting the text of a new method there would not disturb the syntax of the class. - * - * @param pos the character position within the underlying document where text can be legally inserted - */ - public void setAppendPosition(int pos) { - if (fAppendPosition != null) - try { - fBaseDocument.removePosition(RANGE_CATEGORY, fAppendPosition); - } catch (BadPositionCategoryException e) { - // Ignore - } - try { - // TODO: Avoid an exception for a position that is past the end of the document - if (pos <= getDocument().getLength()) { - Position p= new Position(pos); - fBaseDocument.addPosition(RANGE_CATEGORY, p); - fAppendPosition= p; - } - } catch (BadPositionCategoryException ex) { - // silently ignored - } catch (BadLocationException ex) { - // silently ignored - } - } - - /** - * Returns the position that has been set with <code>setAppendPosition</code>. - * If <code>setAppendPosition</code> hasn't been called, the position after the last character - * of this range is returned. This method will return <code>null</code> if the position - * could not be registered with the document. - * - * @return a position where text can be legally inserted - */ - public Position getAppendPosition() { - if (fAppendPosition == null) { - try { - Position p= new Position(fBaseDocument.getLength()); - fBaseDocument.addPosition(RANGE_CATEGORY, p); - fAppendPosition= p; - return fAppendPosition; - } catch (BadPositionCategoryException ex) { - // silently ignored - } catch (BadLocationException ex) { - // silently ignored - } - } - return new Position(fBaseDocument.getLength()); - } - - /** - * Implementation based on <code>getID</code>. - * @param other the object to compare this <code>DocumentRangeNode</code> against. - * @return <code>true</code> if the <code>DocumentRangeNodes</code>are equal; <code>false</code> otherwise. - */ - public boolean equals(Object other) { - if (other != null && other.getClass() == getClass()) { - DocumentRangeNode tn= (DocumentRangeNode) other; - return fTypeCode == tn.fTypeCode && fID.equals(tn.fID); - } - return super.equals(other); - } - - /** - * Implementation based on <code>getID</code>. - * @return a hash code for this object. - */ - public int hashCode() { - return fID.hashCode(); - } - - /* - * Find corresponding position - */ - private Position findCorrespondingPosition(DocumentRangeNode otherParent, DocumentRangeNode child) { - - // we try to find a predecessor of left Node which exists on the right side - - if (child != null && fChildren != null) { - int ix= otherParent.fChildren.indexOf(child); - if (ix >= 0) { - - for (int i= ix - 1; i >= 0; i--) { - DocumentRangeNode c1= (DocumentRangeNode) otherParent.fChildren.get(i); - int i2= fChildren.indexOf(c1); - if (i2 >= 0) { - DocumentRangeNode c= (DocumentRangeNode) fChildren.get(i2); - //System.out.println(" found corresponding: " + i2 + " " + c); - Position p= c.fRange; - - //try { - Position po= new Position(p.getOffset() + p.getLength() + 1, 0); - //c.fBaseDocument.addPosition(RANGE_CATEGORY, po); - return po; - //} catch (BadLocationException ex) { - //} - //break; - } - } - - for (int i= ix; i < otherParent.fChildren.size(); i++) { - DocumentRangeNode c1= (DocumentRangeNode) otherParent.fChildren.get(i); - int i2= fChildren.indexOf(c1); - if (i2 >= 0) { - DocumentRangeNode c= (DocumentRangeNode) fChildren.get(i2); - //System.out.println(" found corresponding: " + i2 + " " + c); - Position p= c.fRange; - //try { - Position po= new Position(p.getOffset(), 0); - //c.fBaseDocument.addPosition(RANGE_CATEGORY, po); - return po; - //} catch (BadLocationException ex) { - //} - //break; - } - } - - } - } - return getAppendPosition(); - } - - private void add(String s, DocumentRangeNode parent, DocumentRangeNode child) { - - Position p= findCorrespondingPosition(parent, child); - if (p != null) { - try { - fBaseDocument.replace(p.getOffset(), p.getLength(), s); - } catch (BadLocationException ex) { - CompareUIPlugin.log(ex); - } - } - } - - /* (non Javadoc) - * see IStreamContentAccessor.getContents - */ - public InputStream getContents() { - String s; - try { - s= fBaseDocument.get(fRange.getOffset(), fRange.getLength()); - } catch (BadLocationException ex) { - s= ""; //$NON-NLS-1$ - } - return new ByteArrayInputStream(Utilities.getBytes(s, UTF_16)); - } - - - /** - * If this node has a parent, return the editability of the parent. - * Otherwise return <code>true</code>. Subclasses may override. - * @see org.eclipse.compare.IEditableContent#isEditable() - */ - public boolean isEditable() { - if (fParent != null) - return fParent.isEditable(); - return true; - } - - /* (non Javadoc) - * see IEditableContent.replace - */ - public ITypedElement replace(ITypedElement child, ITypedElement other) { - - if (fParent == null) { - // TODO: I don't believe this code does anything useful but just in case - // I'm leaving it in but disabling it for the shared document case - // since all the subclasses that have been converted overrode the method anyway - DocumentRangeNode src= null; - String srcContents= ""; //$NON-NLS-1$ - - if (other != null) { - src= (DocumentRangeNode) child; - - if (other instanceof IStreamContentAccessor) { - try { - srcContents= Utilities.readString((IStreamContentAccessor)other); - } catch(CoreException ex) { - // NeedWork - CompareUIPlugin.log(ex); - } - } - } - - if (child == null) // no destination: we have to add the contents into the parent - add(srcContents, null, src); - } - nodeChanged(this); - return child; - } - - /** - * Default implementation that calls {@link #internalSetContents(byte[])} - * and then {@link #nodeChanged(DocumentRangeNode)}. Subclasses - * may override but should then call {@link #nodeChanged(DocumentRangeNode)} - * after the contents have been set. - * @see org.eclipse.compare.IEditableContent#setContent(byte[]) - */ - public void setContent(byte[] content) { - internalSetContents(content); - nodeChanged(this); - } - - /** - * Method that is invoked from {@link #setContent(byte[])}. By default, - * this method does nothing. Subclasses may override. - * @param content the new content - * @since 3.3 - */ - protected void internalSetContents(byte[] content) { - // By default, do nothing - - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IStreamContentAccessor#getEncoding() - */ - public String getCharset() { - return UTF_16; - } - - /** - * Method that should be invoked whenever the contents of this node are - * changed. the change is propagated to the parent if there is one. - * @param node the node that has changed. - * @since 3.3 - */ - protected void nodeChanged(DocumentRangeNode node) { - if (fParent != null) - fParent.nodeChanged(node); - } - - /** - * Implement {@link IAdaptable#getAdapter(Class)} in order to provide - * an {@link ISharedDocumentAdapter} that provides the proper look up key based - * on the input from which this structure node was created. The proper - * shared document adapter is obtained by calling {@link #getAdapter(Class)} - * on this node's parent if there is one. - * @param adapter the adapter class to look up - * @return the object adapted to the given class or <code>null</code> - * @see IAdaptable#getAdapter(Class) - * @since 3.3 - */ - public Object getAdapter(Class adapter) { - if (adapter == ISharedDocumentAdapter.class && fParent != null) - return fParent.getAdapter(adapter); - - return Platform.getAdapterManager().getAdapter(this, adapter); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IEditableContentExtension#isReadOnly() - */ - public boolean isReadOnly() { - if (fParent != null) - return fParent.isReadOnly(); - return false; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IEditableContentExtension#validateEdit(org.eclipse.swt.widgets.Shell) - */ - public IStatus validateEdit(Shell shell) { - if (fParent != null) - return fParent.validateEdit(shell); - return Status.OK_STATUS; - } - - /** - * Return the parent of this node or <code>null</code> - * if the node doesn't have a parent or the parent is not known. - * @return the parent of this node or <code>null</code> - */ - public Object getParentNode() { - return fParent; - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInput.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInput.java deleted file mode 100644 index 2c3a2f1e1..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInput.java +++ /dev/null @@ -1,142 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.compare.ITypedElement; -import org.eclipse.swt.graphics.Image; - -/** - * Interface for objects used as input to a two-way or three-way compare viewer. - * It defines API for accessing the three sides for the compare, - * and a name and image which is used when displaying the three way input - * in the UI, for example, in a title bar. - * <p> - * Note: at most two sides of an <code>ICompareInput</code> can be <code>null</code>, - * (as it is normal for additions or deletions) but not all three. - * <p> - * <code>ICompareInput</code> provides methods for registering - * <code>ICompareInputChangeListener</code>s - * that get informed if one (or more) - * of the three sides of an <code>ICompareInput</code> object changes its value. - * <p> - * For example when accepting an incoming addition - * the (non-<code>null</code>) left side of an <code>ICompareInput</code> - * is copied to the right side by means of method <code>copy</code>. - * This should trigger a call to <code>compareInputChanged</code> of registered - * <code>ICompareInputChangeListener</code>s. - * <p> - * Clients can implement this interface, or use the convenience implementation - * <code>DiffNode</code>. - * </p> - * - * @see StructureDiffViewer - * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer - * @see DiffNode - */ -public interface ICompareInput { - - /** - * Returns name of input. - * This name is displayed when this input is shown in a viewer. - * In many cases this name is the name of one of the non-<code>null</code> sides or a combination - * thereof. - * - * @return name of input - */ - String getName(); - - /** - * Returns an image representing this input. - * This image is typically displayed when this input is shown in a viewer. - * In many cases this image is the image of one of the non-<code>null</code> sides. - * - * @return image representing this input, or <code>null</code> if no icon should be shown - */ - Image getImage(); - - /** - * Returns the kind of difference between the - * three sides ancestor, left and right. - * This field is only meaningful if the <code>ICompareInput</code> - * is the result of another compare. In this case it is used - * together with <code>getImage</code> to compose a icon - * which reflects the kind of difference between the two or three elements. - * - * @return kind of difference (see <code>Differencer</code>) - */ - int getKind(); - - /** - * Returns the ancestor side of this input. - * Returns <code>null</code> if this input has no ancestor - * or in the two-way compare case. - * - * @return the ancestor of this input, or <code>null</code> - */ - ITypedElement getAncestor(); - - /** - * Returns the left side of this input. - * Returns <code>null</code> if there is no left side (deletion or addition). - * - * @return the left side of this input, or <code>null</code> - */ - ITypedElement getLeft(); - - /** - * Returns the right side of this input. - * Returns <code>null</code> if there is no right side (deletion or addition). - * - * @return the right side of this input, or <code>null</code> - */ - ITypedElement getRight(); - - /** - * Registers the given listener for notification. - * If the identical listener is already registered the method has no effect. - * - * @param listener the listener to register for changes of this input - */ - void addCompareInputChangeListener(ICompareInputChangeListener listener); - - /** - * Unregisters the given listener. - * If the identical listener is not registered the method has no effect. - * - * @param listener the listener to unregister - */ - void removeCompareInputChangeListener(ICompareInputChangeListener listener); - - /** - * Copy one side (source) to the other side (destination) depending on the - * value of <code>leftToRight</code>. This method is called from - * a merge viewer if a corresponding action ("take left" or "take right") - * has been pressed. - * <p> - * The implementation should handle the following cases: - * <UL> - * <LI> - * if the source side is <code>null</code> the destination must be deleted, - * <LI> - * if the destination is <code>null</code> the destination must be created - * and filled with the contents from the source, - * <LI> - * if both sides are non-<code>null</code> the contents of source must be copied to destination. - * </UL> - * In addition the implementation should send out notification to the registered - * <code>ICompareInputChangeListener</code>. - * - * @param leftToRight if <code>true</code> the left side is copied to the right side. - * If <code>false</code> the right side is copied to the left side - */ - void copy(boolean leftToRight); -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInputChangeListener.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInputChangeListener.java deleted file mode 100644 index e18760f6c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInputChangeListener.java +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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; - -/** - * Listener that gets informed if one (or more) - * of the three sides of an <code>ICompareInput</code> object changes its value. - * <p> - * For example when accepting an incoming addition - * the (non-null) left side of an <code>ICompareInput</code> - * is copied to the right side (which was <code>null</code>). - * This triggers a call to <code>compareInputChanged</code> of registered - * <code>ICompareInputChangeListener</code>. - * <p> - * Note however, that listener are not informed if the content of one of the sides changes. - * <p> - * Clients may implement this interface. It is also implemented by viewers that take - * an <code>ICompareInput</code> as input. - * </p> - */ -public interface ICompareInputChangeListener { - - /** - * Called whenever the value (not the content) of one or more of the three sides - * of a <code>ICompareInput</code> has changed. - * - * @param source the <code>ICompareInput</code> that has changed - */ - void compareInputChanged(ICompareInput source); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffContainer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffContainer.java deleted file mode 100644 index baecfcb14..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffContainer.java +++ /dev/null @@ -1,62 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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; - -/** - * <code>IDiffContainer</code> is a <code>IDiffElement</code> with children. - * <p> - * <code>IDiffContainer</code> are the inner nodes displayed - * by the <code>DiffTreeViewer</code>. - * <code>IDiffContainer</code> are typically created as the result of performing - * a compare with the <code>Differencer</code>. - * <p> - * Clients may implement this interface, or use one of the standard implementations, - * <code>DiffContainer</code> or <code>DiffNode</code>. - * - * @see Differencer - * @see DiffTreeViewer - */ -public interface IDiffContainer extends IDiffElement { - - /** - * Returns whether this container has at least one child. - * In some cases this methods avoids having to call the - * potential more costly <code>getChildren</code> method. - * - * @return <code>true</code> if this container has at least one child - */ - boolean hasChildren(); - - /** - * Returns the children of this container. - * If this container has no children an empty array is returned (not <code>null</code>). - * - * @return the children of this container as an array - */ - IDiffElement[] getChildren(); - - /** - * Adds the given child to this container. - * If the child is already contained in this container, this method has no effect. - * - * @param child the child to be added to this container - */ - void add(IDiffElement child); - - /** - * Removes the given child from this container. - * If the container becomes empty it is removed from its container. - * If the child is not contained in this container, this method has no effect. - * - * @param child the child to be removed from this container - */ - void removeToRoot(IDiffElement child); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffElement.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffElement.java deleted file mode 100644 index a22f0e6e2..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffElement.java +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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 org.eclipse.compare.ITypedElement; - -/** - * An <code>IDiffElement</code> is used in the <code>DiffTreeViewer</code> - * to display the kind of change detected as the result of a two-way or three-way compare. - * <p> - * The base interface <code>ITypedElement</code> provides a name, a type, and an image. - * <code>IDiffElement</code> adds API for maintaining a parent relationship. - * <p> - * <code>DiffTreeViewer</code> works on a tree of <code>IDiffElements</code>. - * Leaf elements must implement the - * <code>IDiffElement</code> interface, inner nodes the <code>IDiffContainer</code> interface. - * <p> - * <code>IDiffElement</code>s are typically created as the result of performing - * a compare with the <code>Differencer</code>. - * <p> - * Clients may implement this interface, or use one of the standard implementations, - * <code>DiffElement</code>, <code>DiffContainer</code>, or <code>DiffNode</code>. - * - * @see DiffTreeViewer - * @see DiffElement - * @see DiffContainer - * @see DiffNode - */ -public interface IDiffElement extends ITypedElement { - - /** - * Returns the kind of difference as defined in <code>Differencer</code>. - * - * @return the kind of difference as defined in <code>Differencer</code> - */ - int getKind(); - - /** - * Returns the parent of this element. - * If the object is the root of a hierarchy <code>null</code> is returned. - * - * @return the parent of this element, or <code>null</code> if the element has no parent - */ - IDiffContainer getParent(); - - /** - * Sets the parent of this element. - * - * @param parent the new parent of this element, or <code>null</code> if this - * element is to have no parent - */ - void setParent(IDiffContainer parent); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureComparator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureComparator.java deleted file mode 100644 index 4bc67670b..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureComparator.java +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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; - -/** - * Interface used to compare hierarchical structures. - * It is used by the differencing engine. - * <p> - * Clients typically implement this interface in an adaptor class which - * wrappers the objects to be compared. - * - * @see org.eclipse.compare.ResourceNode - * @see Differencer - */ -public interface IStructureComparator { - - /** - * Returns an iterator for all children of this object or <code>null</code> - * if there are no children. - * - * @return an array with all children of this object, or an empty array if there are no children - */ - Object[] getChildren(); - - /** - * Returns whether some other object is "equal to" this one - * with respect to a structural comparison. For example, when comparing - * Java class methods, <code>equals</code> would return <code>true</code> - * if two methods have the same signature (the argument names and the - * method body might differ). - * - * @param other the reference object with which to compare - * @return <code>true</code> if this object is the same as the other argument; <code>false</code> otherwise - * @see java.lang.Object#equals - */ - boolean equals(Object other); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator.java deleted file mode 100644 index 71e6b3268..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator.java +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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; - -/** - * Interface used to create a hierarchical structure of - * <code>IStructureComparator</code>s for a given input object. - * In addition, it provides methods for locating a path in the hierarchical structure - * and to map a node of this structure back to the corresponding input object. - * <p> - * Structure creators are used in the following contexts: - * <ul> - * <li> - * the <code>StructureDiffViewer</code> uses an <code>IStructureCreator</code> to - * build two (or three) tree structures of its input elements (method <code>getStructure</code>). - * These trees are then compared with each other by means of the differencing engine and displayed - * with the <code>DiffTreeViewer</code>, - * </li> - * <li> - * the <code>ReplaceWithEditionDialog</code> uses an <code>IStructureCreator</code> - * to map a path back to a range of characters in the textual representation. - * </li> - * </ul> - * A <code>IStructureCreator</code> provides methods for rewriting the tree produced by the differencing - * engine to support "smart" structural differencing. E.g. certain patterns of pairs of "addition" - * and "deletion" nodes can be detected as renames and merged into a single node. - * </p> - * <p> - * Clients may implement this interface; there is no standard implementation. - * </p> - * - * @see StructureDiffViewer - * @see org.eclipse.compare.EditionSelectionDialog - * @see Differencer - */ -public interface IStructureCreator { - - /** - * Returns a descriptive name which can be used in the UI of the <code>StructureDiffViewer</code>. - * - * @return a descriptive name for this <code>IStructureCreator</code> - */ - String getName(); - - /** - * Creates a tree structure consisting of <code>IStructureComparator</code>s - * from the given object and returns its root object. - * Implementing this method typically involves parsing the input object. - * In case of an error (e.g. a parsing error) the value <code>null</code> is returned. - * - * @param input the object from which to create the tree of <code>IStructureComparator</code> - * @return the root node of the structure or <code>null</code> in case of error - */ - IStructureComparator getStructure(Object input); - - /** - * Creates the single node specified by path from the given input object. - * In case of an error (e.g. a parsing error) the value <code>null</code> is returned. - * This method is similar to <code>getStructure</code> but in - * contrast to <code>getStructure</code> only a single node without any children must be returned. - * This method is used in the <code>ReplaceWithEditionDialog</code> to locate a sub element - * (e.g. a method) within an input object (e.g. a file containing source code). - * <p> - * One (not optimized) approach to implement this method is calling <code>getStructure(input)</code> - * to build the full tree, and then finding that node within the tree that is specified - * by <code>path</code>. - * <p> - * The syntax of <code>path</code> is not specified, because it is treated by the compare subsystem - * as an opaque entity and is not further interpreted. Clients using this functionality - * will pass a value of <code>path</code> to the <code>selectEdition</code> - * method of <code>ReplaceWithEditionDialog</code> and will receive this value unchanged - * as an argument to <code>locate</code>. - * - * @param path specifies a sub object within the input object - * @param input the object from which to create the <code>IStructureComparator</code> - * @return the single node specified by <code>path</code> or <code>null</code> - * - */ - IStructureComparator locate(Object path, Object input); - - /** - * Returns the contents of the given node as a string for the purpose - * of performing a content comparison only (that is the string will not be visible in the UI). - * If <code>ignoreWhitespace</code> is <code>true</code> all character sequences considered - * whitespace should be removed from the returned string. - * - * @param node the node for which to return a string representation - * @param ignoreWhitespace if <code>true</code> the returned string should not contain whitespace - * @return the string contents of the given node - */ - String getContents(Object node, boolean ignoreWhitespace); - - /** - * Called whenever a copy operation has been performed on a tree node. - * - * @param node the node for which to save the new content - * @param input the object from which the structure tree was created in <code>getStructure</code> - */ - void save(IStructureComparator node, Object input); -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator2.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator2.java deleted file mode 100644 index 55bdf7914..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator2.java +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2007 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 org.eclipse.compare.ISharedDocumentAdapter; -import org.eclipse.compare.ITypedElement; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; - -/** - * An extension to the {@link IStructureCreator} interface that supports the - * use of shared documents. - * <p> - * This interface is not intended to be implemented by clients. Client should instead - * subclass {@link StructureCreator}. - * </p> - * @since 3.3 - */ -public interface IStructureCreator2 extends IStructureCreator { - - /** - * Creates a tree structure consisting of <code>IStructureComparator</code>s - * from the given object and returns its root object. Implementing this - * method typically involves parsing the input object. In case of an error - * (e.g. a parsing error) the value <code>null</code> is returned. - * <p> - * This method is equivalent to - * {@link IStructureCreator#getStructure(Object)} with the exception that - * the {@link #destroy(Object)} method must be called with the returned - * comparator as a parameter when the comparator is no longer - * needed. This is done to allow structure creators - * to make use of shared resources such a file buffer. - * <p> - * Also, the node returned from this method should adapt to an - * {@link ISharedDocumentAdapter} if the provided input has - * a shared document adapter and it is being used by the - * this creator. The convenience class {@link SharedDocumentAdapterWrapper} - * is provided to allow the creator to wrap the adapter of the input - * so that the proper key can be returned. - * - * @param input - * the object from which to create the tree of - * <code>IStructureComparator</code> - * @param monitor a progress monitor or <code>null</code> if progress and cancelation is not required - * @return the root node of the structure or <code>null</code> in case of - * error - * @throws CoreException - * @see IStructureCreator#getStructure(Object) - * @see #destroy(Object) - */ - IStructureComparator createStructure(Object input, IProgressMonitor monitor) throws CoreException; - - /** - * Creates the single node specified by path from the given input object. - * This method is equivalent to - * {@link IStructureCreator#locate(Object, Object)} with the exception that - * the {@link #destroy(Object)} method must be called with the returned - * element as a parameter when the element is no longer - * needed. This is done to allow structure creators - * to make use of shared resources such a file buffer. - * - * @param element specifies a sub object within the input object - * @param input the object from which to create the - * <code>ITypedElement</code> - * @param monitor a progress monitor or <code>null</code> if progress is not desired - * @return the single node specified by <code>path</code> or - * <code>null</code> - * @throws CoreException if an error occurs while parsing the input - * - * @see IStructureCreator#locate(Object, Object) - * @see #destroy(Object) - */ - ITypedElement createElement(Object element, Object input, IProgressMonitor monitor) throws CoreException; - - /** - * Release any resources associated with the given object. - * This method must be called for objects returned from either - * {@link #createStructure(Object, IProgressMonitor)} or - * {@link #createElement(Object, Object, IProgressMonitor)}. - * @param object the object to be destroyed - * @see #createElement(Object, Object, IProgressMonitor) - * @see #createStructure(Object, IProgressMonitor) - */ - void destroy(Object object); -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/SharedDocumentAdapterWrapper.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/SharedDocumentAdapterWrapper.java deleted file mode 100644 index b1fcd0ff0..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/SharedDocumentAdapterWrapper.java +++ /dev/null @@ -1,104 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2007 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 org.eclipse.compare.ISharedDocumentAdapter; -import org.eclipse.compare.SharedDocumentAdapter; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.core.runtime.*; -import org.eclipse.jface.text.IDocument; -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.texteditor.IDocumentProvider; - -/** - * An implementation of {@link ISharedDocumentAdapter} that wraps another - * shared document adapter. - * <p> - * Clients may subclass this class. - * </p> - * @since 3.3 - */ -public class SharedDocumentAdapterWrapper implements ISharedDocumentAdapter { - - private ISharedDocumentAdapter wrappedAdapter; - - /** - * Helper method that returns the shared document adapter for the - * given typed element or <code>null</code> if there isn't one. - * @param element the typed element - * @return the shared document adapter for the given typed element - * or <code>null</code> - */ - public static ISharedDocumentAdapter getAdapter(Object element) { - return (ISharedDocumentAdapter)Utilities.getAdapter(element, ISharedDocumentAdapter.class, true); - } - - /** - * Create a shared document adapter that wraps the given adapter. - * @param wrappedAdapter the wrapped adapter - */ - public SharedDocumentAdapterWrapper(ISharedDocumentAdapter wrappedAdapter) { - super(); - this.wrappedAdapter = wrappedAdapter; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ISharedDocumentAdapter#connect(org.eclipse.ui.texteditor.IDocumentProvider, org.eclipse.ui.IEditorInput) - */ - public void connect(IDocumentProvider provider, IEditorInput documentKey) - throws CoreException { - wrappedAdapter.connect(provider, documentKey); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ISharedDocumentAdapter#disconnect(org.eclipse.ui.texteditor.IDocumentProvider, org.eclipse.ui.IEditorInput) - */ - public void disconnect(IDocumentProvider provider, IEditorInput documentKey) { - wrappedAdapter.disconnect(provider, documentKey); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ISharedDocumentAdapter#getDocumentKey(java.lang.Object) - */ - public IEditorInput getDocumentKey(Object element) { - return wrappedAdapter.getDocumentKey(element); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ISharedDocumentAdapter#saveDocument(org.eclipse.ui.texteditor.IDocumentProvider, org.eclipse.ui.IEditorInput, org.eclipse.jface.text.IDocument, boolean, org.eclipse.core.runtime.IProgressMonitor) - */ - public void flushDocument(IDocumentProvider provider, - IEditorInput documentKey, IDocument document, boolean overwrite) throws CoreException { - wrappedAdapter.flushDocument(provider, documentKey, document, overwrite); - } - - /** - * Return the wrapped adapter. - * @return the wrapped adapter - */ - public final ISharedDocumentAdapter getWrappedAdapter() { - return wrappedAdapter; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ISharedDocumentAdapter#disconnect(java.lang.Object) - */ - public void disconnect(Object element) { - IEditorInput input = getDocumentKey(element); - if (input == null) - return; - IDocumentProvider provider = SharedDocumentAdapter.getDocumentProvider(input); - if (provider == null) - return; - disconnect(provider, input); - } - -} 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; - } -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java deleted file mode 100644 index 4b8700659..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java +++ /dev/null @@ -1,682 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 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.lang.reflect.InvocationTargetException; - -import org.eclipse.compare.*; -import org.eclipse.compare.contentmergeviewer.IDocumentRange; -import org.eclipse.compare.internal.*; -import org.eclipse.core.runtime.*; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.text.BadPositionCategoryException; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.swt.custom.BusyIndicator; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.widgets.*; -import org.eclipse.ui.services.IDisposable; - - -/** - * A diff tree viewer that can be configured with a <code>IStructureCreator</code> - * to retrieve a hierarchical structure from the input object (an <code>ICompareInput</code>) - * and perform a two-way or three-way compare on it. - * <p> - * This class may be instantiated; it is not intended to be subclassed outside - * this package. - * </p> - * - * @see IStructureCreator - * @see ICompareInput - * @noextend This class is not intended to be subclassed by clients. - */ - -public class StructureDiffViewer extends DiffTreeViewer { - private Differencer fDifferencer; - private boolean fThreeWay= false; - - private StructureInfo fAncestorStructure = new StructureInfo(); - private StructureInfo fLeftStructure = new StructureInfo(); - private StructureInfo fRightStructure = new StructureInfo(); - - private IStructureCreator fStructureCreator; - private IDiffContainer fRoot; - private IContentChangeListener fContentChangedListener; - private CompareViewerSwitchingPane fParent; - private ICompareInputChangeListener fCompareInputChangeListener; - - /* - * A set of background tasks for updating the structure - */ - private IRunnableWithProgress diffTask = new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException, - InterruptedException { - monitor.beginTask(CompareMessages.StructureDiffViewer_0, 100); - diff(new SubProgressMonitor(monitor, 100)); - monitor.done(); - } - }; - - private IRunnableWithProgress inputChangedTask = new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException, - InterruptedException { - monitor.beginTask(CompareMessages.StructureDiffViewer_1, 100); - // TODO: Should we always force - compareInputChanged((ICompareInput)getInput(), true, new SubProgressMonitor(monitor, 100)); - monitor.done(); - } - }; - - /* - * A helper class for holding the input and generated structure - * for the ancestor, left and right inputs. - */ - private class StructureInfo { - private ITypedElement fInput; - private IStructureComparator fStructureComparator; - private IRunnableWithProgress refreshTask = new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException, - InterruptedException { - refresh(monitor); - } - }; - - public boolean setInput(ITypedElement newInput, boolean force, IProgressMonitor monitor) { - boolean changed = false; - if (force || newInput != fInput) { - removeDocumentRangeUpdaters(); - if (fInput instanceof IContentChangeNotifier && fContentChangedListener != null) - ((IContentChangeNotifier)fInput).removeContentChangeListener(fContentChangedListener); - fInput= newInput; - if (fInput == null) { - dispose(); // destroy fStructureComparator - fStructureComparator= null; - } else { - refresh(monitor); - changed= true; - } - if (fInput instanceof IContentChangeNotifier && fContentChangedListener != null) - ((IContentChangeNotifier)fInput).addContentChangeListener(fContentChangedListener); - } - return changed; - } - - /** - * Remove any document range updaters that were registered against the document. - */ - private void removeDocumentRangeUpdaters() { - if (fStructureComparator instanceof IDocumentRange) { - IDocument doc = ((IDocumentRange) fStructureComparator).getDocument(); - try { - doc.removePositionCategory(IDocumentRange.RANGE_CATEGORY); - } catch (BadPositionCategoryException ex) { - // Ignore - } - } - } - - public IStructureComparator getStructureComparator() { - return fStructureComparator; - } - - public void refresh(IProgressMonitor monitor) { - IStructureComparator oldComparator = fStructureComparator; - fStructureComparator= createStructure(monitor); - // Dispose of the old one after in case they are using a shared document - // (i.e. disposing it after will hold on to a reference to the document - // so it doesn't get freed and reloaded) - if (oldComparator instanceof IDisposable) { - IDisposable disposable = (IDisposable) oldComparator; - disposable.dispose(); - } - } - - public Object getInput() { - return fInput; - } - - private IStructureComparator createStructure(IProgressMonitor monitor) { - // Defend against concurrent disposal - Object input = fInput; - if (input == null) - return null; - if (fStructureCreator instanceof IStructureCreator2) { - IStructureCreator2 sc2 = (IStructureCreator2) fStructureCreator; - try { - return sc2.createStructure(input, monitor); - } catch (CoreException e) { - CompareUIPlugin.log(e); - } - } - return fStructureCreator.getStructure(input); - } - - public void dispose() { - if (fStructureComparator != null && fStructureCreator instanceof IStructureCreator2) { - IStructureCreator2 sc2 = (IStructureCreator2) fStructureCreator; - sc2.destroy(fStructureComparator); - } - } - - public IRunnableWithProgress getRefreshTask() { - return refreshTask; - } - } - - /** - * Creates a new viewer for the given SWT tree control with the specified configuration. - * - * @param tree the tree control - * @param configuration the configuration for this viewer - */ - public StructureDiffViewer(Tree tree, CompareConfiguration configuration) { - super(tree, configuration); - Composite c= tree.getParent(); - if (c instanceof CompareViewerSwitchingPane) - fParent= (CompareViewerSwitchingPane) c; - initialize(); - } - - /** - * Creates a new viewer under the given SWT parent with the specified configuration. - * - * @param parent the SWT control under which to create the viewer - * @param configuration the configuration for this viewer - */ - public StructureDiffViewer(Composite parent, CompareConfiguration configuration) { - super(parent, configuration); - if (parent instanceof CompareViewerSwitchingPane) - fParent= (CompareViewerSwitchingPane) parent; - initialize(); - } - - private void initialize() { - - setAutoExpandLevel(3); - - fContentChangedListener= new IContentChangeListener() { - public void contentChanged(IContentChangeNotifier changed) { - StructureDiffViewer.this.contentChanged(changed); - } - }; - fCompareInputChangeListener = new ICompareInputChangeListener() { - public void compareInputChanged(ICompareInput input) { - StructureDiffViewer.this.compareInputChanged(input, true); - } - }; - } - - /** - * Configures the <code>StructureDiffViewer</code> with a structure creator. - * The structure creator is used to create a hierarchical structure - * for each side of the viewer's input element of type <code>ICompareInput</code>. - * - * @param structureCreator the new structure creator - */ - public void setStructureCreator(IStructureCreator structureCreator) { - if (fStructureCreator != structureCreator) { - fStructureCreator= structureCreator; - Control tree= getControl(); - if (tree != null && !tree.isDisposed()) - tree.setData(CompareUI.COMPARE_VIEWER_TITLE, getTitle()); - } - } - - /** - * Returns the structure creator or <code>null</code> if no - * structure creator has been set with <code>setStructureCreator</code>. - * - * @return the structure creator or <code>null</code> - */ - public IStructureCreator getStructureCreator() { - return fStructureCreator; - } - - /** - * Reimplemented to get the descriptive title for this viewer from the <code>IStructureCreator</code>. - * @return the viewer's name - */ - public String getTitle() { - if (fStructureCreator != null) - return fStructureCreator.getName(); - return super.getTitle(); - } - - /** - * Overridden because the input of this viewer is not identical to the root of the tree. - * The tree's root is a IDiffContainer that was returned from the method <code>diff</code>. - * - * @return the root of the diff tree produced by method <code>diff</code> - */ - protected Object getRoot() { - return fRoot; - } - - /* - * (non-Javadoc) Method declared on StructuredViewer. - * Overridden to create the comparable structures from the input object - * and to feed them through the differencing engine. Note: for this viewer - * the value from <code>getInput</code> is not identical to <code>getRoot</code>. - */ - protected void inputChanged(Object input, Object oldInput) { - if (oldInput instanceof ICompareInput) { - ICompareInput old = (ICompareInput) oldInput; - old.removeCompareInputChangeListener(fCompareInputChangeListener); - } - if (input instanceof ICompareInput) { - ICompareInput ci = (ICompareInput) input; - ci.addCompareInputChangeListener(fCompareInputChangeListener); - compareInputChanged(ci); - if (input != oldInput) - initialSelection(); - } - } - - protected void initialSelection() { - expandToLevel(2); - } - - /* (non Javadoc) - * Overridden to unregister all listeners. - */ - protected void handleDispose(DisposeEvent event) { - Object input = getInput(); - if (input instanceof ICompareInput) { - ICompareInput ci = (ICompareInput) input; - ci.removeCompareInputChangeListener(fCompareInputChangeListener); - } - compareInputChanged(null); - fContentChangedListener= null; - super.handleDispose(event); - } - - /** - * Recreates the comparable structures for the input sides. - * @param input this viewer's new input - */ - protected void compareInputChanged(ICompareInput input) { - compareInputChanged(input, false); - } - - /* package */ void compareInputChanged(final ICompareInput input, final boolean force) { - if (input == null) { - // When closing, we don't need a progress monitor to handle the input change - compareInputChanged(input, force, null); - return; - } - CompareConfiguration cc = getCompareConfiguration(); - // The compare configuration is nulled when the viewer is disposed - if (cc != null) { - BusyIndicator.showWhile(Display.getDefault(), new Runnable() { - public void run() { - try { - inputChangedTask.run(new NullProgressMonitor()); - } catch (InvocationTargetException e) { - CompareUIPlugin.log(e.getTargetException()); - } catch (InterruptedException e) { - // Ignore - } - } - }); - } - } - - /* package */ void compareInputChanged(ICompareInput input, boolean force, IProgressMonitor monitor) { - ITypedElement t= null; - boolean changed= false; - - if (input != null) - t= input.getAncestor(); - fThreeWay= (t != null); - beginWork(monitor, 400); - try { - if (fAncestorStructure.setInput(t, force, subMonitor(monitor, 100))) - changed = true; - - if (input != null) - t= input.getLeft(); - if (fLeftStructure.setInput(t, force, subMonitor(monitor, 100))) - changed = true; - - if (input != null) - t= input.getRight(); - if (fRightStructure.setInput(t, force, subMonitor(monitor, 100))) - changed = true; - - // The compare configuration is nulled when the viewer is disposed - CompareConfiguration cc = getCompareConfiguration(); - if (changed && cc != null) - cc.getContainer().runAsynchronously(diffTask); - } finally { - endWork(monitor); - } - } - - private void endWork(IProgressMonitor monitor) { - if (monitor != null) - monitor.done(); - } - - private IProgressMonitor subMonitor(IProgressMonitor monitor, int work) { - if (monitor != null) { - if (monitor.isCanceled() || getControl().isDisposed()) - throw new OperationCanceledException(); - return new SubProgressMonitor(monitor, work); - } - return null; - } - - private void beginWork(IProgressMonitor monitor, int totalWork) { - if (monitor != null) - monitor.beginTask(null, totalWork); - } - - /** - * Calls <code>diff</code> whenever the byte contents changes. - * @param changed the object that sent out the notification - */ - protected void contentChanged(final IContentChangeNotifier changed) { - - if (fStructureCreator == null) - return; - - if (changed == null) { - getCompareConfiguration().getContainer().runAsynchronously(fAncestorStructure.getRefreshTask()); - getCompareConfiguration().getContainer().runAsynchronously(fLeftStructure.getRefreshTask()); - getCompareConfiguration().getContainer().runAsynchronously(fRightStructure.getRefreshTask()); - } else if (changed == fAncestorStructure.getInput()) { - getCompareConfiguration().getContainer().runAsynchronously(fAncestorStructure.getRefreshTask()); - } else if (changed == fLeftStructure.getInput()) { - getCompareConfiguration().getContainer().runAsynchronously(fLeftStructure.getRefreshTask()); - } else if (changed == fRightStructure.getInput()) { - getCompareConfiguration().getContainer().runAsynchronously(fRightStructure.getRefreshTask()); - } else { - return; - } - getCompareConfiguration().getContainer().runAsynchronously(diffTask); - } - - /** - * This method is called from within <code>diff()</code> before the - * difference tree is being built. Clients may override this method to - * perform their own pre-processing. This default implementation does - * nothing. - * - * @param ancestor the ancestor input to the differencing operation - * @param left the left input to the differencing operation - * @param right the right input to the differencing operation - * @since 2.0 - * @deprecated Clients should override - * {@link #preDiffHook(IStructureComparator, IStructureComparator, IStructureComparator, IProgressMonitor)} - */ - protected void preDiffHook(IStructureComparator ancestor, IStructureComparator left, IStructureComparator right) { - // we do nothing here - } - - /** - * This method is called from within {@link #diff(IProgressMonitor)} before - * the difference tree is being built. This method may be called from a - * background (non-UI) thread). - * <p> - * For backwards compatibility, this default implementation calls - * {@link #preDiffHook(IStructureComparator, IStructureComparator, IStructureComparator)} - * from the UI thread. Clients should override this method even if they - * don't perform pre-processing to avoid the call to the UI thread. - * - * @param ancestor the ancestor input to the differencing operation - * @param left the left input to the differencing operation - * @param right the right input to the differencing operation - * @param monitor a progress monitor or null if progress is not required - * @since 3.3 - */ - protected void preDiffHook(final IStructureComparator ancestor, final IStructureComparator left, final IStructureComparator right, IProgressMonitor monitor) { - syncExec(new Runnable() { - public void run() { - preDiffHook(ancestor, left, right); - } - }); - } - - /** - * Runs the difference engine and refreshes the tree. This method may be called - * from a background (non-UI) thread). - * @param monitor a progress monitor or <code>null</code> if progress in not required - */ - protected void diff(IProgressMonitor monitor) { - try { - beginWork(monitor, 150); - - IStructureComparator ancestorComparator = fAncestorStructure.getStructureComparator(); - IStructureComparator leftComparator = fLeftStructure.getStructureComparator(); - IStructureComparator rightComparator = fRightStructure.getStructureComparator(); - - preDiffHook(ancestorComparator, - leftComparator, - rightComparator, - subMonitor(monitor, 25)); - - String message= null; - - if ((fThreeWay && ancestorComparator == null) || leftComparator == null || rightComparator == null) { - // could not get structure of one (or more) of the legs - fRoot= null; - message= CompareMessages.StructureDiffViewer_StructureError; - - } else { // calculate difference of the two (or three) structures - - if (fDifferencer == null) - fDifferencer= new Differencer() { - protected boolean contentsEqual(Object o1, Object o2) { - return StructureDiffViewer.this.contentsEqual(o1, o2); - } - protected Object visit(Object data, int result, Object ancestor, Object left, Object right) { - Object o= super.visit(data, result, ancestor, left, right); - if (fLeftIsLocal && o instanceof DiffNode) - ((DiffNode)o).swapSides(fLeftIsLocal); - return o; - } - }; - - fRoot= (IDiffContainer) fDifferencer.findDifferences(fThreeWay, subMonitor(monitor, 100), null, - ancestorComparator, leftComparator, rightComparator); - - if (fRoot == null || fRoot.getChildren().length == 0) { - message= CompareMessages.StructureDiffViewer_NoStructuralDifferences; - } else { - postDiffHook(fDifferencer, fRoot, subMonitor(monitor, 25)); - } - } - - if (Display.getCurrent() != null) - refreshAfterDiff(message); - else { - final String theMessage = message; - Display.getDefault().asyncExec(new Runnable() { - public void run() { - refreshAfterDiff(theMessage); - } - }); - } - } finally { - endWork(monitor); - } - } - - private void refreshAfterDiff(String message) { - if (getControl().isDisposed()) - return; - if (fParent != null) - fParent.setTitleArgument(message); - - refresh(getRoot()); - // Setting the auto-expand level doesn't do anything for refreshes - expandToLevel(3); - } - - /** - * Runs the difference engine and refreshes the tree. - */ - protected void diff() { - try { - CompareConfiguration compareConfiguration = getCompareConfiguration(); - // A null compare configuration indicates that the viewer was disposed - if (compareConfiguration != null) { - compareConfiguration.getContainer().run(true, true, new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - monitor.beginTask(CompareMessages.StructureDiffViewer_2, 100); - diffTask.run(new SubProgressMonitor(monitor, 100)); - monitor.done(); - } - }); - } - } catch (InvocationTargetException e) { - // Shouldn't happen since the run doesn't throw - CompareUIPlugin.log(e.getTargetException()); - handleFailedRefresh(e.getTargetException().getMessage()); - } catch (InterruptedException e) { - // Canceled by user - handleFailedRefresh(CompareMessages.StructureDiffViewer_3); - } - } - - private void handleFailedRefresh(final String message) { - Runnable runnable = new Runnable() { - public void run() { - if (getControl().isDisposed()) - return; - refreshAfterDiff(message); - } - }; - if (Display.getCurrent() != null) - runnable.run(); - else - Display.getDefault().asyncExec(runnable); - } - - /** - * This method is called from within <code>diff()</code> after the - * difference tree has been built. Clients may override this method to - * perform their own post-processing. This default implementation does - * nothing. - * - * @param differencer the differencer used to perform the differencing - * @param root the non-<code>null</code> root node of the difference tree - * @since 2.0 - * @deprecated Subclasses should override - * {@link #postDiffHook(Differencer, IDiffContainer, IProgressMonitor)} - * instead - */ - protected void postDiffHook(Differencer differencer, IDiffContainer root) { - // we do nothing here - } - - /** - * This method is called from within {@link #diff(IProgressMonitor)} after - * the difference tree has been built. This method may be called from a - * background (non-UI) thread). - * <p> - * For backwards compatibility, this default implementation calls - * {@link #postDiffHook(Differencer, IDiffContainer)} from the UI thread. - * Clients should override this method even if they don't perform post - * processing to avoid the call to the UI thread. - * - * @param differencer the differencer used to perform the differencing - * @param root the non-<code>null</code> root node of the difference tree - * @param monitor a progress monitor or <code>null</code> if progress is - * not required - * @since 3.3 - */ - protected void postDiffHook(final Differencer differencer, final IDiffContainer root, IProgressMonitor monitor) { - syncExec(new Runnable() { - public void run() { - postDiffHook(differencer, root); - } - }); - } - - /* - * Performs a byte compare on the given objects. - * Called from the difference engine. - * Returns <code>null</code> if no structure creator has been set. - */ - private boolean contentsEqual(Object o1, Object o2) { - if (fStructureCreator != null) { - boolean ignoreWhiteSpace= Utilities.getBoolean(getCompareConfiguration(), CompareConfiguration.IGNORE_WHITESPACE, false); - String s1= fStructureCreator.getContents(o1, ignoreWhiteSpace); - String s2= fStructureCreator.getContents(o2, ignoreWhiteSpace); - if (s1 == null || s2 == null) - return false; - return s1.equals(s2); - } - return false; - } - - /** - * Tracks property changes of the configuration object. - * Clients may override to track their own property changes. - * In this case they must call the inherited method. - * @param event the property changed event that triggered the call to this method - */ - protected void propertyChange(PropertyChangeEvent event) { - String key= event.getProperty(); - if (key.equals(CompareConfiguration.IGNORE_WHITESPACE)) { - diff(); - } else if (key.equals("ANCESTOR_STRUCTURE_REFRESH")) { //$NON-NLS-1$ - fAncestorStructure.refresh(new NullProgressMonitor()); - diff(); - } else if (key.equals("LEFT_STRUCTURE_REFRESH")) { //$NON-NLS-1$ - fLeftStructure.refresh(new NullProgressMonitor()); - diff(); - } else if (key.equals("RIGHT_STRUCTURE_REFRESH")) { //$NON-NLS-1$ - fRightStructure.refresh(new NullProgressMonitor()); - diff(); - } else if (key.equals("ALL_STRUCTURE_REFRESH")) { //$NON-NLS-1$ - fAncestorStructure.refresh(new NullProgressMonitor()); - fLeftStructure.refresh(new NullProgressMonitor()); - fRightStructure.refresh(new NullProgressMonitor()); - diff(); - } else { - super.propertyChange(event); - } - } - - /** - * Overridden to call the <code>save</code> method on the structure creator after - * nodes have been copied from one side to the other side of an input object. - * - * @param leftToRight if <code>true</code> the left side is copied to the right side. - * If <code>false</code> the right side is copied to the left side - */ - protected void copySelected(boolean leftToRight) { - super.copySelected(leftToRight); - - if (fStructureCreator != null) - fStructureCreator.save( - leftToRight ? fRightStructure.getStructureComparator() : fLeftStructure.getStructureComparator(), - leftToRight ? fRightStructure.getInput() : fLeftStructure.getInput()); - } - - private void syncExec(final Runnable runnable) { - if (getControl().isDisposed()) - return; - if (Display.getCurrent() != null) - runnable.run(); - else - getControl().getDisplay().syncExec(new Runnable() { - public void run() { - if (!getControl().isDisposed()) - runnable.run(); - } - }); - } -} - diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureRootNode.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureRootNode.java deleted file mode 100644 index 3cc2748de..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureRootNode.java +++ /dev/null @@ -1,156 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2007 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 org.eclipse.compare.*; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.jface.text.IDocument; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.services.IDisposable; - -/** - * A node that acts as the root of the tree returned from a {@link StructureCreator}. - * This node performs the following tasks tasks: - * <ol> - * <li>It adapts to an {@link ISharedDocumentAdapter} that provides the proper - * document key (@see {@link #getAdapter(Class)}).</li> - * <li>It invokes {@link IStructureCreator#save(IStructureComparator, Object)} - * when {@link #nodeChanged(DocumentRangeNode)} is called.</li> - * <li>It disposes of the {@link IDisposable} provided in the constructor when - * {@link #dispose()} is called.</li> - * </ol> - * <p> - * This class may be subclassed by clients. - * - * @since 3.3 - */ -public class StructureRootNode extends DocumentRangeNode implements IDisposable, ITypedElement { - - /** - * The integer constant (value <code>0</code>) that is used as the type code of the root node. - * @see #getTypeCode() - */ - public static final int ROOT_TYPE = 0; - - /** - * The string constant (value <code>"root"</code>) that is used as the id of the root node. - * @see #getId() - */ - public static final String ROOT_ID = "root"; //$NON-NLS-1$ - - private final Object fInput; - private final StructureCreator fCreator; - private ISharedDocumentAdapter fAdapter; - - /** - * Create the structure root node. - * @param document the document - * @param input the input associated with the document - * @param creator the structure creator that is creating the node - * @param adapter the shared document adapter from which the document was obtained or <code>null</code> - * if the document was not obtained from an {@link ISharedDocumentAdapter} - */ - public StructureRootNode(IDocument document, Object input, StructureCreator creator, ISharedDocumentAdapter adapter) { - super(null, ROOT_TYPE, ROOT_ID, document, 0, document.getLength()); - fInput = input; - fCreator = creator; - fAdapter = adapter; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.services.IDisposable#dispose() - */ - public void dispose() { - if (fAdapter != null) { - fAdapter.disconnect(fInput); - } - } - - /** - * Override {@link IAdaptable#getAdapter(Class)} in order to provide - * an {@link ISharedDocumentAdapter} that provides the proper look up key based - * on the input from which this structure node was created. - * @param adapter the adapter class to look up - * @return the object adapted to the given class or <code>null</code> - * @see IAdaptable#getAdapter(Class) - */ - public Object getAdapter(Class adapter) { - if (adapter == ISharedDocumentAdapter.class) { - return fAdapter; - } - return super.getAdapter(adapter); - } - - /** - * Override in order to invoke {@link IStructureCreator#save(IStructureComparator, Object)} when the - * contents of a node have changed. - * @param node the changed node - */ - protected void nodeChanged(DocumentRangeNode node) { - fCreator.save(this, fInput); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.structuremergeviewer.DocumentRangeNode#replace(org.eclipse.compare.ITypedElement, org.eclipse.compare.ITypedElement) - */ - public ITypedElement replace(ITypedElement child, ITypedElement other) { - // TODO: I believe the parent implementation is flawed but didn't to remove - // it in case I was missing something so I overrode it instead - nodeChanged(this); - return child; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ITypedElement#getImage() - */ - public Image getImage() { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ITypedElement#getName() - */ - public String getName() { - return getId(); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.ITypedElement#getType() - */ - public String getType() { - return FOLDER_TYPE; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.structuremergeviewer.DocumentRangeNode#isReadOnly() - */ - public boolean isReadOnly() { - if (fInput instanceof IEditableContentExtension) { - IEditableContentExtension ext = (IEditableContentExtension) fInput; - return ext.isReadOnly(); - } - return super.isReadOnly(); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.structuremergeviewer.DocumentRangeNode#validateEdit(org.eclipse.swt.widgets.Shell) - */ - public IStatus validateEdit(Shell shell) { - if (fInput instanceof IEditableContentExtension) { - IEditableContentExtension ext = (IEditableContentExtension) fInput; - return ext.validateEdit(shell); - } - return super.validateEdit(shell); - } - -} diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/package.html b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/package.html deleted file mode 100644 index 60257a4d8..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/package.html +++ /dev/null @@ -1,79 +0,0 @@ -<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> -<html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> - <meta name="Author" content="IBM"> - <meta name="GENERATOR" content="Mozilla/4.75 [en] (WinNT; U) [Netscape]"> - <title>Package-level Javadoc</title> -</head> -<body> -Provides support for finding and displaying the differences -between hierarchically structured data. -<h2> -Package Specification</h2> - -The class <b>Differencer</b> is a differencing engine for hierarchically -structured data. It takes two or three inputs and performs a two-way or -three-way compare on them. -<p> - -If the input elements to the differencing engine implement the <b>IStructureComparator</b> -interface the engine recursively applies itself to the children of -the input element. Leaf elements must implement the <b>org.eclipse.compare.IStreamContentAccessor</b> -interface so that the differencer can perform a bytewise comparison on their contents. -<p> - -One good example for this is <b>org.eclipse.compare.ResourceNode</b> which implements both interfaces -(and more) for Eclipse workspace resources (org.eclipse.core.resources.IResource). -<p> - -Another example is the <b>DocumentRangeNode</b> which can be used to compare hierarchical structures -that are superimposed on a document, that is where nodes and leafs correspond to ranges in a document -(<b>org.eclipse.compare.contentmergeviewer.IDocumentRange</b>). -<br> -Typically <b>DocumentRangeNode</b>s are created while parsing a document and they represent -the semantic entities of the document (e.g. a Java class, method or field). -The two subclasses <b>JavaNode</b> (in org.eclipse.jdt.internal.ui.compare) -and <b>PropertyNode</b> (in org.eclipse.jdt.internal.ui.compare) are good examples for this. -<p> - -By default the differencing engine returns the result of the compare operation -as a tree of <b>DiffNode</b> objects. However, this can be changed by overriding -a single method of the engine. -<p> - -Every <b>DiffNode</b> describes the changes among the two or three inputs. -<p> - -A tree of <b>DiffNodes</b> can be displayed in a <b>DiffTreeViewer</b>. -The <b>DiffTreeViewer</b> requires that inner nodes of the tree implement -the <b>IDiffContainer</b> interface and leafs the <b>IDiffElement</b> interface. -<p> - -The typical steps to compare hierarchically structured data and to display -the differences would be to: -<ul> -<li> -map the input data into a tree of <b>IStructureComparator</b> and <b>IStreamContentAccessor</b>s,</li> - -<li> -perform the compare operation by means of the <b>Differencer</b>, and</li> - -<li> -feed the differencing result into the <b>DiffTreeViewer</b>.</li> - -</ul> - -The <b>StructureDiffViewer</b> is a specialized <b>DiffTreeViewer</b> -that automates the three steps from above. It takes a single input object -of type <b>ICompareInput</b> from which it retrieves the two or three -input elements to compare. Then it uses a <b>IStructureCreator</b> to -extract a tree of <b>IStructureComparator</b> and <b>IStreamContentAccessor</b> -from them. These trees are then compared with the differencing engine and -the result is displayed in the tree viewer. -<p> - - - -</body> -</html> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/component.xml b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/component.xml deleted file mode 100644 index 4f87b7295..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/component.xml +++ /dev/null @@ -1,71 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<component xmlns="http://eclipse.org/component" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://eclipse.org/component ../component.xsd " - name="Compare Support"> - <plugin id="org.eclipse.compare" /> - - <package name="org.eclipse.compare"> - <type name= "BufferedContent"/> - <type name= "CompareConfiguration"/> - <type name= "CompareEditorInput"/> - <type name= "CompareUI" subclass="false" instantiate="false"/> - <type name= "CompareViewerPane"/> - <type name= "CompareViewerSwitchingPane"/> - <type name= "EditionSelectionDialog" subclass="false"/> - <type name= "HistoryItem" subclass="false"/> - <type name= "ICompareNavigator"/> - <type name= "IContentChangeListener"/> - <type name= "IContentChangeNotifier"/> - <type name= "IEditableContent"/> - <type name= "IEncodedStreamContentAccessor"/> - <type name= "IModificationDate"/> - <type name= "IPropertyChangeNotifier"/> - <type name= "IResourceProvider"/> - <type name= "IStreamContentAccessor"/> - <type name= "IStreamMerger"/> - <type name= "ITypedElement"/> - <type name= "IViewerCreator"/> - <type name= "NavigationAction" subclass="false"/> - <type name= "ResourceNode" subclass="false"/> - <type name= "Splitter"/> - <type name= "ZipFileStructureCreator"/> - </package> - - <package name="org.eclipse.compare.contentmergeviewer"> - <type name= "ContentMergeViewer"/> - <type name= "IDocumentRange"/> - <type name= "IMergeViewerContentProvider"/> - <type name= "ITokenComparator"/> - <type name= "TextMergeViewer"/> - </package> - - <package name="org.eclipse.compare.rangedifferencer"> - <type name= "IRangeComparator"/> - <type name= "RangeDifference" subclass="false" instantiate="false"/> - <type name= "RangeDifferencer" subclass="false"/> - </package> - - <package name="org.eclipse.compare.structuremergeviewer"> - <type name= "DiffContainer"/> - <type name= "DiffElement"/> - <type name= "Differencer"/> - <type name= "DiffNode"/> - <type name= "DiffTreeViewer" subclass="false"/> - <type name= "DocumentRangeNode"/> - <type name= "ICompareInput"/> - <type name= "ICompareInputChangeListener"/> - <type name= "IDiffContainer"/> - <type name= "IDiffElement"/> - <type name= "IStructureComparator"/> - <type name= "IStructureCreator"/> - <type name= "StructureDiffViewer" subclass="false"/> - </package> - - <package name="org.eclipse.compare.patch"> - <type name= "WorkspacePatcherUI" subclass="false" instantiate="false"/> - </package> - - <component-depends unrestricted="true"/> -</component> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/ancestorpane_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/ancestorpane_co.gif Binary files differdeleted file mode 100644 index a021812e0..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/ancestorpane_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copy_l_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copy_l_co.gif Binary files differdeleted file mode 100644 index 172e2a4ea..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copy_l_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copy_r_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copy_r_co.gif Binary files differdeleted file mode 100644 index 4cb42a1db..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copy_r_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copycont_l_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copycont_l_co.gif Binary files differdeleted file mode 100644 index 16539cd9f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copycont_l_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copycont_r_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copycont_r_co.gif Binary files differdeleted file mode 100644 index 036abe05f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copycont_r_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/next_change_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/next_change_nav.gif Binary files differdeleted file mode 100644 index 226805054..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/next_change_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/next_diff_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/next_diff_nav.gif Binary files differdeleted file mode 100644 index 6e9483add..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/next_diff_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/next_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/next_nav.gif Binary files differdeleted file mode 100644 index 8aacf959d..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/next_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/prev_change_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/prev_change_nav.gif Binary files differdeleted file mode 100644 index 3b3b46ed2..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/prev_change_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/prev_diff_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/prev_diff_nav.gif Binary files differdeleted file mode 100644 index 458dbe3fa..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/prev_diff_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/prev_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/prev_nav.gif Binary files differdeleted file mode 100644 index 38841abe9..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/prev_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/smartmode_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/smartmode_co.gif Binary files differdeleted file mode 100644 index 0ddac91a1..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/smartmode_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/syncpane_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/syncpane_co.gif Binary files differdeleted file mode 100644 index 7da48249e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/syncpane_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/twowaycompare_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/twowaycompare_co.gif Binary files differdeleted file mode 100644 index 8cdef204b..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/twowaycompare_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dtool16/conflict_edit.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dtool16/conflict_edit.gif Binary files differdeleted file mode 100644 index 398c71927..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dtool16/conflict_edit.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dtool16/ignorews_edit.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dtool16/ignorews_edit.gif Binary files differdeleted file mode 100644 index 702f0a83b..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dtool16/ignorews_edit.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/ancestorpane_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/ancestorpane_co.gif Binary files differdeleted file mode 100644 index ff06855e7..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/ancestorpane_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copy_l_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copy_l_co.gif Binary files differdeleted file mode 100644 index e029948cf..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copy_l_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copy_r_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copy_r_co.gif Binary files differdeleted file mode 100644 index 0659813a1..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copy_r_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copycont_l_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copycont_l_co.gif Binary files differdeleted file mode 100644 index db2b1e3d5..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copycont_l_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copycont_r_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copycont_r_co.gif Binary files differdeleted file mode 100644 index 9ebd50a9f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copycont_r_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_change_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_change_nav.gif Binary files differdeleted file mode 100644 index 6f7b27759..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_change_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_diff_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_diff_nav.gif Binary files differdeleted file mode 100644 index 79cda1359..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_diff_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_nav.gif Binary files differdeleted file mode 100644 index 072b18445..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_nav_into.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_nav_into.gif Binary files differdeleted file mode 100644 index 75d165bcd..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_nav_into.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_change_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_change_nav.gif Binary files differdeleted file mode 100644 index 3e79ebfa2..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_change_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_diff_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_diff_nav.gif Binary files differdeleted file mode 100644 index d5a96ec97..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_diff_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_nav.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_nav.gif Binary files differdeleted file mode 100644 index 091e88400..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_nav.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_nav_into.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_nav_into.gif Binary files differdeleted file mode 100644 index ea342e6ce..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_nav_into.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/smartmode_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/smartmode_co.gif Binary files differdeleted file mode 100644 index 542dddca3..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/smartmode_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/syncpane_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/syncpane_co.gif Binary files differdeleted file mode 100644 index 2644c2ad6..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/syncpane_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/twowaycompare_co.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/twowaycompare_co.gif Binary files differdeleted file mode 100644 index 12788bafa..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/twowaycompare_co.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/etool16/conflict_edit.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/etool16/conflict_edit.gif Binary files differdeleted file mode 100644 index 48a7d1d58..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/etool16/conflict_edit.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/etool16/ignorews_edit.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/etool16/ignorews_edit.gif Binary files differdeleted file mode 100644 index 0b22e4a1a..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/etool16/ignorews_edit.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/eview16/compare_view.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/eview16/compare_view.gif Binary files differdeleted file mode 100644 index dc549bce8..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/eview16/compare_view.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/day_obj.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/day_obj.gif Binary files differdeleted file mode 100644 index 4fc84e4c3..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/day_obj.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/hunk_obj.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/hunk_obj.gif Binary files differdeleted file mode 100644 index 353b6f38c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/hunk_obj.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/message_info.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/message_info.gif Binary files differdeleted file mode 100644 index b484d9be1..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/message_info.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/resource_obj.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/resource_obj.gif Binary files differdeleted file mode 100644 index 3bd4e3605..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/resource_obj.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/add_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/add_ov.gif Binary files differdeleted file mode 100644 index c123a2b13..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/add_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/chg_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/chg_ov.gif Binary files differdeleted file mode 100644 index 2b1b8d677..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/chg_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confadd_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confadd_ov.gif Binary files differdeleted file mode 100644 index 65101e939..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confadd_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confchg_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confchg_ov.gif Binary files differdeleted file mode 100644 index ee805f9ed..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confchg_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confdel_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confdel_ov.gif Binary files differdeleted file mode 100644 index 980c0f84f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confdel_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/del_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/del_ov.gif Binary files differdeleted file mode 100644 index ef0207c62..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/del_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/error_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/error_ov.gif Binary files differdeleted file mode 100644 index 0bc60689c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/error_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/inadd_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/inadd_ov.gif Binary files differdeleted file mode 100644 index 05a9f5a68..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/inadd_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/inchg_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/inchg_ov.gif Binary files differdeleted file mode 100644 index 12d4a9732..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/inchg_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/indel_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/indel_ov.gif Binary files differdeleted file mode 100644 index 373a68f14..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/indel_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/merged_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/merged_ov.gif Binary files differdeleted file mode 100644 index 874a6dcea..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/merged_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outadd_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outadd_ov.gif Binary files differdeleted file mode 100644 index 63fb2967c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outadd_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outchg_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outchg_ov.gif Binary files differdeleted file mode 100644 index 78321d74d..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outchg_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outdel_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outdel_ov.gif Binary files differdeleted file mode 100644 index 7182e5596..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outdel_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_inadd_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_inadd_ov.gif Binary files differdeleted file mode 100644 index 0ac0cea9e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_inadd_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_inchg_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_inchg_ov.gif Binary files differdeleted file mode 100644 index c330c0c9f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_inchg_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_indel_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_indel_ov.gif Binary files differdeleted file mode 100644 index 5acab6778..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_indel_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outadd_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outadd_ov.gif Binary files differdeleted file mode 100644 index 69607651f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outadd_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outchg_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outchg_ov.gif Binary files differdeleted file mode 100644 index 17ba1af4f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outchg_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outdel_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outdel_ov.gif Binary files differdeleted file mode 100644 index ef6b8b745..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outdel_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/removed_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/removed_ov.gif Binary files differdeleted file mode 100644 index 045d88f09..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/removed_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/warning_ov.gif b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/warning_ov.gif Binary files differdeleted file mode 100644 index 2b2e50fe7..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/warning_ov.gif +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/wizban/applypatch_wizban.png b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/wizban/applypatch_wizban.png Binary files differdeleted file mode 100644 index 30839984c..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/wizban/applypatch_wizban.png +++ /dev/null diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/plugin.properties b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/plugin.properties deleted file mode 100644 index 11d1bdd2d..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/plugin.properties +++ /dev/null @@ -1,231 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2010 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 -############################################################################### -# -# Resource strings for Compare Plug-in -# -pluginName= Compare Support -providerName=Eclipse.org - -# -# Extension point names -# -streamMergers= Stream Merger -structureCreators= Structure Creator -structureMergeViewers= Structure Merge Viewer -contentMergeViewers= Content Merge Viewer -contentViewers= Content Viewer - -# -# CompareUIPlugin -# -CompareUIPlugin.dialogTitle=Compare -CompareUIPlugin.noActiveWorkbenchPage=Cannot find active workbench page -CompareUIPlugin.compareFailed=Compare Failed -CompareUIPlugin.openEditorError=Problems Opening Editor -CompareUIPlugin.noDifferences=There are no differences between the selected inputs. - -CompareUIPlugin.targetIdAttributeMissing=target id attribute ''{0}'' missing -CompareUIPlugin.contentTypeNotFound=content type ''{0}'' not found -CompareUIPlugin.targetNotFound=target ''{0}'' not found -CompareUIPlugin.unexpectedTag=expected tag ''{1}'', got ''{0}'' - -# -# Compare Editor -# -defaultCompareEditor.name= Default Compare Editor -CompareEditor.saveError.title= Save Error -CompareEditor.cantSaveError= Cannot save contents ({0}) -CompareEditor.invalidInput=Invalid input: not a CompareEditorInput -CompareEditor.error.setinput.title=Problem opening input -CompareEditor.error.setinput.message=Cannot open input: - -# -# Commands -# -compareCategory.name= Compare -compareCategory.description= Compare command category - -Command.copyRightToLeft.name= Copy from Right to Left -Command.copyRightToLeft.description= Copy Current Change from Right to Left - -Command.copyLeftToRight.name= Copy from Left to Right -Command.copyLeftToRight.description= Copy Current Change from Left to Right - -Command.copyAllRightToLeft.name= Copy All from Right to Left -Command.copyAllRightToLeft.description= Copy All Changes from Right to Left - -Command.copyAllLeftToRight.name= Copy All from Left to Right -Command.copyAllLeftToRight.description= Copy All Changes from Left to Right - -Command.selectNextChange.name= Select Next Change -Command.selectNextChange.description= Select Next Change - -Command.selectPreviousChange.name= Select Previous Change -Command.selectPreviousChange.description= Select Previous Change - -Command.ignoreWhiteSpace.name= Ignore White Space -Command.ignoreWhiteSpace.description= Ignore white space where applicable - -Command.compareWithOther.name= Compare With Other Resource -Command.compareWithOther.description= Compare resources, clipboard contents or editors - -# -# Context menu & actions -# -CompareWithMenu.label= Comp&are With - -CompareWithEachOtherAction.label= &Each Other -CompareWithEachOtherAction.tooltip= Compare the Selected Resources - -CompareWithOtherResource.label= &Other Resource... -CompareWithOtherResource.tooltip= Open the 'Compare With' Dialog - -CompareWithHistoryAction.label= &Local History... -CompareWithHistoryAction.tooltip= Compare the Selected Resource with Local History - -ReplaceWithMenu.label= Rep&lace With - -ReplaceFromHistoryAction.label= &Local History... -ReplaceFromHistoryAction.tooltip= Replace the Selected Resource with Local History - -ReplaceWithPreviousFromHistoryAction.label= &Previous from Local History -ReplaceWithPreviousFromHistoryAction.tooltip= Replace the Selected Resource with the Previous from Local History - -addFromHistoryAction.label= Restore from Local Histor&y... -addFromHistoryAction.tooltip= Restore Deleted Files from Local History - -# -# Preference Page -# -ComparePreferencePage.name= Compare/Patch - -ComparePreferencePage.generalTab.label= &General - -ComparePreferencePage.structureCompare.label= &Open structure compare automatically -ComparePreferencePage.structureOutline.label= Show structure compare in Outline &view when possible -ComparePreferencePage.showMoreInfo.label= &Show additional compare information in the status line -ComparePreferencePage.ignoreWhitespace.label= Ignore &white space -ComparePreferencePage.saveBeforePatching.label= A&utomatically save dirty editors before browsing patches - -ComparePreferencePage.regex.description=Enter regular expressions used to identify added or removed lines in a patch\n(e.g. '^\\+\\s*\\S' for an added line with at least one word character). -ComparePreferencePage.regexAdded.label=Added lines -ComparePreferencePage.regexRemoved.label=Removed lines - -ComparePreferencePage.filter.description= Enter member names that should be excluded from 'Compare With Each Other'.\nList is comma separated (e.g. '*.class, .project, bin/') -ComparePreferencePage.filter.label= &Filtered Members: -ComparePreferencePage.filter.invalidsegment.error= Filter is invalid: {0} - -ComparePreferencePage.textCompareTab.label= &Text Compare - -ComparePreferencePage.initiallyShowAncestorPane.label= &Initially show ancestor pane -ComparePreferencePage.showPseudoConflicts.label= Show &pseudo conflicts -ComparePreferencePage.synchronizeScrolling.label= Synchronize &scrolling between panes in compare viewers -ComparePreferencePage.useSingleLine.label= Connect &ranges with single line -ComparePreferencePage.highlightTokenChanges.label=&Highlight individual changes -ComparePreferencePage.disableCapping.label=Disable &capping when comparing large documents - -ComparePreferencePage.preview.label= Previe&w: -ComparePreferencePage.ancestor.label= Common Ancestor -ComparePreferencePage.left.label= Local -ComparePreferencePage.right.label= Remote -ComparePreferencePage.backgroundColor1.label= Bac&kground Color: -ComparePreferencePage.backgroundColor2.label= S&ystem Default -ComparePreferencePage.backgroundColor3.label= C&ustom - -# Compare editor contents for Compare preview page -ComparePreferencePage.previewAncestor= 1\n2\n3\nconflicting change\n4\n5 -ComparePreferencePage.previewLeft= 1\n2\noutgoing addition\n3\noutgoing change\n4\npseudo conflict\n5 -ComparePreferencePage.previewRight= 1\nincoming addition\nincoming addition\n2\n3\nincoming change\n4\npseudo conflict\n5 - -ComparePreferencePage.colorAndFontLink=See <a>''{0}''</a> preferences for text compare colors and fonts. - -textCompareAppearance.label=Text Compare - -compareIncomingColor.label= Incoming change color -compareIncomingColor.description= The color used to indicate an incoming change in compare and merge tools. -compareOutgoingColor.label= Outgoing change color -compareOutgoingColor.description= The color used to indicate an outgoing change in compare and merge tools. -compareConflictColor.label= Conflicting change color -compareConflictColor.description= The color used to indicate a conflicting change in compare and merge tools. -compareResolvedColor.label= Resolved change color -compareResolvedColor.description= The color used to indicate a resolved change in merge tools. - -compareFontDefiniton.label= Compare text font -compareFontDefiniton.description= The compare text font is used by textual compare/merge tools. - - -preferenceKeywords.general=merge merging whitespace filter synchronize scrolling ancestor conflict line pseudo navigation next previous - -# New UI -#ComparePreferencePage.useSplines.label= Use splines in center panel -#ComparePreferencePage.useResolveUI.label= Use new resolve UI - -CompareEditorInput.defaultTitle= Compare - -# -# Toolbar actions -# -action.IgnoreWhiteSpace.label=Ignore White Space -action.IgnoreWhiteSpace.tooltip=Ignore White Space Where Applicable -action.IgnoreWhiteSpace.image=etool16/ignorews_edit.gif - -action.Next.label=Next Difference -action.Next.tooltip=Next Difference -action.Next.image=elcl16/next_diff_nav.gif - -action.Previous.label=Previous Difference -action.Previous.tooltip=Previous Difference -action.Previous.image=elcl16/prev_diff_nav.gif - -# -# Built in Structure Creators -# -ZipStructureCreator.name=Zip Archive Compare - -# -# Compare With Each Other -# -ResourceCompare.taskName=Operation in Progress... -ResourceCompare.twoWay.title=Compare (''{0}'' - ''{1}'') -ResourceCompare.twoWay.tooltip=Two-way compare of ''{0}'' with ''{1}'' -ResourceCompare.threeWay.title=Compare (''{0}'' - ''{1}'' - ''{2}'') -ResourceCompare.threeWay.tooltip=Three-way compare of ''{1}'' and ''{2}'' relative to common ancestor ''{0}'' - -# -# DiffTreeViewer & DiffNodes -# -DiffTreeViewer.title= Structure Compare -DiffNode.noName= <no name> -DiffNode.nameFormat= {0} / {1} - -# -# Differencing engine -# -Differencer.progressFormat= Comparing {0} - -# -# Patch: rejected patch markers -# -rejectedPatchMarker.name= Rejected Patch - -# -# ValidateEdit -# -ValidateEdit.error.unable_to_perform= Operation cannot be performed. -ValidateEdit.error.fileModified= File ''{0}'' has been modified since the beginning of the operation. -ValidateEdit.error.stillReadonly= File ''{0}'' is read-only. - -context.description = Comparing in an Editor -context.name = Comparing in an Editor - -BinaryCompare.label=Binary Compare -TextCompare.label=Text Compare -ImageCompare.label=Image Compare diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/plugin.xml b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/plugin.xml deleted file mode 100644 index 55dd5056e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/plugin.xml +++ /dev/null @@ -1,354 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<?eclipse version="3.0"?> -<plugin> - -<!-- Compare extension point definitions --> - <extension-point id="streamMergers" name="%streamMergers" schema="schema/streamMergers.exsd"/> - <extension-point id="structureCreators" name="%structureCreators" schema="schema/structureCreators.exsd"/> - <extension-point id="structureMergeViewers" name="%structureMergeViewers" schema="schema/structureMergeViewers.exsd"/> - <extension-point id="contentMergeViewers" name="%contentMergeViewers" schema="schema/contentMergeViewers.exsd"/> - <extension-point id="contentViewers" name="%contentViewers" schema="schema/contentViewers.exsd"/> - -<!-- Extensions --> - <extension - point="org.eclipse.ui.themes"> - <themeElementCategory - label="%textCompareAppearance.label" - id="org.eclipse.compare.contentmergeviewer.TextMergeViewer"> - </themeElementCategory> - <colorDefinition - label="%compareIncomingColor.label" - categoryId="org.eclipse.compare.contentmergeviewer.TextMergeViewer" - value="COLOR_BLUE" - id="INCOMING_COLOR"> - <description> - %compareIncomingColor.description - </description> - </colorDefinition> - <colorDefinition - label="%compareOutgoingColor.label" - categoryId="org.eclipse.compare.contentmergeviewer.TextMergeViewer" - value="COLOR_BLACK" - id="OUTGOING_COLOR"> - <description> - %compareOutgoingColor.description - </description> - </colorDefinition> - <colorDefinition - label="%compareConflictColor.label" - categoryId="org.eclipse.compare.contentmergeviewer.TextMergeViewer" - value="COLOR_RED" - id="CONFLICTING_COLOR"> - <description> - %compareConflictColor.description - </description> - </colorDefinition> - <colorDefinition - label="%compareResolvedColor.label" - categoryId="org.eclipse.compare.contentmergeviewer.TextMergeViewer" - value="COLOR_GREEN" - id="RESOLVED_COLOR"> - <description> - %compareResolvedColor.description - </description> - </colorDefinition> - <fontDefinition - label="%compareFontDefiniton.label" - defaultsTo="org.eclipse.jface.textfont" - categoryId="org.eclipse.compare.contentmergeviewer.TextMergeViewer" - id="org.eclipse.compare.contentmergeviewer.TextMergeViewer"> - <description> - %compareFontDefiniton.description - </description> - </fontDefinition> - </extension> - - <extension - id="rejectedPatchMarker" - name="%rejectedPatchMarker.name" - point="org.eclipse.core.resources.markers"> - <super - type="org.eclipse.core.resources.taskmarker"> - </super> - <persistent - value="true"> - </persistent> - </extension> - <extension - point="org.eclipse.ui.editors"> - <editor - name="%defaultCompareEditor.name" - icon="$nl$/icons/full/eview16/compare_view.gif" - contributorClass="org.eclipse.compare.internal.CompareEditorContributor" - class="org.eclipse.compare.internal.CompareEditor" - id="org.eclipse.compare.CompareEditor"> - </editor> - </extension> - - <extension - point="org.eclipse.ui.preferencePages"> - <page - name="%ComparePreferencePage.name" - category="org.eclipse.ui.preferencePages.Workbench" - class="org.eclipse.compare.internal.ComparePreferencePage" - id="org.eclipse.compare.internal.ComparePreferencePage"> - <keywordReference id="org.eclipse.compare.general"/> - </page> - </extension> - - <extension - point="org.eclipse.ui.keywords"> - <keyword - label="%preferenceKeywords.general" - id="org.eclipse.compare.general"/> - </extension> - -<!-- commands and their bindings --> - - <extension - point="org.eclipse.ui.contexts"> - <context - name="%context.name" - description="%context.description" - parentId="org.eclipse.ui.contexts.window" - id="org.eclipse.compare.compareEditorScope"> - </context> - </extension> - - <extension - point="org.eclipse.ui.commands"> - <category - name="%compareCategory.name" - description="%compareCategory.description" - id="org.eclipse.compare.ui.category.compare"> - </category> - <command - name="%Command.copyRightToLeft.name" - description="%Command.copyRightToLeft.description" - categoryId="org.eclipse.compare.ui.category.compare" - id="org.eclipse.compare.copyRightToLeft"> - </command> - <command - name="%Command.copyLeftToRight.name" - description="%Command.copyLeftToRight.description" - categoryId="org.eclipse.compare.ui.category.compare" - id="org.eclipse.compare.copyLeftToRight"> - </command> - <command - name="%Command.copyAllRightToLeft.name" - description="%Command.copyAllRightToLeft.description" - categoryId="org.eclipse.compare.ui.category.compare" - id="org.eclipse.compare.copyAllRightToLeft"> - </command> - <command - name="%Command.copyAllLeftToRight.name" - description="%Command.copyAllLeftToRight.description" - categoryId="org.eclipse.compare.ui.category.compare" - id="org.eclipse.compare.copyAllLeftToRight"> - </command> - <command - name="%Command.selectNextChange.name" - description="%Command.selectNextChange.description" - categoryId="org.eclipse.compare.ui.category.compare" - id="org.eclipse.compare.selectNextChange"> - </command> - <command - name="%Command.selectPreviousChange.name" - description="%Command.selectPreviousChange.description" - categoryId="org.eclipse.compare.ui.category.compare" - id="org.eclipse.compare.selectPreviousChange"> - </command> - <command - categoryId="org.eclipse.compare.ui.category.compare" - description="%Command.ignoreWhiteSpace.description" - id="org.eclipse.compare.ignoreWhiteSpace" - name="%Command.ignoreWhiteSpace.name"> - </command> - <command - categoryId="org.eclipse.compare.ui.category.compare" - defaultHandler="org.eclipse.compare.internal.CompareWithOtherResourceHandler" - description="%Command.compareWithOther.description" - id="org.eclipse.compare.compareWithOther" - name="%Command.compareWithOther.name"> - </command> - </extension> - - <extension - point="org.eclipse.ui.popupMenus"> - <objectContribution - objectClass="org.eclipse.core.resources.mapping.ResourceMapping" - adaptable="true" - id="org.eclipse.compare.MenuGroups"> - <menu - label="%ReplaceWithMenu.label" - path="additions" - id="replaceWithMenu"> - <separator - name="replaceWithGroup"> - </separator> - </menu> - <menu - label="%CompareWithMenu.label" - path="additions" - id="compareWithMenu"> - <separator - name="compareWithGroup"> - </separator> - </menu> - </objectContribution> - <objectContribution - objectClass="org.eclipse.core.resources.IResource" - adaptable="true" - id="org.eclipse.compare.CompareAction"> - <action - label="%CompareWithEachOtherAction.label" - tooltip="%CompareWithEachOtherAction.tooltip" - class="org.eclipse.compare.internal.CompareAction" - menubarPath="compareWithMenu/compareWithGroup" - enablesFor="2+" - id="compareWithEachOther"> - </action> - </objectContribution> - <objectContribution - objectClass="org.eclipse.core.resources.IFile" - adaptable="true" - id="org.eclipse.compare.ReplaceWithEditionAction"> - <menu - label="%ReplaceWithMenu.label" - path="additions" - id="replaceWithMenu"> - <separator - name="replaceWithGroup"> - </separator> - </menu> - <action - label="%ReplaceFromHistoryAction.label" - tooltip="%ReplaceFromHistoryAction.tooltip" - class="org.eclipse.compare.internal.ReplaceWithEditionAction" - menubarPath="replaceWithMenu/replaceWithGroup" - enablesFor="1" - id="replaceFromHistory"> - </action> - <action - label="%ReplaceWithPreviousFromHistoryAction.label" - tooltip="%ReplaceWithPreviousFromHistoryAction.tooltip" - class="org.eclipse.compare.internal.ReplaceWithPreviousEditionAction" - menubarPath="replaceWithMenu/replaceWithGroup" - enablesFor="1" - id="replaceWithPreviousFromHistory"> - </action> - </objectContribution> - <objectContribution - objectClass="org.eclipse.core.resources.IFile" - adaptable="true" - id="org.eclipse.compare.CompareWithEditionAction"> - <menu - label="%CompareWithMenu.label" - path="additions" - id="compareWithMenu"> - <separator - name="compareWithGroup"> - </separator> - </menu> - <action - label="%CompareWithHistoryAction.label" - tooltip="%CompareWithHistoryAction.tooltip" - class="org.eclipse.compare.internal.CompareWithEditionAction" - menubarPath="compareWithMenu/compareWithGroup" - enablesFor="1" - id="compareWithHistory"> - </action> - </objectContribution> - <objectContribution - objectClass="org.eclipse.core.resources.IContainer" - adaptable="true" - id="org.eclipse.compare.AddFromHistoryAction"> - <action - label="%addFromHistoryAction.label" - tooltip="%addFromHistoryAction.tooltip" - class="org.eclipse.compare.internal.AddFromHistoryAction" - menubarPath="replaceWithMenu" - enablesFor="1" - id="addFromHistoryAction"> - </action> - </objectContribution> - </extension> - - <extension - point="org.eclipse.compare.streamMergers"> - <streamMerger - extensions="txt" - class="org.eclipse.compare.internal.merge.TextStreamMerger" - id="org.eclipse.compare.internal.merge.TextStreamMerger"> - </streamMerger> - <contentTypeBinding - contentTypeId="org.eclipse.core.runtime.text" - streamMergerId="org.eclipse.compare.internal.merge.TextStreamMerger"> - </contentTypeBinding> - </extension> - - <extension - point="org.eclipse.compare.structureCreators"> - <structureCreator - extensions="zip" - class="org.eclipse.compare.ZipFileStructureCreator" - id="org.eclipse.compare.ZipFileStructureCreator"> - </structureCreator> - </extension> - - <extension - point="org.eclipse.compare.contentMergeViewers"> - <viewer - class="org.eclipse.compare.internal.BinaryCompareViewerCreator" - extensions="class,exe,dll,binary,zip,jar" - id="org.eclipse.compare.BinaryCompareViewerCreator" - label="%BinaryCompare.label"> - </viewer> - <viewer - class="org.eclipse.compare.internal.TextMergeViewerCreator" - extensions="txt" - id="org.eclipse.compare.TextMergeViewerCreator" - label="%TextCompare.label"> - </viewer> - <viewer - class="org.eclipse.compare.internal.ImageMergeViewerCreator" - extensions="gif,jpg,jpeg,png,bmp,ico,tif,tiff" - id="org.eclipse.compare.ImageMergeViewerCreator" - label="%ImageCompare.label"> - </viewer> - <contentTypeBinding - contentTypeId="org.eclipse.core.runtime.text" - contentMergeViewerId="org.eclipse.compare.TextMergeViewerCreator"> - </contentTypeBinding> - </extension> - - <extension - point="org.eclipse.compare.contentViewers"> - <viewer - extensions="txt" - class="org.eclipse.compare.internal.TextViewerCreator" - id="org.eclipse.compare.TextViewerCreator"> - </viewer> - <contentTypeBinding - contentTypeId="org.eclipse.core.runtime.text" - contentViewerId="org.eclipse.compare.TextViewerCreator"> - </contentTypeBinding> - </extension> - <extension - point="org.eclipse.core.runtime.preferences"> - <initializer - class="org.eclipse.compare.internal.ComparePreferenceInitializer"> - </initializer> - </extension> - <extension - point="org.eclipse.core.runtime.adapters"> - <factory - adaptableType="org.eclipse.compare.CompareEditorInput" - class="org.eclipse.compare.internal.AdapterFactory"> - <adapter - type="org.eclipse.ui.IContributorResourceAdapter"> - </adapter> - </factory> - </extension> - -</plugin> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/contentMergeViewers.exsd b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/contentMergeViewers.exsd deleted file mode 100644 index 35ac4e5cd..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/contentMergeViewers.exsd +++ /dev/null @@ -1,177 +0,0 @@ -<?xml version='1.0' encoding='UTF-8'?> -<!-- Schema file written by PDE --> -<schema targetNamespace="org.eclipse.compare" xmlns="http://www.w3.org/2001/XMLSchema"> -<annotation> - <appInfo> - <meta.schema plugin="org.eclipse.compare" id="contentMergeViewers" name="ContentMerge Viewers"/> - </appInfo> - <documentation> - This extension point allows a plug-in to register compare/merge -viewers for specific content types. The viewer is expected to -extend <samp>org.eclipse.jface.viewers.Viewer</samp>. -However, since viewers don't have a default constructor, -the extension point must implement the factory interface -for viewers <samp>org.eclipse.compare.IViewerCreator</samp>. - </documentation> - </annotation> - - <element name="extension"> - <annotation> - <appInfo> - <meta.element /> - </appInfo> - </annotation> - <complexType> - <sequence> - <element ref="viewer" minOccurs="0" maxOccurs="unbounded"/> - <element ref="contentTypeBinding" minOccurs="0" maxOccurs="unbounded"/> - </sequence> - <attribute name="point" type="string" use="required"> - <annotation> - <documentation> - a fully qualified identifier of the target extension point - </documentation> - </annotation> - </attribute> - <attribute name="id" type="string"> - <annotation> - <documentation> - an optional identifier of the extension instance - </documentation> - </annotation> - </attribute> - <attribute name="name" type="string"> - <annotation> - <documentation> - an optional name of the extension instance - </documentation> - <appInfo> - <meta.attribute translatable="true"/> - </appInfo> - </annotation> - </attribute> - </complexType> - </element> - - <element name="viewer"> - <complexType> - <attribute name="id" type="string" use="required"> - <annotation> - <documentation> - a unique identifier that can be used to reference the viewer - </documentation> - </annotation> - </attribute> - <attribute name="class" type="string" use="required"> - <annotation> - <documentation> - a fully qualified name of a class that implements a factory for the -content merge viewer and implements <samp>org.eclipse.compare.IViewerCreator</samp> - </documentation> - <appInfo> - <meta.attribute kind="java" basedOn=":org.eclipse.compare.IViewerCreator"/> - </appInfo> - </annotation> - </attribute> - <attribute name="extensions" type="string"> - <annotation> - <documentation> - a comma separated list of file extensions e.g. "java, gif" - </documentation> - </annotation> - </attribute> - <attribute name="label" type="string"> - <annotation> - <documentation> - Since 3.5. A translatable label that will be used in the UI for this viewer. - </documentation> - <appInfo> - <meta.attribute translatable="true"/> - </appInfo> - </annotation> - </attribute> - </complexType> - </element> - - <element name="contentTypeBinding"> - <annotation> - <documentation> - A <code>contentTypeBinding</code> binds a merge viewer to a content type. - </documentation> - </annotation> - <complexType> - <attribute name="contentTypeId" type="string" use="required"> - <annotation> - <documentation> - The id of a content type defined using the <code>org.eclipse.core.contenttype.contentTypes</code> extension point. - </documentation> - <appInfo> - <meta.attribute kind="identifier" basedOn="org.eclipse.core.contenttype.contentTypes/content-type/@id"/> - </appInfo> - </annotation> - </attribute> - <attribute name="contentMergeViewerId" type="string" use="required"> - <annotation> - <documentation> - The id of a merge viewer defined using the <code>viewer</code> element of this extension point (i.e. <code>org.eclipse.compare.contentMergeViewers</code>) - </documentation> - <appInfo> - <meta.attribute kind="identifier" basedOn="org.eclipse.compare.contentMergeViewers/viewer/@id"/> - </appInfo> - </annotation> - </attribute> - </complexType> - </element> - - <annotation> - <appInfo> - <meta.section type="examples"/> - </appInfo> - <documentation> - The following is an example of a compare/merge viewer -for text files (extension "txt"): -<p> -<pre> -<extension point = "org.eclipse.compare.contentMergeViewers"> - <viewer - id="org.eclipse.compare.contentmergeviewer.TextMergeViewer" - class="org.eclipse.compare.internal.TextMergeViewerCreator" - extensions="txt" - label="Text Compare" - /> -</extension> -</pre> -</p> - </documentation> - </annotation> - - <annotation> - <appInfo> - <meta.section type="apiInfo"/> - </appInfo> - <documentation> - The contributed class must implement <code>org.eclipse.compare.IViewerCreator</code> - </documentation> - </annotation> - - - <annotation> - <appInfo> - <meta.section type="implementation"/> - </appInfo> - <documentation> - The Compare UI plugin defines content viewers for text, binary contents, and images. - </documentation> - </annotation> - - <annotation> - <appInfo> - <meta.section type="copyright"/> - </appInfo> - <documentation> - Copyright (c) 2000, 2009 IBM Corporation and others.<br> -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 <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> - </documentation> - </annotation> - -</schema> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/contentViewers.exsd b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/contentViewers.exsd deleted file mode 100644 index b83bb6136..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/contentViewers.exsd +++ /dev/null @@ -1,165 +0,0 @@ -<?xml version='1.0' encoding='UTF-8'?> -<!-- Schema file written by PDE --> -<schema targetNamespace="org.eclipse.compare" xmlns="http://www.w3.org/2001/XMLSchema"> -<annotation> - <appinfo> - <meta.schema plugin="org.eclipse.compare" id="contentViewers" name="Content Viewers"/> - </appinfo> - <documentation> - This extension point allows a plug-in to register -viewers for specific content types. -These viewers are used in the <samp>EditionSelectionDialog</samp> when presenting an edition of a resource or a subsection thereof. The viewer is expected to extend <samp>org.eclipse.jface.viewers.Viewer</samp>. -However since viewers don't have a default constructor the extension point must implement the factory interface for viewers <samp>org.eclipse.compare.IViewerCreator</samp>. - </documentation> - </annotation> - - <element name="extension"> - <annotation> - <appinfo> - <meta.element /> - </appinfo> - </annotation> - <complexType> - <sequence> - <element ref="viewer" minOccurs="0" maxOccurs="unbounded"/> - <element ref="contentTypeBinding" minOccurs="0" maxOccurs="unbounded"/> - </sequence> - <attribute name="point" type="string" use="required"> - <annotation> - <documentation> - a fully qualified identifier of the target extension point - </documentation> - </annotation> - </attribute> - <attribute name="id" type="string"> - <annotation> - <documentation> - an optional identifier of the extension instance - </documentation> - </annotation> - </attribute> - <attribute name="name" type="string"> - <annotation> - <documentation> - an optional name of the extension instance - </documentation> - <appinfo> - <meta.attribute translatable="true"/> - </appinfo> - </annotation> - </attribute> - </complexType> - </element> - - <element name="viewer"> - <complexType> - <attribute name="id" type="string" use="required"> - <annotation> - <documentation> - a unique identifier that can be used to reference the viewer - </documentation> - </annotation> - </attribute> - <attribute name="class" type="string" use="required"> - <annotation> - <documentation> - a fully qualified name of a class that implements a factory for the -content viewer and implements <samp>org.eclipse.compare.IViewerCreator</samp> - </documentation> - <appinfo> - <meta.attribute kind="java" basedOn=":org.eclipse.compare.IViewerCreator"/> - </appinfo> - </annotation> - </attribute> - <attribute name="extensions" type="string"> - <annotation> - <documentation> - a comma separated list of file extensions e.g. "java, gif" - </documentation> - </annotation> - </attribute> - </complexType> - </element> - - <element name="contentTypeBinding"> - <annotation> - <documentation> - A <code>contentTypeBinding</code> binds a content viewer to a content type. - </documentation> - </annotation> - <complexType> - <attribute name="contentTypeId" type="string" use="required"> - <annotation> - <documentation> - The id of a content type defined using the <code>org.eclipse.core.contenttype.contentTypes</code> extension point. - </documentation> - <appinfo> - <meta.attribute kind="identifier" basedOn="org.eclipse.core.contenttype.contentTypes/content-type/@id"/> - </appinfo> - </annotation> - </attribute> - <attribute name="contentViewerId" type="string" use="required"> - <annotation> - <documentation> - The id of a content viewer defined using the <code>viewer</code> element of this extension point (i.e. <code>org.eclipse.compare.contentViewers</code>) - </documentation> - <appinfo> - <meta.attribute kind="identifier" basedOn="org.eclipse.compare.contentViewers/viewer/@id"/> - </appinfo> - </annotation> - </attribute> - </complexType> - </element> - - <annotation> - <appinfo> - <meta.section type="examples"/> - </appinfo> - <documentation> - The following is an example of a viewer for text -files (extension "txt"): -<p> -<pre> -<extension point = "org.eclipse.compare.contentViewers"> - <viewer - id="org.eclipse.compare.internal.TextViewer" - class="org.eclipse.compare.internal.TextViewerCreator" - extensions="txt" - /> -</extension> -</pre> -</p> - </documentation> - </annotation> - - <annotation> - <appinfo> - <meta.section type="apiInfo"/> - </appinfo> - <documentation> - The contributed class must implement <code>org.eclipse.compare.IViewerCreator</code> - </documentation> - </annotation> - - - <annotation> - <appinfo> - <meta.section type="implementation"/> - </appinfo> - <documentation> - The Compare UI plugin defines content viewers for -text and images. - </documentation> - </annotation> - - <annotation> - <appinfo> - <meta.section type="copyright"/> - </appinfo> - <documentation> - Copyright (c) 2000, 2008 IBM Corporation and others.<br> -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 <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> - </documentation> - </annotation> - -</schema> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/streamMergers.exsd b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/streamMergers.exsd deleted file mode 100644 index 9edfc9a71..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/streamMergers.exsd +++ /dev/null @@ -1,173 +0,0 @@ -<?xml version='1.0' encoding='UTF-8'?> -<!-- Schema file written by PDE --> -<schema targetNamespace="org.eclipse.compare" xmlns="http://www.w3.org/2001/XMLSchema"> -<annotation> - <appinfo> - <meta.schema plugin="org.eclipse.compare" id="streamMergers" name="Stream Merger"/> - </appinfo> - <documentation> - This extension point allows a plug-in to register a stream merger -for specific content types. The stream merger is expected to perform a three-way merge -on three input streams and writes the result to an output stream. -The extension point must implement the interface <samp>org.eclipse.compare.IStreamMerger</samp>. - </documentation> - </annotation> - - <element name="extension"> - <annotation> - <appinfo> - <meta.element /> - </appinfo> - <documentation> - Deprecated. The <code>org.eclipse.team.core.storageMergers</code> extension point should be used instead. - </documentation> - </annotation> - <complexType> - <sequence> - <element ref="streamMerger" minOccurs="0" maxOccurs="unbounded"/> - <element ref="contentTypeBinding" minOccurs="0" maxOccurs="unbounded"/> - </sequence> - <attribute name="point" type="string" use="required"> - <annotation> - <documentation> - a fully qualified identifier of the target extension point - </documentation> - </annotation> - </attribute> - <attribute name="id" type="string"> - <annotation> - <documentation> - an optional identifier of the extension instance - </documentation> - </annotation> - </attribute> - <attribute name="name" type="string"> - <annotation> - <documentation> - an optional name of the extension instance - </documentation> - <appinfo> - <meta.attribute translatable="true"/> - </appinfo> - </annotation> - </attribute> - </complexType> - </element> - - <element name="streamMerger"> - <complexType> - <attribute name="id" type="string" use="required"> - <annotation> - <documentation> - a unique identifier that can be used to reference the stream merger - </documentation> - </annotation> - </attribute> - <attribute name="class" type="string" use="required"> - <annotation> - <documentation> - a fully qualified name of a class that implements <samp>org.eclipse.compare.IStreamMerger</samp> - </documentation> - <appinfo> - <meta.attribute kind="java" basedOn="org.eclipse.compare.IStreamMerger"/> - </appinfo> - </annotation> - </attribute> - <attribute name="extensions" type="string"> - <annotation> - <documentation> - a comma separated list of file extensions e.g. "java, properties" - </documentation> - </annotation> - </attribute> - </complexType> - </element> - - <element name="contentTypeBinding"> - <annotation> - <documentation> - A <code>contentTypeBinding</code> binds a stream merger to a content type. - </documentation> - </annotation> - <complexType> - <attribute name="contentTypeId" type="string" use="required"> - <annotation> - <documentation> - The id of a content type defined using the <code>org.eclipse.core.contenttype.contentTypes</code> extension point. - </documentation> - <appinfo> - <meta.attribute kind="identifier" basedOn="org.eclipse.core.contenttype.contentTypes/content-type/@id"/> - </appinfo> - </annotation> - </attribute> - <attribute name="streamMergerId" type="string" use="required"> - <annotation> - <documentation> - The id of a stream merger defined using the <code>streamMerger</code> element of this extension point (i.e. <code>org.eclipse.compare.streamMergers</code>) - </documentation> - <appinfo> - <meta.attribute kind="identifier" basedOn="org.eclipse.compare.streamMergers/streamMerger/@id"/> - </appinfo> - </annotation> - </attribute> - </complexType> - </element> - - <annotation> - <appinfo> - <meta.section type="since"/> - </appinfo> - <documentation> - 3.0 - </documentation> - </annotation> - - <annotation> - <appinfo> - <meta.section type="examples"/> - </appinfo> - <documentation> - The following is an example of a stream merger for property files (extension "properties"): -<p> -<pre> -<extension point = "org.eclipse.compare.streamMergers"> - <streamMerger - id="org.eclipse.compare.internal.merge.TextStreamMerger" - class="org.eclipse.compare.internal.merge.TextStreamMerger" - extensions="properties" - /> -</extension> -</pre> -</p> - </documentation> - </annotation> - - <annotation> - <appinfo> - <meta.section type="apiInfo"/> - </appinfo> - <documentation> - The contributed class must implement <code>org.eclipse.compare.IStreamMerger</code> - </documentation> - </annotation> - - <annotation> - <appinfo> - <meta.section type="implementation"/> - </appinfo> - <documentation> - The Compare UI plugin defines a stream merger for line oriented text files. - </documentation> - </annotation> - - <annotation> - <appinfo> - <meta.section type="copyright"/> - </appinfo> - <documentation> - Copyright (c) 2000, 2008 IBM Corporation and others.<br> -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 <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> - </documentation> - </annotation> - -</schema> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/structureCreators.exsd b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/structureCreators.exsd deleted file mode 100644 index 318673e8e..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/structureCreators.exsd +++ /dev/null @@ -1,164 +0,0 @@ -<?xml version='1.0' encoding='UTF-8'?> -<!-- Schema file written by PDE --> -<schema targetNamespace="org.eclipse.compare" xmlns="http://www.w3.org/2001/XMLSchema"> -<annotation> - <appInfo> - <meta.schema plugin="org.eclipse.compare" id="structureCreators" name="Structure Creators"/> - </appInfo> - <documentation> - This extension point allows a plug-in to register a structure creator -for specific content types. The structure creator is expected to create -a tree of <samp>IStructureComparator</samp>s for a given content. -This tree is used as the input for the structural compare. -The extension point must implement the interface <samp>org.eclipse.compare.structuremergeviewer.IStructureCreator</samp>. - </documentation> - </annotation> - - <element name="extension"> - <annotation> - <appInfo> - <meta.element /> - </appInfo> - </annotation> - <complexType> - <sequence> - <element ref="structureCreator" minOccurs="0" maxOccurs="unbounded"/> - <element ref="contentTypeBinding" minOccurs="0" maxOccurs="unbounded"/> - </sequence> - <attribute name="point" type="string" use="required"> - <annotation> - <documentation> - a fully qualified identifier of the target extension point - </documentation> - </annotation> - </attribute> - <attribute name="id" type="string"> - <annotation> - <documentation> - an optional identifier of the extension instance - </documentation> - </annotation> - </attribute> - <attribute name="name" type="string"> - <annotation> - <documentation> - an optional name of the extension instance - </documentation> - <appInfo> - <meta.attribute translatable="true"/> - </appInfo> - </annotation> - </attribute> - </complexType> - </element> - - <element name="structureCreator"> - <complexType> - <attribute name="id" type="string" use="required"> - <annotation> - <documentation> - a unique identifier that can be used to reference the structure creator - </documentation> - </annotation> - </attribute> - <attribute name="class" type="string" use="required"> - <annotation> - <documentation> - a fully qualified name of a class that implements <samp>org.eclipse.compare.structuremergeviewer.IStructureCreator</samp> - </documentation> - <appInfo> - <meta.attribute kind="java" basedOn=":org.eclipse.compare.structuremergeviewer.IStructureCreator"/> - </appInfo> - </annotation> - </attribute> - <attribute name="extensions" type="string"> - <annotation> - <documentation> - a comma separated list of file extensions e.g. "java, properties" - </documentation> - </annotation> - </attribute> - </complexType> - </element> - - <element name="contentTypeBinding"> - <annotation> - <documentation> - A <code>contentTypeBinding</code> binds a structure creator to a content type. - </documentation> - </annotation> - <complexType> - <attribute name="contentTypeId" type="string" use="required"> - <annotation> - <documentation> - The id of a content type defined using the <code>org.eclipse.core.contenttype.contentTypes</code> extension point. - </documentation> - <appInfo> - <meta.attribute kind="identifier" basedOn="org.eclipse.core.contenttype.contentTypes/content-type/@id"/> - </appInfo> - </annotation> - </attribute> - <attribute name="structureCreatorId" type="string" use="required"> - <annotation> - <documentation> - The id of a structure creator defined using the <code>structureCreator</code> element of this extension point (i.e. <code>org.eclipse.compare.structureCreators</code>) - </documentation> - <appInfo> - <meta.attribute kind="identifier" basedOn="org.eclipse.compare.structureCreators/structureCreator/@id"/> - </appInfo> - </annotation> - </attribute> - </complexType> - </element> - - <annotation> - <appInfo> - <meta.section type="examples"/> - </appInfo> - <documentation> - The following is an example of a structure creator for -java files (extension "java"): -<p> -<pre> -<extension point = "org.eclipse.compare.structureCreators"> - <structureCreator - id="org.eclipse.compare.JavaStructureCreator" - class="org.eclipse.compare.JavaStructureCreator" - extensions="java" - /> -</extension> -</pre> -</p> - </documentation> - </annotation> - - <annotation> - <appInfo> - <meta.section type="apiInfo"/> - </appInfo> - <documentation> - The contributed class must implement <code>org.eclipse.compare.structuremergeviewer.IStructureCreator</code> - </documentation> - </annotation> - - - <annotation> - <appInfo> - <meta.section type="implementation"/> - </appInfo> - <documentation> - The Compare UI plugin defines a structure creator for zip archives. - </documentation> - </annotation> - - <annotation> - <appInfo> - <meta.section type="copyright"/> - </appInfo> - <documentation> - Copyright (c) 2000, 2010 IBM Corporation and others.<br> -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 <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> - </documentation> - </annotation> - -</schema> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/structureMergeViewers.exsd b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/structureMergeViewers.exsd deleted file mode 100644 index 644461f27..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/structureMergeViewers.exsd +++ /dev/null @@ -1,178 +0,0 @@ -<?xml version='1.0' encoding='UTF-8'?> -<!-- Schema file written by PDE --> -<schema targetNamespace="org.eclipse.compare" xmlns="http://www.w3.org/2001/XMLSchema"> -<annotation> - <appInfo> - <meta.schema plugin="org.eclipse.compare" id="structureMergeViewers" name="StructureMerge Viewers"/> - </appInfo> - <documentation> - This extension point allows a plug-in to register compare/merge -viewers for structural content types. The viewer is expected to -extend <samp>org.eclipse.jface.viewers.Viewer</samp>. -However, since viewers don't have a default constructor, -the extension point must implement the factory interface -for viewers <samp>org.eclipse.compare.IViewerCreator</samp>. - </documentation> - </annotation> - - <element name="extension"> - <annotation> - <appInfo> - <meta.element /> - </appInfo> - </annotation> - <complexType> - <sequence> - <element ref="viewer" minOccurs="0" maxOccurs="unbounded"/> - <element ref="contentTypeBinding" minOccurs="0" maxOccurs="unbounded"/> - </sequence> - <attribute name="point" type="string" use="required"> - <annotation> - <documentation> - a fully qualified identifier of the target extension point - </documentation> - </annotation> - </attribute> - <attribute name="id" type="string"> - <annotation> - <documentation> - an optional identifier of the extension instance - </documentation> - </annotation> - </attribute> - <attribute name="name" type="string"> - <annotation> - <documentation> - an optional name of the extension instance - </documentation> - <appInfo> - <meta.attribute translatable="true"/> - </appInfo> - </annotation> - </attribute> - </complexType> - </element> - - <element name="viewer"> - <complexType> - <attribute name="id" type="string" use="required"> - <annotation> - <documentation> - a unique identifier that can be used to reference the viewer - </documentation> - </annotation> - </attribute> - <attribute name="class" type="string" use="required"> - <annotation> - <documentation> - a fully qualified name of a class that implements a factory for the -structure merge viewer and implements <samp>org.eclipse.compare.IViewerCreator</samp> - </documentation> - <appInfo> - <meta.attribute kind="java" basedOn=":org.eclipse.compare.IViewerCreator"/> - </appInfo> - </annotation> - </attribute> - <attribute name="extensions" type="string" use="required"> - <annotation> - <documentation> - a comma separated list of file extensions e.g. "zip, jar" - </documentation> - </annotation> - </attribute> - <attribute name="label" type="string"> - <annotation> - <documentation> - Since 3.5. A translatable label that will be used in the UI for this viewer. - </documentation> - <appInfo> - <meta.attribute translatable="true"/> - </appInfo> - </annotation> - </attribute> - </complexType> - </element> - - <element name="contentTypeBinding"> - <annotation> - <documentation> - A <code>contentTypeBinding</code> binds a structure merge viewer to a content type. - </documentation> - </annotation> - <complexType> - <attribute name="contentTypeId" type="string" use="required"> - <annotation> - <documentation> - The id of a content type defined using the <code>org.eclipse.core.contenttype.contentTypes</code> extension point. - </documentation> - <appInfo> - <meta.attribute kind="identifier" basedOn="org.eclipse.core.contenttype.contentTypes/content-type/@id"/> - </appInfo> - </annotation> - </attribute> - <attribute name="structureMergeViewerId" type="string" use="required"> - <annotation> - <documentation> - The id of a structure merge viewer defined using the <code>viewer</code> element of this extension point (i.e. <code>org.eclipse.compare.structureMergeViewers</code>) - </documentation> - <appInfo> - <meta.attribute kind="identifier" basedOn="org.eclipse.compare.structureMergeViewers/viewer/@id"/> - </appInfo> - </annotation> - </attribute> - </complexType> - </element> - - <annotation> - <appInfo> - <meta.section type="examples"/> - </appInfo> - <documentation> - The following is an example of compare/merge viewer -for zip files (extension "zip"): -<p> -<pre> -<extension point = "org.eclipse.compare.structureMergeViewers"> - <viewer - id="org.eclipse.compare.ZipCompareViewer" - class="org.eclipse.compare.ZipCompareViewerCreator" - extensions="zip" - label="Binary Compare" - /> -</extension> -</pre> -</p> - </documentation> - </annotation> - - <annotation> - <appInfo> - <meta.section type="apiInfo"/> - </appInfo> - <documentation> - The contributed class must implement <code>org.eclipse.compare.IViewerCreator</code> - </documentation> - </annotation> - - - <annotation> - <appInfo> - <meta.section type="implementation"/> - </appInfo> - <documentation> - The Compare UI plugin defines a structure compare -viewer for zip archives. - </documentation> - </annotation> - - <annotation> - <appInfo> - <meta.section type="copyright"/> - </appInfo> - <documentation> - Copyright (c) 2000, 2009 IBM Corporation and others.<br> -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 <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> - </documentation> - </annotation> - -</schema> diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/scripts/exportplugin.xml b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/scripts/exportplugin.xml deleted file mode 100644 index 1d4e0505f..000000000 --- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/scripts/exportplugin.xml +++ /dev/null @@ -1,53 +0,0 @@ -<project name="org.eclipse.compare" default="export" basedir=".."> - <target name="init"> - <tstamp/> - <property name="destdir" value="../../plugin-export" /> - <property name="plugin" value="org.eclipse.compare" /> - <property name="qualifier" value="zzz${DSTAMP}-${TSTAMP}" /> - - <!-- define property ${plugin_version} by reading version from MANIFEST.MF: --> - <tempfile property="plugin_version_file" suffix=".plugin_version.tmp" destdir="${destdir}"/> - <copy file="META-INF/MANIFEST.MF" tofile="${plugin_version_file}"/> - <replaceregexp file="${plugin_version_file}" match=".*Bundle-Version: ((\d)+\.(\d)+\.(\d)+\.)qualifier.*" replace="plugin_version=_\1${qualifier}" flags="s" /> - <property file="${plugin_version_file}"/> - <delete file="${plugin_version_file}" /> - - <property name="dest" value="${destdir}/${plugin}${plugin_version}" /> - <property name="destjar" value="${destdir}/${plugin}${plugin_version}.jar" /> - </target> - - <target name="build" depends="init"> - <eclipse.incrementalBuild project="${plugin}" kind="incr"/> - </target> - - <target name="export" depends="build"> - <mkdir dir="${destdir}" /> - <delete dir="${dest}" /> - <mkdir dir="${dest}" /> - - <copy todir="${dest}/META-INF"> - <fileset dir="META-INF" /> - </copy> - - <replaceregexp file="${dest}/META-INF/MANIFEST.MF" match="Bundle-Version: ((\d)+\.(\d)+\.(\d)+\.)qualifier" replace="Bundle-Version: \1${qualifier}" byline="true" /> - - <delete file="${destjar}" /> - <zip zipfile="${destjar}"> - <fileset dir="."> - <include name="plugin.xml" /> - <include name="plugin.properties" /> - <include name="icons/**" /> - <include name=".options" /> - <include name="schema/**" /> - <include name="src/**" /> - </fileset> - <fileset dir="bin" /> - <fileset dir="${dest}"> - <include name="META-INF/**" /> - </fileset> - </zip> - - <delete dir="${dest}" /> - - </target> -</project> |