View | Details | Raw Unified | Return to bug 411902
Collapse All | Expand All

(-)org.eclipse.compare/plugin.properties (+13 lines)
Lines 86-91 CompareWithMenu.label= Comp&are With Link Here
86
CompareWithEachOtherAction.label= &Each Other
86
CompareWithEachOtherAction.label= &Each Other
87
CompareWithEachOtherAction.tooltip= Compare the Selected Resources
87
CompareWithEachOtherAction.tooltip= Compare the Selected Resources
88
88
89
CompareWithEachOtherActionFiltered.label= Each Other (&filtered)
90
CompareWithEachOtherAction.tooltip= Compare the Selected Resources ignoring rules defined in the Preferences.
91
89
CompareWithOtherResource.label= &Other Resource...
92
CompareWithOtherResource.label= &Other Resource...
90
CompareWithOtherResource.tooltip= Open the 'Compare With' Dialog
93
CompareWithOtherResource.tooltip= Open the 'Compare With' Dialog
91
94
Lines 162-167 compareResolvedColor.description= The color used to indicate a resolved change i Link Here
162
compareFontDefiniton.label= Compare text font
165
compareFontDefiniton.label= Compare text font
163
compareFontDefiniton.description= The compare text font is used by textual compare/merge tools.
166
compareFontDefiniton.description= The compare text font is used by textual compare/merge tools.
164
167
168
# filtered compare
169
ComparePreferencePage.filteredCompareTab.label= &Filtered Compare
170
ComparePreferencePage.filteredCompareTab.text= Patterns to ignore in 'Compare with each other (filtered)'
171
ComparePreferencePage.filteredCompareTab.addExpression= &Add Expression
172
ComparePreferencePage.filteredCompareTab.addExpression.dialog.title= Add Ignore Regexp
173
ComparePreferencePage.filteredCompareTab.addExpression.dialog.message= Enter a Regexp to at it to the ignore list.
174
ComparePreferencePage.filteredCompareTab.addExpression.dialog.initialValue=
175
ComparePreferencePage.filteredCompareTab.addExpression.dialog.valueAlreadyExists.title=Pattern already exists
176
ComparePreferencePage.filteredCompareTab.addExpression.dialog.valueAlreadyExists.message=Your Pattern is already in the ignore list.
177
ComparePreferencePage.filteredCompareTab.removeExpression= &Remove Expression
165
178
166
preferenceKeywords.general=merge merging whitespace filter synchronize scrolling ancestor conflict line pseudo navigation next previous
179
preferenceKeywords.general=merge merging whitespace filter synchronize scrolling ancestor conflict line pseudo navigation next previous
167
180
(-)org.eclipse.compare/plugin.xml (+13 lines)
Lines 222-227 Link Here
222
         </action>
222
         </action>
223
      </objectContribution>
223
      </objectContribution>
224
      <objectContribution
224
      <objectContribution
225
            objectClass="org.eclipse.core.resources.IResource"
226
            adaptable="true"
227
            id="org.eclipse.compare.CompareActionFiltered">
228
         <action
229
               label="%CompareWithEachOtherActionFiltered.label"
230
               tooltip="%CompareWithEachOtherActionFiltered.tooltip"
231
               class="org.eclipse.compare.internal.CompareActionFiltered"
232
               menubarPath="compareWithMenu/compareWithGroup"
233
               enablesFor="2"
234
               id="compareWithEachOtherFiltered">
235
         </action>
236
      </objectContribution>
237
      <objectContribution
225
            objectClass="org.eclipse.core.resources.IFile"
238
            objectClass="org.eclipse.core.resources.IFile"
226
            adaptable="true"
239
            adaptable="true"
227
            id="org.eclipse.compare.ReplaceWithEditionAction">
240
            id="org.eclipse.compare.ReplaceWithEditionAction">
(-)org.eclipse.compare/src/org/eclipse/compare/internal/CompareActionFiltered.java (+52 lines)
Added Link Here
1
package org.eclipse.compare.internal;
2
3
import org.eclipse.compare.CompareConfiguration;
4
import org.eclipse.compare.CompareUI;
5
import org.eclipse.jface.action.IAction;
6
import org.eclipse.jface.viewers.ISelection;
7
import org.eclipse.ui.IObjectActionDelegate;
8
import org.eclipse.ui.IWorkbenchPage;
9
import org.eclipse.ui.IWorkbenchPart;
10
11
/*
12
 * The "Compare with each other (filtered)" action
13
 */
