From 71252991670449c90ace96a01758b5c7713f8ab2 Mon Sep 17 00:00:00 2001 From: "APAC\\LPT5KOR" Date: Fri, 6 Oct 2023 14:53:33 +0530 Subject: [PATCH] Show number of differences in the Compare editor #504 Show number of differences (Ex: 6 Differences) in the toolbar of compare editor which matches "Change markers" next to the scroll bar in compare editor Fixes https://github.com/eclipse-platform/eclipse.platform/issues/504 Show number of differences in the Compare editor #504 Fixed Issues identified during review : 1. The label is not recomputed if the diff config changes (Ignore White Space). 2. The label is incorrect for zero changes - it says 0 Difference 3. Test case failure Fixes https://github.com/eclipse-platform/eclipse.platform/issues/504 Conflicts resolution --- .../org.eclipse.compare/META-INF/MANIFEST.MF | 2 +- .../compare/LabelContributionItem.java | 66 ++++++++++++++ .../ContentMergeViewer.java | 6 +- .../contentmergeviewer/TextMergeViewer.java | 30 +++++- .../labelContributionData/file1.java | 23 +++++ .../labelContributionData/file2.java | 31 +++++++ .../compare/tests/TextMergeViewerTest.java | 91 +++++++++++++++++-- 7 files changed, 239 insertions(+), 10 deletions(-) create mode 100644 team/bundles/org.eclipse.compare/compare/org/eclipse/compare/LabelContributionItem.java create mode 100644 team/tests/org.eclipse.compare.tests/labelContributionData/file1.java create mode 100644 team/tests/org.eclipse.compare.tests/labelContributionData/file2.java diff --git a/team/bundles/org.eclipse.compare/META-INF/MANIFEST.MF b/team/bundles/org.eclipse.compare/META-INF/MANIFEST.MF index 5e15ec4a9ff..a7d1aa49b0e 100644 --- a/team/bundles/org.eclipse.compare/META-INF/MANIFEST.MF +++ b/team/bundles/org.eclipse.compare/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.compare; singleton:=true -Bundle-Version: 3.9.400.qualifier +Bundle-Version: 3.10.0.qualifier Bundle-Activator: org.eclipse.compare.internal.CompareUIPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/team/bundles/org.eclipse.compare/compare/org/eclipse/compare/LabelContributionItem.java b/team/bundles/org.eclipse.compare/compare/org/eclipse/compare/LabelContributionItem.java new file mode 100644 index 00000000000..8a2cfc3506b --- /dev/null +++ b/team/bundles/org.eclipse.compare/compare/org/eclipse/compare/LabelContributionItem.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) ETAS GmbH 2023, all rights reserved. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * ETAS GmbH - initial API and implementation + *******************************************************************************/ + +package org.eclipse.compare; + +import org.eclipse.jface.action.ControlContribution; +import org.eclipse.swt.SWT; +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.Label; + + +/** + * @since 3.10 + * + * A contribution item which delegates to a label on the tool bar. + * + */ +public class LabelContributionItem extends ControlContribution { + + private Label toolbarLabel; + private String labelName; + + /** + * @param id + * @param name + */ + public LabelContributionItem(String id, String name) { + super(id); + this.labelName = name; + } + + @Override + protected Control createControl(Composite parent) { + Composite composite = new Composite(parent, SWT.LEFT); + this.toolbarLabel = new Label(composite, SWT.LEFT); + + GridLayout compositeLayout = new GridLayout(1, false); + compositeLayout.marginTop = -3; + compositeLayout.marginBottom = -6; + composite.setLayout(compositeLayout); + GridData labelLayout = new GridData(SWT.LEFT, SWT.BOTTOM, true, true); + + this.toolbarLabel.setLayoutData(labelLayout); + this.toolbarLabel.setText(this.labelName); + + return composite; + } + + public Label getToolbarLabel() { + return toolbarLabel; + } +} diff --git a/team/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java b/team/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java index 01a6f2bd58b..3fe03dbc16f 100644 --- a/team/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java +++ b/team/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2020 IBM Corporation and others. + * Copyright (c) 2000, 2023 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -13,6 +13,7 @@ * Alex Blewitt - replace new Boolean with Boolean.valueOf - https://bugs.eclipse.org/470344 * Stefan Xenos (Google) - bug 448968 - Add diagnostic logging * Conrad Groth - Bug 213780 - Compare With direction should be configurable + * Latha Patil (ETAS GmbH) - Issue #504 Show number of differences in the Compare editor *******************************************************************************/ package org.eclipse.compare.contentmergeviewer; @@ -795,7 +796,7 @@ private void internalRefresh(Object input) { updateHeader(); if (Utilities.okToUse(fComposite) && Utilities.okToUse(fComposite.getParent())) { ToolBarManager tbm = (ToolBarManager) getToolBarManager(fComposite.getParent()); - if (tbm != null ) { + if (tbm != null) { updateToolItems(); tbm.update(true); tbm.getControl().getParent().layout(true); @@ -897,6 +898,7 @@ private void initializeToolbars(Composite parent) { tbm.removeAll(); // Define groups. + tbm.add(new Separator("diffLabel")); //$NON-NLS-1$ tbm.add(new Separator("modes")); //$NON-NLS-1$ tbm.add(new Separator("merge")); //$NON-NLS-1$ tbm.add(new Separator("navigation")); //$NON-NLS-1$ diff --git a/team/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java b/team/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java index b42c1e99567..033202ee7e9 100644 --- a/team/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java +++ b/team/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2019 IBM Corporation and others. + * Copyright (c) 2000, 2023 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -21,6 +21,7 @@ * Robin Stocker (robin@nibor.org) - Bug 399960: [Edit] Make merge arrow buttons easier to hit * John Hendrikx (hjohn@xs4all.nl) - Bug 541401 - [regression] Vertical scrollbar thumb size is wrong in compare view * Stefan Dirix (sdirix@eclipsesource.com) - Bug 473847: Minimum E4 Compatibility of Compare + * Latha Patil (ETAS GmbH) - Issue #504 Show number of differences in the Compare editor *******************************************************************************/ package org.eclipse.compare.contentmergeviewer; @@ -45,6 +46,7 @@ import org.eclipse.compare.ISharedDocumentAdapter; import org.eclipse.compare.IStreamContentAccessor; import org.eclipse.compare.ITypedElement; +import org.eclipse.compare.LabelContributionItem; import org.eclipse.compare.SharedDocumentAdapter; import org.eclipse.compare.internal.ChangeCompareFilterPropertyAction; import org.eclipse.compare.internal.ChangePropertyAction; @@ -5408,6 +5410,32 @@ private boolean isIgnoreAncestor() { updateVScrollBar(); updatePresentation(); + updateToolbarLabel(); + } + + private void updateToolbarLabel() { + final String DIFF_COUNT_ID = "DiffCount"; //$NON-NLS-1$ + ToolBarManager tbm = + (ToolBarManager) getToolBarManager(fComposite.getParent()); + int differenceCount = fMerger.changesCount(); + if (tbm != null) { + + String label = differenceCount > 1 ? differenceCount + " Differences" //$NON-NLS-1$ + : differenceCount == 1 ? differenceCount + " Difference" : "No Difference"; //$NON-NLS-1$ //$NON-NLS-2$ + LabelContributionItem labelContributionItem = new LabelContributionItem(DIFF_COUNT_ID, + label); + + if (tbm.find(DIFF_COUNT_ID) != null) { + tbm.replaceItem(DIFF_COUNT_ID, labelContributionItem); + } else { + tbm.appendToGroup("diffLabel", labelContributionItem); //$NON-NLS-1$ + } + Display.getDefault().asyncExec(() -> { + // relayout in next tick + tbm.update(true); + tbm.getControl().getParent().setRedraw(true); + }); + } } private void resetDiffs() { diff --git a/team/tests/org.eclipse.compare.tests/labelContributionData/file1.java b/team/tests/org.eclipse.compare.tests/labelContributionData/file1.java new file mode 100644 index 00000000000..148d2929486 --- /dev/null +++ b/team/tests/org.eclipse.compare.tests/labelContributionData/file1.java @@ -0,0 +1,23 @@ +package testPackage; +import java.math.*; +public class Javaclass1 { + + public static void main(String[] args) { + // TODO Auto-generated method stub + + int a=0; + + System.out.println(""); + + call_me(); + + + } + + private static void call_me() { + // TODO Auto-generated method stub + System.out.println(); + + } + +} diff --git a/team/tests/org.eclipse.compare.tests/labelContributionData/file2.java b/team/tests/org.eclipse.compare.tests/labelContributionData/file2.java new file mode 100644 index 00000000000..47ea67a80b9 --- /dev/null +++ b/team/tests/org.eclipse.compare.tests/labelContributionData/file2.java @@ -0,0 +1,31 @@ +package testPackage; + +import java.io.File; + +public class Javaclass1 { + + public static void main(String[] args) { + + + int a=0; + + System.out.println(""); + + call_me(); + + callMe(a); + + } + + private static void callMe(int a) { + // TODO Auto-generated method stub + System.out.println(); + + } + + private static void call_me() { + File f= new File(""); + System.out.println("I am calledJavaclass1.java"); + } + +} diff --git a/team/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/TextMergeViewerTest.java b/team/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/TextMergeViewerTest.java index 08ceb89438b..42c1b031eb9 100644 --- a/team/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/TextMergeViewerTest.java +++ b/team/tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/TextMergeViewerTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2018 IBM Corporation and others. + * Copyright (c) 2006, 2023 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -10,6 +10,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Latha Patil (ETAS GmbH) - Issue #504 Show number of differences in the Compare editor *******************************************************************************/ package org.eclipse.compare.tests; @@ -18,21 +19,46 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; import java.util.HashMap; import java.util.Map; -import org.eclipse.compare.*; +import org.eclipse.compare.CompareConfiguration; +import org.eclipse.compare.CompareViewerPane; +import org.eclipse.compare.ICompareFilter; +import org.eclipse.compare.IEditableContent; +import org.eclipse.compare.IStreamContentAccessor; +import org.eclipse.compare.ITypedElement; +import org.eclipse.compare.LabelContributionItem; import org.eclipse.compare.contentmergeviewer.TextMergeViewer; -import org.eclipse.compare.internal.*; +import org.eclipse.compare.internal.ChangeCompareFilterPropertyAction; +import org.eclipse.compare.internal.IMergeViewerTestAdapter; +import org.eclipse.compare.internal.MergeViewerContentProvider; +import org.eclipse.compare.internal.Utilities; import org.eclipse.compare.structuremergeviewer.DiffNode; import org.eclipse.compare.structuremergeviewer.Differencer; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.text.*; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.DocumentEvent; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IDocumentPartitioner; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITypedRegion; +import org.eclipse.jface.text.Region; +import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.*; +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.ui.PlatformUI; import org.junit.Test; @@ -480,6 +506,59 @@ public String getType() { assertNotNull(rightDoc.getDocumentPartitioner()); } + @Test + public void testToolbarLabelContribution() throws Exception { + + IPath path = IPath.fromOSString("labelContributionData/" + "file1.java"); + URL url = new URL(CompareTestPlugin.getDefault().getBundle().getEntry("/"), path.toString()); + + IPath path1= IPath.fromOSString("labelContributionData/" + "file2.java"); + URL url1 = new URL(CompareTestPlugin.getDefault().getBundle().getEntry("/"), path1.toString()); + + DiffNode parentNode = new DiffNode(new ParentTestElement(), new ParentTestElement()); + DiffNode testNode = new DiffNode(parentNode, Differencer.CHANGE, null, new EditableTestElement(url.openStream().readAllBytes()), new EditableTestElement(url1.openStream().readAllBytes())); + + runInDialogWithToolbarDiffLabel(testNode); + } + + CompareViewerPane fCompareViewerPane; + private void runInDialogWithToolbarDiffLabel(DiffNode testNode) throws Exception { + + CompareConfiguration compareConfig = new CompareConfiguration(); + Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); + Dialog dialog = new Dialog(shell) { + @Override + protected Control createDialogArea(Composite parent) { + Composite composite = (Composite) super.createDialogArea(parent); + fCompareViewerPane = new CompareViewerPane(composite, SWT.BORDER | SWT.FLAT); + composite.getChildren(); + viewer = new TestMergeViewer(fCompareViewerPane, compareConfig); + return composite; + } + }; + dialog.setBlockOnOpen(false); + dialog.open(); + viewer.setInput(testNode); + fCompareViewerPane.setContent(viewer.getControl()); + ToolBarManager toolbarManager = CompareViewerPane.getToolBarManager(fCompareViewerPane); + + processQueuedEvents(); + + IContributionItem contributionItem = toolbarManager.find("DiffCount"); + assertNotNull(contributionItem); + LabelContributionItem labelContributionItem=(LabelContributionItem) contributionItem; + assertTrue(labelContributionItem.getToolbarLabel().getText().equals("7 Differences")); + + dialog.close(); + viewer = null; + } + + private void processQueuedEvents() { + while (Display.getCurrent().readAndDispatch()) { + // Process all the events in the queue + } + + } private void runInDialogWithPartioner(Object input, Runnable runnable, final CompareConfiguration cc) throws Exception { Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();