From 24db6db5a6b31ad65d6f3a0f92b53e6cd709621d Mon Sep 17 00:00:00 2001 From: Enda O Brien Date: Fri, 20 Sep 2024 13:19:55 +0100 Subject: [PATCH] 579498 filter dialog types #144 Squashed commit of the following: commit 94f352d0a8a1154c9781beb5c8de3e5199c1f1e3 Author: Enda O Brien Date: Thu Apr 4 17:07:02 2024 +0100 Fixed a couple of warnings in test code commit 49a195d9a2f882d65ef67a3784cc653b3f1bcbe4 Author: Enda O Brien Date: Wed Aug 24 15:54:38 2022 +0100 put add and addAll back in previous order commit 7dd8032edbd80b8cc0e5887f66800b497d2bd9b5 Author: Enda O Brien Date: Wed Aug 24 15:11:23 2022 +0100 Moved copyright to be first lines in files commit 87763b5ed2ee0b382a8d67d2d5acd0d71b76a1a1 Author: Enda O Brien Date: Wed Aug 24 14:41:46 2022 +0100 Modified copyright message in test code to include my name commit 1b08d4a240da3ceb00bed57fc3a8a61395529af5 Author: Enda O Brien Date: Wed Aug 24 14:09:12 2022 +0100 updated documentation of markerSupport.exsd commit 579fca05713788e3b11e7c071d64bbc639aae612 Author: Enda O Brien Date: Wed Aug 24 12:04:44 2022 +0100 Added copyright notice to test code commit 1271c95c57fafe27fca715d2cd2afa81e271a552 Author: Enda O Brien Date: Wed Aug 24 11:49:13 2022 +0100 Fixed whitespace differences commit 36e50cd1c5de661421665bd4cb1c2a10a7cd119b Author: Enda O Brien Date: Thu Jun 9 14:16:44 2022 +0100 Test code for application attribute on marker type reference commit 01940b2a4d97603cd04e129aa8435afe62e12618 Author: Enda O Brien Date: Thu Jun 9 10:57:55 2022 +0100 Added application attribute to type reference in marker content generator --- .../schema/markerSupport.exsd | 20 +++ .../MarkerSupportInternalUtilities.java | 20 +++ .../internal/ContentGeneratorDescriptor.java | 22 ++- .../ui/tests/NoApplicationAttribTestView.java | 18 +++ .../eclipse/ui/tests/SubTypeOnlyTestView.java | 25 +++ .../ui/tests/TypeAndSubTypeTestView.java | 25 +++ .../eclipse/ui/tests/TypeOnlyTestView.java | 26 ++++ .../ui/tests/markers/MarkerTypeTests.java | 142 ++++++++++++++++++ tests/org.eclipse.ui.tests/plugin.xml | 52 ++++++- 9 files changed, 346 insertions(+), 4 deletions(-) create mode 100644 tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/NoApplicationAttribTestView.java create mode 100644 tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/SubTypeOnlyTestView.java create mode 100644 tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/TypeAndSubTypeTestView.java create mode 100644 tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/TypeOnlyTestView.java create mode 100644 tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerTypeTests.java diff --git a/bundles/org.eclipse.ui.ide/schema/markerSupport.exsd b/bundles/org.eclipse.ui.ide/schema/markerSupport.exsd index 02e3f15ca26..d9d9ded7f2f 100644 --- a/bundles/org.eclipse.ui.ide/schema/markerSupport.exsd +++ b/bundles/org.eclipse.ui.ide/schema/markerSupport.exsd @@ -192,6 +192,26 @@ ON_ANY_IN_SAME_CONTAINER: on any item with the same top level container as the s + + + + The application attribute describes how the reference should be applied. + i.e. Does it refer to type only, type and subtypes or subtypes only. + It is optionally included. + If it is not specified it defaults to typeAndSubTypes. + + + + + + + + + + + + + diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSupportInternalUtilities.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSupportInternalUtilities.java index b86038cdd7d..e57347ad46f 100644 --- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSupportInternalUtilities.java +++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSupportInternalUtilities.java @@ -71,6 +71,26 @@ public class MarkerSupportInternalUtilities { */ public static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$ + /** + * The application attribute from a configuration element. + */ + public static final String APPLICATION = "application"; //$NON-NLS-1$ + + /** + * The sub type only attribute value from the application attribute. + */ + public static final String SUB_TYPES_ONLY = "subTypesOnly"; //$NON-NLS-1$ + + /** + * The type only attribute value from the application attribute. + */ + public static final String TYPE_ONLY = "typeOnly"; //$NON-NLS-1$ + + /** + * The type and subtype attribute value from the application attribute. + */ + public static final String TYPE_AND_SUBTYPE = "typeAndSubTypes"; //$NON-NLS-1$ + /** * The name attribute name from a configuration element. */ diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ContentGeneratorDescriptor.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ContentGeneratorDescriptor.java index 9b1242f4c78..7294eacf94c 100644 --- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ContentGeneratorDescriptor.java +++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ContentGeneratorDescriptor.java @@ -190,9 +190,25 @@ public Collection getMarkerTypes() { IConfigurationElement[] markerTypeElements = configurationElement.getChildren(MarkerSupportRegistry.MARKER_TYPE_REFERENCE); for (IConfigurationElement configElement : markerTypeElements) { String elementName = configElement.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID); - MarkerType[] types = MarkerTypesModel.getInstance().getType(elementName).getAllSubTypes(); - markerTypes.addAll(Arrays.asList(types)); - markerTypes.add(MarkerTypesModel.getInstance().getType(elementName)); + + String application = configElement.getAttribute(MarkerSupportInternalUtilities.APPLICATION) == null + ? MarkerSupportInternalUtilities.TYPE_AND_SUBTYPE + : configElement.getAttribute(MarkerSupportInternalUtilities.APPLICATION); + + switch (application) { + case MarkerSupportInternalUtilities.TYPE_ONLY: + markerTypes.add(MarkerTypesModel.getInstance().getType(elementName)); + break; + case MarkerSupportInternalUtilities.SUB_TYPES_ONLY: + markerTypes.addAll( + Arrays.asList(MarkerTypesModel.getInstance().getType(elementName).getAllSubTypes())); + break; + case MarkerSupportInternalUtilities.TYPE_AND_SUBTYPE: + default: + markerTypes.addAll( + Arrays.asList(MarkerTypesModel.getInstance().getType(elementName).getAllSubTypes())); + markerTypes.add(MarkerTypesModel.getInstance().getType(elementName)); + } } if (markerTypes.isEmpty()) { MarkerType[] types = MarkerTypesModel.getInstance().getType(IMarker.PROBLEM).getAllSubTypes(); diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/NoApplicationAttribTestView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/NoApplicationAttribTestView.java new file mode 100644 index 00000000000..5e734f7aac1 --- /dev/null +++ b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/NoApplicationAttribTestView.java @@ -0,0 +1,18 @@ +package org.eclipse.ui.tests; + +import org.eclipse.ui.views.markers.MarkerSupportView; + +/** + * @since 3.5 + * + */ +public class NoApplicationAttribTestView extends MarkerSupportView { + public static final String ID = "org.eclipse.ui.tests.noApplicationAttribTestView"; + + static final String CONTENT_GEN_ID = "org.eclipse.ui.tests.noApplicationAttribTestViewContentGenerator"; + + public NoApplicationAttribTestView() { + super(CONTENT_GEN_ID); + } + +} diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/SubTypeOnlyTestView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/SubTypeOnlyTestView.java new file mode 100644 index 00000000000..b42ac671c34 --- /dev/null +++ b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/SubTypeOnlyTestView.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2022 Enda O'Brien and others. + * + * 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: IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.ui.tests; + +import org.eclipse.ui.views.markers.MarkerSupportView; + +public class SubTypeOnlyTestView extends MarkerSupportView { + public static final String ID = "org.eclipse.ui.tests.subTypeOnlyTestView"; + + static final String CONTENT_GEN_ID = "org.eclipse.ui.tests.subTypeOnlyTestViewContentGenerator"; + + public SubTypeOnlyTestView() { + super(CONTENT_GEN_ID); + } + +} diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/TypeAndSubTypeTestView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/TypeAndSubTypeTestView.java new file mode 100644 index 00000000000..8aa32312069 --- /dev/null +++ b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/TypeAndSubTypeTestView.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2022 Enda O'Brien and others. + * + * 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: IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.ui.tests; + +import org.eclipse.ui.views.markers.MarkerSupportView; + +public class TypeAndSubTypeTestView extends MarkerSupportView { + public static final String ID = "org.eclipse.ui.tests.typeAndSubTypeTestView"; + + static final String CONTENT_GEN_ID = "org.eclipse.ui.tests.typeAndSubTypeTestViewContentGenerator"; + + public TypeAndSubTypeTestView() { + super(CONTENT_GEN_ID); + } + +} diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/TypeOnlyTestView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/TypeOnlyTestView.java new file mode 100644 index 00000000000..5bd02cad638 --- /dev/null +++ b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/TypeOnlyTestView.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2022 Enda O'Brien and others. + * + * 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: IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.ui.tests; + +import org.eclipse.ui.views.markers.MarkerSupportView; + +public class TypeOnlyTestView extends MarkerSupportView { + + public static final String ID = "org.eclipse.ui.tests.typeOnlyTestView"; + + static final String CONTENT_GEN_ID = "org.eclipse.ui.tests.typeOnlyTestViewContentGenerator"; + + public TypeOnlyTestView() { + super(CONTENT_GEN_ID); + } + +} diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerTypeTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerTypeTests.java new file mode 100644 index 00000000000..fe5cdb9589e --- /dev/null +++ b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerTypeTests.java @@ -0,0 +1,142 @@ +/******************************************************************************* + * Copyright (c) 2022 Enda O'Brien and others. + * + * 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: IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.ui.tests.markers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; + +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.internal.views.markers.ExtendedMarkersView; +import org.eclipse.ui.internal.views.markers.MarkerContentGenerator; +import org.eclipse.ui.tests.NoApplicationAttribTestView; +import org.eclipse.ui.tests.SubTypeOnlyTestView; +import org.eclipse.ui.tests.TypeAndSubTypeTestView; +import org.eclipse.ui.tests.TypeOnlyTestView; +import org.eclipse.ui.views.markers.MarkerSupportView; +import org.eclipse.ui.views.markers.internal.ContentGeneratorDescriptor; +import org.eclipse.ui.views.markers.internal.MarkerType; +import org.eclipse.ui.views.markers.internal.MarkerTypesModel; +import org.junit.Test; + +public class MarkerTypeTests { + + static final String PROBLEM_MARKER = "org.eclipse.core.resources.problemmarker"; + + @Test + public void canIncludeTypeOnly() throws Exception { + MarkerSupportView view = (MarkerSupportView) PlatformUI.getWorkbench().getActiveWorkbenchWindow() + .getActivePage().showView(TypeOnlyTestView.ID); + + MarkerContentGenerator generator = getMarkerContentGenerator(view); + Collection filterDialogTypes = getMarkerTypes(generator); + + assertEquals(1, filterDialogTypes.size()); + assertEquals(PROBLEM_MARKER, filterDialogTypes.stream().map(type -> type.getId()).findFirst().get()); + } + + @Test + public void canIncludeTypeAndSubTypes() throws Exception { + MarkerSupportView view = (MarkerSupportView) PlatformUI.getWorkbench().getActiveWorkbenchWindow() + .getActivePage().showView(TypeAndSubTypeTestView.ID); + + MarkerContentGenerator generator = getMarkerContentGenerator(view); + Collection filterDialogTypes = getMarkerTypes(generator); + + Collection markerTypes = new HashSet<>(); + markerTypes.add(MarkerTypesModel.getInstance().getType(PROBLEM_MARKER)); + markerTypes.addAll(Arrays.asList(MarkerTypesModel.getInstance().getType(PROBLEM_MARKER).getAllSubTypes())); + + assertEquals(markerTypes.size(), filterDialogTypes.size()); + assertEquals(PROBLEM_MARKER, filterDialogTypes.stream().map(type -> type.getId()) + .filter(s -> s.equals(PROBLEM_MARKER)).findFirst().get()); + + for (MarkerType type : markerTypes) { + assertTrue(filterDialogTypes.contains(type)); + } + } + + @Test + public void canIncludeSubtypesOnly() throws Exception { + MarkerSupportView view = (MarkerSupportView) PlatformUI.getWorkbench().getActiveWorkbenchWindow() + .getActivePage().showView(SubTypeOnlyTestView.ID); + + MarkerContentGenerator generator = getMarkerContentGenerator(view); + Collection filterDialogTypes = getMarkerTypes(generator); + + Collection markerTypes = new HashSet<>(); + markerTypes.addAll(Arrays.asList(MarkerTypesModel.getInstance().getType(PROBLEM_MARKER).getAllSubTypes())); + + assertEquals(markerTypes.size(), filterDialogTypes.size()); + assertTrue(PROBLEM_MARKER, filterDialogTypes.stream().map(type -> type.getId()) + .filter(s -> s.equals(PROBLEM_MARKER)).findFirst().isEmpty()); + for (MarkerType type : markerTypes) { + assertTrue(filterDialogTypes.contains(type)); + } + } + + @Test + public void typeAndSubTypesIsDefault() throws Exception { + MarkerSupportView view = (MarkerSupportView) PlatformUI.getWorkbench().getActiveWorkbenchWindow() + .getActivePage().showView(NoApplicationAttribTestView.ID); + + MarkerContentGenerator generator = getMarkerContentGenerator(view); + Collection filterDialogTypes = getMarkerTypes(generator); + + Collection markerTypes = new HashSet<>(); + markerTypes.add(MarkerTypesModel.getInstance().getType(PROBLEM_MARKER)); + markerTypes.addAll(Arrays.asList(MarkerTypesModel.getInstance().getType(PROBLEM_MARKER).getAllSubTypes())); + + assertEquals(markerTypes.size(), filterDialogTypes.size()); + assertEquals(PROBLEM_MARKER, filterDialogTypes.stream().map(type -> type.getId()) + .filter(s -> s.equals(PROBLEM_MARKER)).findFirst().get()); + + for (MarkerType type : markerTypes) { + assertTrue(filterDialogTypes.contains(type)); + } + } + + public static MarkerContentGenerator getMarkerContentGenerator(MarkerSupportView view) { + MarkerContentGenerator generator = null; + try { + Field fieldGenerator = ExtendedMarkersView.class.getDeclaredField("generator"); + fieldGenerator.setAccessible(true); + generator = (MarkerContentGenerator) fieldGenerator.get(view); + } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + } + return generator; + } + + @SuppressWarnings("unchecked") + public static Collection getMarkerTypes(MarkerContentGenerator generator) { + Collection selectedTypesCollection = null; + try { + Field generatorDescriptor = MarkerContentGenerator.class.getDeclaredField("generatorDescriptor"); + generatorDescriptor.setAccessible(true); + + ContentGeneratorDescriptor contentGeneratorDescriptor = (ContentGeneratorDescriptor) generatorDescriptor + .get(generator); + + Field markerTypesField = ContentGeneratorDescriptor.class.getDeclaredField("markerTypes"); + markerTypesField.setAccessible(true); + + selectedTypesCollection = (Collection) markerTypesField.get(contentGeneratorDescriptor); + } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + } + return selectedTypesCollection; + } +} diff --git a/tests/org.eclipse.ui.tests/plugin.xml b/tests/org.eclipse.ui.tests/plugin.xml index 3c15b5d245a..814b4507d30 100644 --- a/tests/org.eclipse.ui.tests/plugin.xml +++ b/tests/org.eclipse.ui.tests/plugin.xml @@ -190,7 +190,26 @@ class="org.eclipse.ui.tests.api.workbenchpart.ViewWithCreateControlsException" id="org.eclipse.ui.tests.api.workbenchpart.ViewWithCreateControlsException"> - + + + + + + + + + + + + + + + + + + + + + + + +