14
public class CompareActionFiltered extends BaseCompareAction implements IObjectActionDelegate {
15
16
	protected ResourceCompareInput fInput;
17
	protected IWorkbenchPage fWorkbenchPage;
18
	protected boolean showSelectAncestorDialog = true;
19
20
	public void run(ISelection selection) {
21
		if (fInput != null) {
22
			// Pass the shell so setSelection can prompt the user for which
23
			// resource should be the ancestor
24
			boolean ok = fInput.setSelection(selection, fWorkbenchPage
25
					.getWorkbenchWindow().getShell(), showSelectAncestorDialog);
26
			if (!ok) return;
27
			fInput.initializeCompareConfiguration();
28
			CompareUI.openCompareEditorOnPage(fInput, fWorkbenchPage);
29
			fInput= null;	// don't reuse this input!
30
		}
31
	}
32
33
	protected boolean isEnabled(ISelection selection) {
34
		if (fInput == null) {
35
			CompareConfiguration cc= new CompareConfiguration();
36
			// buffered merge mode: don't ask for confirmation
37
			// when switching between modified resources
38
			cc.setProperty(CompareEditor.CONFIRM_SAVE_PROPERTY, new Boolean(false));
39
			cc.setProperty("filtered", new Boolean(true));
40
			
41
			// uncomment following line to have separate outline view
42
			//cc.setProperty(CompareConfiguration.USE_OUTLINE_VIEW, new Boolean(true));
43
						
44
			fInput= new ResourceCompareInput(cc);
45
		}
46
		return fInput.isEnabled(selection);
47
	}
48
49
	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
50
		fWorkbenchPage= targetPart.getSite().getPage();
51
	}
52
}
(-)org.eclipse.compare/src/org/eclipse/compare/internal/ComparePreferencePage.java (-16 / +180 lines)
Lines 15-21 import java.io.InputStream; Link Here
15
import java.util.HashMap;
15
import java.util.HashMap;
16
import java.util.Iterator;
16
import java.util.Iterator;
17
import java.util.Map;
17
import java.util.Map;
18
import java.util.StringTokenizer;
18
19
20
import org.eclipse.compare.CompareConfiguration;
21
import org.eclipse.compare.IEncodedStreamContentAccessor;
22
import org.eclipse.compare.ITypedElement;
23
import org.eclipse.compare.contentmergeviewer.TextMergeViewer;
24
import org.eclipse.compare.internal.core.ComparePlugin;
25
import org.eclipse.compare.structuremergeviewer.DiffNode;
26
import org.eclipse.compare.structuremergeviewer.Differencer;
27
import org.eclipse.jface.dialogs.Dialog;
28
import org.eclipse.jface.dialogs.InputDialog;
29
import org.eclipse.jface.dialogs.MessageDialog;
30
import org.eclipse.jface.preference.IPreferenceStore;
31
import org.eclipse.jface.preference.PreferencePage;
32
import org.eclipse.jface.preference.RadioGroupFieldEditor;
33
import org.eclipse.jface.util.IPropertyChangeListener;
34
import org.eclipse.jface.util.PropertyChangeEvent;
35
import org.eclipse.jface.window.Window;
19
import org.eclipse.swt.SWT;
36
import org.eclipse.swt.SWT;
20
import org.eclipse.swt.events.DisposeEvent;
37
import org.eclipse.swt.events.DisposeEvent;
21
import org.eclipse.swt.events.DisposeListener;
38
import org.eclipse.swt.events.DisposeListener;
Lines 30-61 import org.eclipse.swt.layout.GridLayout; Link Here
30
import org.eclipse.swt.widgets.Button;
47
import org.eclipse.swt.widgets.Button;
31
import org.eclipse.swt.widgets.Composite;
48
import org.eclipse.swt.widgets.Composite;
32
import org.eclipse.swt.widgets.Control;
49
import org.eclipse.swt.widgets.Control;
50
import org.eclipse.swt.widgets.Event;
33
import org.eclipse.swt.widgets.Label;
51
import org.eclipse.swt.widgets.Label;
52
import org.eclipse.swt.widgets.Listener;
34
import org.eclipse.swt.widgets.TabFolder;
53
import org.eclipse.swt.widgets.TabFolder;
35
import org.eclipse.swt.widgets.TabItem;
54
import org.eclipse.swt.widgets.TabItem;
55
import org.eclipse.swt.widgets.Table;
56
import org.eclipse.swt.widgets.TableItem;
36
import org.eclipse.swt.widgets.Text;
57
import org.eclipse.swt.widgets.Text;
37
38
import org.eclipse.jface.dialogs.Dialog;
39
import org.eclipse.jface.preference.IPreferenceStore;
40
import org.eclipse.jface.preference.PreferencePage;
41
import org.eclipse.jface.preference.RadioGroupFieldEditor;
42
import org.eclipse.jface.util.IPropertyChangeListener;
43
import org.eclipse.jface.util.PropertyChangeEvent;
44
45
import org.eclipse.ui.IWorkbench;
58
import org.eclipse.ui.IWorkbench;
46
import org.eclipse.ui.IWorkbenchPreferencePage;
59
import org.eclipse.ui.IWorkbenchPreferencePage;
47
import org.eclipse.ui.PlatformUI;
60
import org.eclipse.ui.PlatformUI;
48
import org.eclipse.ui.dialogs.PreferenceLinkArea;
61
import org.eclipse.ui.dialogs.PreferenceLinkArea;
49
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
62
import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
50
63
51
import org.eclipse.compare.CompareConfiguration;
52
import org.eclipse.compare.IEncodedStreamContentAccessor;
53
import org.eclipse.compare.ITypedElement;
54
import org.eclipse.compare.contentmergeviewer.TextMergeViewer;
55
import org.eclipse.compare.internal.core.ComparePlugin;
56
import org.eclipse.compare.structuremergeviewer.DiffNode;
57
import org.eclipse.compare.structuremergeviewer.Differencer;
58
59
64
60
public class ComparePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
65
public class ComparePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
61
	
66
	
Lines 101-106 public class ComparePreferencePage extends PreferencePage implements IWorkbenchP Link Here
101
	public static final String ADDED_LINES_REGEX= PREFIX + "AddedLinesRegex"; //$NON-NLS-1$
106
	public static final String ADDED_LINES_REGEX= PREFIX + "AddedLinesRegex"; //$NON-NLS-1$
102
	public static final String REMOVED_LINES_REGEX= PREFIX + "RemovedLinesRegex"; //$NON-NLS-1$
107
	public static final String REMOVED_LINES_REGEX= PREFIX + "RemovedLinesRegex"; //$NON-NLS-1$
103
	
108
	
109
	public static final String IGNORES_REGEXP= PREFIX + "IgnorePatterns";
110
	private static final String IGNORES_REGEXP_DELIMITER = ">#<";
104
	
111
	
105
	private TextMergeViewer fPreviewViewer;
112
	private TextMergeViewer fPreviewViewer;
106
	private IPropertyChangeListener fPreferenceChangeListener;
113
	private IPropertyChangeListener fPreferenceChangeListener;
Lines 131-138 public class ComparePreferencePage extends PreferencePage implements IWorkbenchP Link Here
131
		new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PATH_FILTER),
138
		new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PATH_FILTER),
132
		new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICompareUIConstants.PREF_NAVIGATION_END_ACTION),
139
		new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICompareUIConstants.PREF_NAVIGATION_END_ACTION),
133
		new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL),
140
		new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL),
141
		new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, IGNORES_REGEXP),
134
	};
142
	};
135
	private RadioGroupFieldEditor editor;
143
	private RadioGroupFieldEditor editor;
144
	private Table ignoreTable;
136
	
145
	
137
	
146
	
138
	public static void initDefaults(IPreferenceStore store) {
147
	public static void initDefaults(IPreferenceStore store) {
Lines 153-158 public class ComparePreferencePage extends PreferencePage implements IWorkbenchP Link Here
153
		store.setDefault(PATH_FILTER, ""); //$NON-NLS-1$
162
		store.setDefault(PATH_FILTER, ""); //$NON-NLS-1$
154
		store.setDefault(ICompareUIConstants.PREF_NAVIGATION_END_ACTION, ICompareUIConstants.PREF_VALUE_PROMPT);
163
		store.setDefault(ICompareUIConstants.PREF_NAVIGATION_END_ACTION, ICompareUIConstants.PREF_VALUE_PROMPT);
155
		store.setDefault(ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL, ICompareUIConstants.PREF_VALUE_LOOP);
164
		store.setDefault(ICompareUIConstants.PREF_NAVIGATION_END_ACTION_LOCAL, ICompareUIConstants.PREF_VALUE_LOOP);
165
		
166
		store.setDefault(
167
                IGNORES_REGEXP, 
168
                ".*\\$Id:.*" + IGNORES_REGEXP_DELIMITER
169
                + "^import.*" + IGNORES_REGEXP_DELIMITER
170
                + "^\\s*$");
156
	}
171
	}
157
172
158
	public ComparePreferencePage() {
173
	public ComparePreferencePage() {
Lines 189-194 public class ComparePreferencePage extends PreferencePage implements IWorkbenchP Link Here
189
	public boolean performOk() {
204
	public boolean performOk() {
190
		fOverlayStore.setValue(ADDED_LINES_REGEX, addedLinesRegex.getText());
205
		fOverlayStore.setValue(ADDED_LINES_REGEX, addedLinesRegex.getText());
191
		fOverlayStore.setValue(REMOVED_LINES_REGEX, removedLinesRegex.getText());
206
		fOverlayStore.setValue(REMOVED_LINES_REGEX, removedLinesRegex.getText());
207
		
208
		// store ignore list
209
        TableItem[] items = ignoreTable.getItems();
210
        String[] elements = new String[items.length];
211
        for (int ti = 0; ti < items.length; ti++) {
212
            elements[ti] = items[ti].getText();
213
        }
214
        storeIgnoreRegexpPreferences(elements);
192
215
193
		editor.store();
216
		editor.store();
194
		fOverlayStore.propagate();
217
		fOverlayStore.propagate();
Lines 261-266 public class ComparePreferencePage extends PreferencePage implements IWorkbenchP Link Here
261
		//item.setImage(JavaPluginImages.get(JavaPluginImages.IMG_OBJS_CFILE));
284
		//item.setImage(JavaPluginImages.get(JavaPluginImages.IMG_OBJS_CFILE));
262
		item.setControl(createTextComparePage(folder));
285
		item.setControl(createTextComparePage(folder));
263
		
286
		
287
		item= new TabItem(folder, SWT.NONE);
288
		item.setText(Utilities.getString("ComparePreferencePage.filteredCompareTab.label"));	//$NON-NLS-1$
289
		//item.setImage(JavaPluginImages.get(JavaPluginImages.IMG_OBJS_CFILE));
290
		item.setControl(createFilteredComparePage(folder));
291
		
264
		initializeFields();
292
		initializeFields();
265
		Dialog.applyDialogFont(folder);
293
		Dialog.applyDialogFont(folder);
266
		return folder;
294
		return folder;
Lines 423-428 public class ComparePreferencePage extends PreferencePage implements IWorkbenchP Link Here
423
		
451
		
424
		return  c;
452
		return  c;
425
	}
453
	}
454
	
455
	private Control createFilteredComparePage(TabFolder folder) {
456
		Composite pageComponent= new Composite(folder, SWT.NULL);
457
		GridLayout layout= new GridLayout();
458
		layout.numColumns = 2;
459
        pageComponent.setLayout(layout);
460
        GridData data = new GridData();
461
        data.verticalAlignment = GridData.FILL;
462
        data.horizontalAlignment = GridData.FILL;
463
        pageComponent.setLayoutData(data);
464
        
465
		// layout the ignore table & its buttons
466
        Label ignoreLabel = new Label(pageComponent, SWT.LEFT);
467
        ignoreLabel.setText(Utilities.getString("ComparePreferencePage.filteredCompareTab.text"));
468
        data = new GridData();
469
        data.horizontalAlignment = GridData.FILL;
470
        data.horizontalSpan = 2;
471
        ignoreLabel.setLayoutData(data);
472
473
        ignoreTable = new Table(pageComponent, SWT.MULTI | SWT.BORDER);
474
        data = new GridData(GridData.FILL_BOTH);
475
        data.heightHint = ignoreTable.getItemHeight() * 7;
476
        ignoreTable.setLayoutData(data);
477
478
        Composite groupComponent = new Composite(pageComponent, SWT.NULL);
479
        GridLayout groupLayout = new GridLayout();
480
        groupLayout.marginWidth = 0;
481
        groupLayout.marginHeight = 0;
482
        groupComponent.setLayout(groupLayout);
483
        data = new GridData();
484
        data.verticalAlignment = GridData.FILL;
485
        data.horizontalAlignment = GridData.FILL;
486
        groupComponent.setLayoutData(data);
487
488
        Button addIgnoreButton = new Button(groupComponent, SWT.PUSH);
489
        addIgnoreButton.setText(Utilities.getString("ComparePreferencePage.filteredCompareTab.addExpression"));
490
        addIgnoreButton.setLayoutData(data);
491
        setButtonLayoutData(addIgnoreButton);
492
493
        final Button removeIgnoreButton = new Button(groupComponent, SWT.PUSH);
494
        removeIgnoreButton.setText(Utilities.getString("ComparePreferencePage.filteredCompareTab.removeExpression")); 
495
        setButtonLayoutData(removeIgnoreButton);
496
497
        // the listeners
498
        ignoreTable.addListener(SWT.Selection, new Listener() {
499
        	public void handleEvent(Event event) {
500
				if (ignoreTable.getSelectionCount() > 0) {
501
		            removeIgnoreButton.setEnabled(true);
502
		        } else {
503
		            removeIgnoreButton.setEnabled(false);
504
		        }
505
        	}
506
        });
507
        addIgnoreButton.addListener(SWT.Selection, new Listener() {
508
			public void handleEvent(Event event) {
509
				InputDialog dialog = new InputDialog(
510
		                getShell(), 
511
		                Utilities.getString("ComparePreferencePage.filteredCompareTab.addExpression.dialog.title"),
512
		                Utilities.getString("ComparePreferencePage.filteredCompareTab.addExpression.dialog.message"),
513
		                Utilities.getString("ComparePreferencePage.filteredCompareTab.addExpression.dialog.initialValue"),
514
		                new RegexpInputValidator());
515
				if (dialog.open() == Window.OK) {
516
					String value = dialog.getValue();
517
		            addIgnoreRegexp(value);
518
				}
519
			}
520
		});
521
        removeIgnoreButton.addListener(SWT.Selection, new Listener() {
522
			public void handleEvent(Event event) {
523
				int[] selection = ignoreTable.getSelectionIndices();
524
		        ignoreTable.remove(selection);
525
			}
526
		});
527
        
528
        removeIgnoreButton.setEnabled(false);
529
        return pageComponent;
530
	}
531
	
532
	private void addIgnoreRegexp(String value) {
533
        // Check if the item already exists
534
        TableItem[] items = ignoreTable.getItems();
535
        for (int i = 0; i < items.length; i++) {
536
            if (items[i].getText().equals(value)) {
537
                MessageDialog.openWarning(
538
                        getShell(), 
539
                        Utilities.getString("ComparePreferencePage.filteredCompareTab.addExpression.dialog.valueAlreadyExists.title"), 
540
                        Utilities.getString("ComparePreferencePage.filteredCompareTab.addExpression.dialog.valueAlreadyExists.message"));
541
                return;
542
            }
543
        }
544
        TableItem item = new TableItem(ignoreTable, SWT.NONE);
545
        item.setText(value);
546
    }
426
			
547
			
427
	private void initializeFields() {
548
	private void initializeFields() {
428
		
549
		
Lines 441-447 public class ComparePreferencePage extends PreferencePage implements IWorkbenchP Link Here
441
			removedLinesRegex.setText(fOverlayStore.getString(REMOVED_LINES_REGEX));
562
			removedLinesRegex.setText(fOverlayStore.getString(REMOVED_LINES_REGEX));
442
		
563
		
443
		editor.load();
564
		editor.load();
565
		
566
		fillIgnoreTable();
444
	}
567
	}
568
	
569
	private void fillIgnoreTable() {
570
        ignoreTable.removeAll();
571
        String[] ignoresPreference = getIgnoreRegexpPreference();
572
        for (int i = 0; i < ignoresPreference.length; i++) {
573
            TableItem item = new TableItem(ignoreTable, SWT.NULL);
574
            item.setText(ignoresPreference[i]);
575
        }
576
    }
445
577
446
	// overlay stuff
578
	// overlay stuff
447
	
579
	
Lines 486-489 public class ComparePreferencePage extends PreferencePage implements IWorkbenchP Link Here
486
		}
618
		}
487
		return buffer.toString();
619
		return buffer.toString();
488
	}
620
	}
621
	
622
	/*
623
	 * stores a list of ignore patterns.
624
	 */
625
	public void storeIgnoreRegexpPreferences(String[] elements) {
626
        StringBuffer buffer = new StringBuffer();
627
        for (int i = 0; i < elements.length; i++) {
628
            buffer.append(elements[i]);
629
            buffer.append(IGNORES_REGEXP_DELIMITER);
630
        }
631
        fOverlayStore.setValue(IGNORES_REGEXP, buffer.toString());
632
    }
633
	
634
	/*
635
	 * loads the list of ignore patterns.
636
	 */
637
	private String[] getIgnoreRegexpPreference() {
638
        return convertListOfIgnoreRegexp(fOverlayStore.getString(IGNORES_REGEXP));
639
    }
640
	
641
	/*
642
	 * converts the list of ignore regexp to and from values in preference store.
643
	 */
644
	public static String[] convertListOfIgnoreRegexp(String preferenceValue) {
645
        StringTokenizer tokenizer = new StringTokenizer(preferenceValue, IGNORES_REGEXP_DELIMITER);
646
        int tokenCount = tokenizer.countTokens();
647
        String[] elements = new String[tokenCount];
648
        for (int i = 0; i < tokenCount; i++) {
649
            elements[i] = tokenizer.nextToken();
650
        }
651
        return elements;
652
    }
489
}
653
}
(-)org.eclipse.compare/src/org/eclipse/compare/internal/RegexpInputValidator.java (+19 lines)
Added Link Here
1
package org.eclipse.compare.internal;
2
3
import java.util.regex.Pattern;
4
import java.util.regex.PatternSyntaxException;
5
6
import org.eclipse.jface.dialogs.IInputValidator;
7
8
public class RegexpInputValidator implements IInputValidator {
9
10
	public String isValid(String newText) {
11
		try {
12
			Pattern.compile(newText);
13
		} catch (PatternSyntaxException exception) {
14
			return "'" + newText + "' is not a valid Regexp!";
15
		}
16
		return null;
17
	}
18
19
}
(-)org.eclipse.compare/src/org/eclipse/compare/internal/ResourceCompareInput.java (-5 / +17 lines)
Lines 23-28 import org.eclipse.compare.ZipFileStructureCreator; Link Here
23
import org.eclipse.compare.structuremergeviewer.DiffNode;
23
import org.eclipse.compare.structuremergeviewer.DiffNode;
24
import org.eclipse.compare.structuremergeviewer.DiffTreeViewer;
24
import org.eclipse.compare.structuremergeviewer.DiffTreeViewer;
25
import org.eclipse.compare.structuremergeviewer.Differencer;
25
import org.eclipse.compare.structuremergeviewer.Differencer;
26
import org.eclipse.compare.structuremergeviewer.DifferencerFiltered;
26
import org.eclipse.compare.structuremergeviewer.IDiffContainer;
27
import org.eclipse.compare.structuremergeviewer.IDiffContainer;
27
import org.eclipse.compare.structuremergeviewer.IDiffElement;
28
import org.eclipse.compare.structuremergeviewer.IDiffElement;
28
import org.eclipse.compare.structuremergeviewer.IStructureComparator;
29
import org.eclipse.compare.structuremergeviewer.IStructureComparator;
Lines 403-413 class ResourceCompareInput extends CompareEditorInput { Link Here
403
			}
404
			}
404
			setTitle(title);
405
			setTitle(title);
405
			
406
			
406
			Differencer d= new Differencer() {
407
			Boolean isFiltered = (Boolean) getCompareConfiguration().getProperty("filtered");
407
				protected Object visit(Object parent, int description, Object ancestor, Object left, Object right) {
408
			
408
					return new MyDiffNode((IDiffContainer) parent, description, (ITypedElement)ancestor, (ITypedElement)left, (ITypedElement)right);
409
			Differencer d = null;
409
				}
410
			if (isFiltered != null && isFiltered.booleanValue()) {
410
			};
411
				d = new DifferencerFiltered() {
412
					protected Object visit(Object parent, int description, Object ancestor, Object left, Object right) {
413
						return new MyDiffNode((IDiffContainer) parent, description, (ITypedElement)ancestor, (ITypedElement)left, (ITypedElement)right);
414
					}
415
				};
416
			} else {
417
				d= new Differencer() {
418
					protected Object visit(Object parent, int description, Object ancestor, Object left, Object right) {
419
						return new MyDiffNode((IDiffContainer) parent, description, (ITypedElement)ancestor, (ITypedElement)left, (ITypedElement)right);
420
					}
421
				};
422
			}
411
			
423
			
412
			fRoot= d.findDifferences(fThreeWay, pm, null, fAncestor, fLeft, fRight);
424
			fRoot= d.findDifferences(fThreeWay, pm, null, fAncestor, fLeft, fRight);
413
			return fRoot;
425
			return fRoot;
(-)org.eclipse.compare/src/org/eclipse/compare/structuremergeviewer/DifferencerFiltered.java (+223 lines)
Added Link Here
1
package org.eclipse.compare.structuremergeviewer;
2
3
import java.io.BufferedReader;
4
import java.io.Closeable;
5
import java.io.IOException;
6
import java.io.InputStream;
7
import java.io.InputStreamReader;
8
import java.util.ArrayList;
9
import java.util.List;
10
11
import org.eclipse.compare.ResourceNode;
12
import org.eclipse.compare.internal.ComparePreferencePage;
13
import org.eclipse.compare.internal.CompareUIPlugin;
14
import org.eclipse.compare.internal.patch.Utilities;
15
import org.eclipse.compare.rangedifferencer.IRangeComparator;
16
import org.eclipse.compare.rangedifferencer.RangeDifference;
17
import org.eclipse.compare.rangedifferencer.RangeDifferencer;
18
import org.eclipse.core.resources.IFile;
19
import org.eclipse.core.runtime.CoreException;
20
import org.eclipse.core.runtime.Platform;
21
22
/**
23
 * A Differencer who will ignore changed lines which matches at least one of the stored pattern(s).
24
 */
25
public class DifferencerFiltered extends Differencer {
26
	
27
	/**
28
	 * This implementation of IRangeComparator breaks an input stream into lines.
29
	 * @see org.eclipse.compare.internal.merge.LineComparator
30
	 */
31
	class LineComparator implements IRangeComparator {
32
33
	    private String[] fLines;
34
35
	    public LineComparator(InputStream is, String encoding) throws IOException {
36
	        
37
	        BufferedReader br = new BufferedReader(new InputStreamReader(is, encoding));
38
	        String line;
39
	        ArrayList ar = new ArrayList();
40
	        while ((line = br.readLine()) != null) {
41
	            ar.add(line);
42
	        }
43
	        // It is the responsibility of the caller to close the stream
44
	        fLines = (String[]) ar.toArray(new String[ar.size()]);
45
	    }
46
47
	    String getLine(int ix) {
48
	        return fLines[ix];
49
	    }
50
51
	    /* (non-Javadoc)
52
	     * @see org.eclipse.compare.rangedifferencer.IRangeComparator#getRangeCount()
53
	     */
54
	    public int getRangeCount() {
55
	        return fLines.length;
56
	    }
57
58
	    /* (non-Javadoc)
59
	     * @see org.eclipse.compare.rangedifferencer.IRangeComparator#rangesEqual(int, org.eclipse.compare.rangedifferencer.IRangeComparator, int)
60
	     */
61
	    public boolean rangesEqual(int thisIndex, IRangeComparator other,
62
	            int otherIndex) {
63
	        String s1 = fLines[thisIndex];
64
	        String s2 = ((LineComparator) other).fLines[otherIndex];
65
	        return s1.equals(s2);
66
	    }
67
68
	    /* (non-Javadoc)
69
	     * @see org.eclipse.compare.rangedifferencer.IRangeComparator#skipRangeComparison(int, int, org.eclipse.compare.rangedifferencer.IRangeComparator)
70
	     */
71
	    public boolean skipRangeComparison(int length, int maxLength, IRangeComparator other) {
72
	        return false;
73
	    }
74
	}
75
76
    protected boolean contentsEqual(Object input1, Object input2) {
77
        if (input1 instanceof ResourceNode && input2 instanceof ResourceNode) {
78
            ResourceNode resLeft = (ResourceNode) input1;
79
            ResourceNode resRight = (ResourceNode) input2;
80
            if (resLeft.getResource() instanceof IFile && resRight.getResource() instanceof IFile) {
81
                IFile left = (IFile) resLeft.getResource();
82
                IFile right = (IFile) resRight.getResource();
83
                
84
                InputStream leftInput = null;
85
                InputStream rightInput = null;
86
                try {
87
                    leftInput = left.getContents();
88
                    rightInput = right.getContents();
89
                    
90
                    LineComparator leftLineComparator = new LineComparator(leftInput, Utilities.getCharset(resLeft));
91
                    LineComparator rightLineComparator = new LineComparator(rightInput, Utilities.getCharset(resRight));
92
                    
93
                    RangeDifference[] differences = RangeDifferencer.findDifferences(leftLineComparator, rightLineComparator);
94
                    
95
                    if (differences.length == 0) {
96
                    	// no diffs -> contents are equal
97
                        return true;
98
                    }
99
                    
100
                    for (int d = 0; d < differences.length; d++) {
101
                        if (! isDiffIgnorable(left, right, differences[d])) {
102
                            // we found a diff which isn't on our ignore list.
103
//                            System.out.println("I can't ignore " + left.getName() + " because of diff " + df);
104
                            return false;
105
                        }
106
                    }
107
                    // we found diffs, but all these diffs are on our ignore list.
108
//                    System.out.println("All lines with diff in file matches the ignores: " + left.getName());
109
                    return true;
110
                    
111
                } catch (Exception e) {
112
                    e.printStackTrace();
113
                    return false;
114
                } finally {
115
                	closeQuietly(leftInput);
116
                	closeQuietly(rightInput);
117
                }
118
            }
119
        }
120
        // not a resourceNode ... go the normal way...
121
        return super.contentsEqual(input1, input2);
122
    }
123
    
124
    private boolean isDiffIgnorable(IFile left, IFile right, RangeDifference diff) {
125
        
126
        try {
127
        	
128
            List linesLeft = readLines(left);
129
            List linesRight = readLines(right);
130
            
131
            // left
132
            for (int line = diff.leftStart(); line < diff.leftEnd(); line++) {
133
                String candidateLeft = (String) linesLeft.get(line);
134
                if (matches(candidateLeft)) {
135
                    // ignore line in left
136
                    continue;
137
                } else {
138
                    // found a diff which we can not ignore.
139
                    return false;
140
                }
141
            }
142
            
143
            // right
144
            for (int line = diff.rightStart(); line < diff.rightEnd(); line++) {
145
                String candidateRight = (String) linesRight.get(line);
146
                if (matches(candidateRight)) {
147
                    // ignore line in right
148
                    continue;
149
                } else {
150
                    // found a diff which we can not ignore.
151
                    return false;
152
                }
153
            }
154
            
155
        } catch (Exception e) {
156
            e.printStackTrace();
157
            return false;
158
        }
159
        // diffs we found should be ignored.
160
        return true;
161
    }
162
163
    private boolean matches(String candidate) {
164
        String regexp = getIgnoresAsRegexp();
165
        if (candidate != null && candidate.matches(regexp) ) {
166
//            System.out.println("!BINGO! Ignoring because of line: '" + candidate + "'");
167
            return true;
168
        }
169
        return false;
170
    }
171
    
172
    private String getIgnoresAsRegexp() {
173
    	String ignoresFromStore = Platform.getPreferencesService()
174
    			.getString(CompareUIPlugin.PLUGIN_ID, ComparePreferencePage.IGNORES_REGEXP, "", null);
175
    	
176
    	String[] ignores = ComparePreferencePage.convertListOfIgnoreRegexp(ignoresFromStore);
177
    	
178
        StringBuilder regexp = new StringBuilder();
179
        for (int i = 0; i < ignores.length; i++) {
180
            regexp.append("(");
181
            regexp.append(ignores[i]);
182
            regexp.append(")|");
183
        }
184
        if (regexp.length() > 0) {
185
            // cut off last '|'
186
            regexp.setLength(regexp.length() - 1);
187
        }
188
        String result = regexp.toString();
189
//        System.out.println(result);
190
        return result;
191
        
192
    }
193
    
194
    
195
    /**
196
     * Get the contents of an <code>InputStream</code> as a list of Strings,
197
     * one entry per line, using the specified character encoding.
198
     */
199
    public static List readLines(IFile file) throws IOException, CoreException {
200
    	String charset = Utilities.getCharset(file);
201
    	InputStream input = file.getContents();
202
    	InputStreamReader reader = new InputStreamReader(input, charset);
203
        BufferedReader bufferedReader = new BufferedReader(reader);
204
        List list = new ArrayList();
205
        String line = bufferedReader.readLine();
206
        while (line != null) {
207
            list.add(line);
208
            line = bufferedReader.readLine();
209
        }
210
        return list;
211
    }
212
    
213
    public void closeQuietly(Closeable closeable) {
214
        if (closeable != null) {
215
            try {
216
                closeable.close();
217
            } catch (IOException ex) {
218
                // ignore
219
            }
220
        }
221
    }
222
223
}

Return to bug 411902