[570162] Simplify the New XML File wizard
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/ImageFactory.java b/xml/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/ImageFactory.java
index ba1d3cf..9c89e44 100644
--- a/xml/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/ImageFactory.java
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src-catalog/org/eclipse/wst/xml/ui/internal/catalog/ImageFactory.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2006 IBM Corporation and others.
+ * Copyright (c) 2002, 2021 IBM Corporation and others.
  * 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
@@ -32,7 +32,7 @@
 
 	protected static final int[][] OVERLAY_COORDINATE = {{0, 0}, {0, 2}, {2, 0}, {2, 2}};
 
-	protected static ImageFactory INSTANCE = new ImageFactory();
+	public static ImageFactory INSTANCE = new ImageFactory();
 
 	protected Hashtable compositeImageTable = new Hashtable();
 
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewModelWizard.java b/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewModelWizard.java
index 1970684..afe152c 100644
--- a/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewModelWizard.java
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewModelWizard.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * Copyright (c) 2001, 2021 IBM Corporation and others.
  * 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
@@ -32,16 +32,21 @@
 import org.eclipse.jface.wizard.WizardPage;
 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.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.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.INewWizard;
 import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.dialogs.PreferencesUtil;
 import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
 import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
 
@@ -122,6 +127,8 @@
 		protected int selectedButton;
 		protected String[] radioButtonLabel;
 		protected Button[] radioButton;
+		private String preferenceMessage;
+		private String[] preferencePageIds;
 
 		public StartPage(String pageName, String[] radioButtonLabel) {
 			super(pageName);
@@ -129,6 +136,14 @@
 			radioButton = new Button[radioButtonLabel.length];
 		}
 
+		public StartPage(String pageName, String[] radioButtonLabel, String[] preferencePageIds, String message) {
+			super(pageName);
+			this.radioButtonLabel = radioButtonLabel;
+			radioButton = new Button[radioButtonLabel.length];
+			this.preferencePageIds = preferencePageIds;
+			this.preferenceMessage = message;
+		}
+
 		public Button getRadioButtonAtIndex(int i) {
 			Button result = null;
 			if ((i >= 0) && (i < radioButton.length)) {
@@ -148,7 +163,7 @@
 		}
 
 		public void createControl(Composite parent) {
-			Composite base = new Composite(parent, SWT.NONE);
+			final Composite base = new Composite(parent, SWT.NONE);
 			base.setLayout(new GridLayout());
 
 			// radio buttons' container
@@ -159,8 +174,7 @@
 			layout.marginWidth = 0;
 
 			radioButtonsGroup.setLayout(layout);
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			gd.heightHint = 300;
+			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
 			gd.widthHint = 400;
 			radioButtonsGroup.setLayoutData(gd);
 
@@ -170,6 +184,16 @@
 				radioButton[i].setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 				// radioButton[i].addListener(SWT.Modify, this);
 			}
+			if (preferenceMessage != null && preferencePageIds != null) {
+				new Label(base, SWT.NONE).setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+				Link link = new Link(base, SWT.NONE);
+				link.setText(preferenceMessage);
+				link.addSelectionListener(new SelectionAdapter() {
+					public void widgetSelected(SelectionEvent e) {
+						PreferencesUtil.createPreferenceDialogOn(null, preferencePageIds[0], preferencePageIds, null).open();
+					}
+				});
+			}
 			setControl(base);
 			setPageComplete(isPageComplete());
 			Dialog.applyDialogFont(parent);
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLWizard.java b/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLWizard.java
index 4244145..09d82d9 100644
--- a/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLWizard.java
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/NewXMLWizard.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2020 IBM Corporation and others.
+ * Copyright (c) 2001, 2021 IBM Corporation and others.
  * 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
@@ -81,15 +81,13 @@
 import com.ibm.icu.text.Collator;
 
 public class NewXMLWizard extends NewModelWizard {
-	protected static final int CREATE_FROM_DTD = 0;
-	protected static final int CREATE_FROM_XSD = 1;
-	protected static final int CREATE_FROM_SCRATCH = 2;
+	protected static final int CREATE_FROM_GRAMMAR = 0;
+	protected static final int CREATE_FROM_SCRATCH = 1;
 
-	protected static final String[] createFromRadioButtonLabel = {XMLWizardsMessages._UI_RADIO_XML_FROM_DTD, XMLWizardsMessages._UI_RADIO_XML_FROM_SCHEMA, XMLWizardsMessages._UI_RADIO_XML_FROM_SCRATCH};
+	protected static final String[] createFromRadioButtonLabel = {XMLWizardsMessages._UI_RADIO_XML_FROM_DTD_OR_SCHEMA, XMLWizardsMessages._UI_RADIO_XML_FROM_SCRATCH};
 
 	protected static final String[] filePageFilterExtensions = {".xml"}; //$NON-NLS-1$
-	protected static final String[] browseXSDFilterExtensions = {".xsd"}; //$NON-NLS-1$
-	protected static final String[] browseDTDFilterExtensions = {".dtd"}; //$NON-NLS-1$
+	protected static String[] browseGrammarFilterExtensions = {".xsd", ".dtd", ".ent", ".mod"}; //$NON-NLS-1$
 	
 	protected static final int OPTIONAL_ELEMENT_DEPTH_LIMIT_DEFAULT_VALUE = 2;
 	
@@ -163,7 +161,7 @@
 
 		if (grammarURI == null) {
 			// create xml from page
-			fCreateXMLFromWizardPage = new StartPage("StartPage", createFromRadioButtonLabel) //$NON-NLS-1$
+			fCreateXMLFromWizardPage = new StartPage("StartPage", createFromRadioButtonLabel, new String[]{"org.eclipse.wst.sse.ui.preferences.xml.templates"}, XMLWizardsMessages.NewXMLTemplatesWizardPage_6) //$NON-NLS-1$
 			{
 				public void createControl(Composite parent) {
 					super.createControl(parent);
@@ -175,9 +173,8 @@
 					getRadioButtonAtIndex(getCreateMode()).setFocus();
 
 					// Set the help context for each button
-					PlatformUI.getWorkbench().getHelpSystem().setHelp(fCreateXMLFromWizardPage.getRadioButtonAtIndex(0), IXMLWizardHelpContextIds.XML_NEWWIZARD_CREATEXML1_HELPID);
-					PlatformUI.getWorkbench().getHelpSystem().setHelp(fCreateXMLFromWizardPage.getRadioButtonAtIndex(1), IXMLWizardHelpContextIds.XML_NEWWIZARD_CREATEXML2_HELPID);
-					PlatformUI.getWorkbench().getHelpSystem().setHelp(fCreateXMLFromWizardPage.getRadioButtonAtIndex(2), IXMLWizardHelpContextIds.XML_NEWWIZARD_CREATEXML3_HELPID);
+					PlatformUI.getWorkbench().getHelpSystem().setHelp(fCreateXMLFromWizardPage.getRadioButtonAtIndex(0), IXMLWizardHelpContextIds.XML_NEWWIZARD_CREATEXML2_HELPID);
+					PlatformUI.getWorkbench().getHelpSystem().setHelp(fCreateXMLFromWizardPage.getRadioButtonAtIndex(1), IXMLWizardHelpContextIds.XML_NEWWIZARD_CREATEXML3_HELPID);
 				}
 			};
 
@@ -220,14 +217,7 @@
 
 		int result = CREATE_FROM_SCRATCH;
 		if (grammarURI != null) {
-			if (grammarURI.endsWith(".dtd")) //$NON-NLS-1$
-			{
-				result = CREATE_FROM_DTD;
-			}
-			else if (grammarURI.endsWith(".xsd")) //$NON-NLS-1$
-			{
-				result = CREATE_FROM_XSD;
-			}
+			result = CREATE_FROM_GRAMMAR;
 		}
 		else if (fCreateXMLFromWizardPage != null) {
 			int selectedIndex = fCreateXMLFromWizardPage.getSelectedRadioButtonIndex();
@@ -251,7 +241,8 @@
 				nextPage = selectRootElementPage;
 		}
 		else if (currentPage == fCreateXMLFromWizardPage) {
-			if (getCreateMode() == CREATE_FROM_SCRATCH) {
+			int createMode = getCreateMode();
+			if (createMode == CREATE_FROM_SCRATCH) {
 				nextPage = fNewXMLTemplatesWizardPage;
 			}
 			else if (generator.getGrammarURI() == null) {
@@ -416,15 +407,10 @@
 		public void setVisible(boolean visible) {
 			super.setVisible(visible);
 			if (visible) {
-				if (getCreateMode() == CREATE_FROM_DTD) {
-					setTitle(XMLWizardsMessages._UI_WIZARD_SELECT_DTD_FILE_TITLE);
-					setDescription(XMLWizardsMessages._UI_WIZARD_SELECT_DTD_FILE_DESC);
-					panel.setFilterExtensions(browseDTDFilterExtensions);
-				}
-				else {
-					setTitle(XMLWizardsMessages._UI_WIZARD_SELECT_XSD_FILE_TITLE);
-					setDescription(XMLWizardsMessages._UI_WIZARD_SELECT_XSD_FILE_DESC);
-					panel.setFilterExtensions(browseXSDFilterExtensions);
+				if (getCreateMode() == CREATE_FROM_GRAMMAR) {
+					setTitle(XMLWizardsMessages._UI_WIZARD_SELECT_GRAMMAR_FILE_TITLE);
+					setDescription(XMLWizardsMessages._UI_WIZARD_SELECT_GRAMMAR_FILE_DESC);
+					panel.setFilterExtensions(browseGrammarFilterExtensions);
 				}
 				generator.setGrammarURI(null);
 				generator.setCMDocument(null);
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLWizardsMessages.java b/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLWizardsMessages.java
index f5fe712..86d27ce 100644
--- a/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLWizardsMessages.java
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/XMLWizardsMessages.java
@@ -1,5 +1,5 @@
 /**********************************************************************
- * Copyright (c) 2005, 2010 IBM Corporation and others. All rights reserved.   This
+ * Copyright (c) 2005, 2021 IBM Corporation and others. 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/
@@ -16,18 +16,18 @@
 
 /**
  * Strings used by XML Wizards
- * 
- * @plannedfor 1.0
  */
 public class XMLWizardsMessages extends NLS {
 	private static final String BUNDLE_NAME = "org.eclipse.wst.xml.ui.internal.wizards.wizardResource";//$NON-NLS-1$
 
+
 	public static String _UI_DIALOG_NEW_TITLE;
 	public static String _UI_DIALOG_TITLE_INVALID_GRAMMAR;
 	public static String _UI_DIALOG_MESSAGE_INVALID_GRAMMAR;
 	public static String _UI_WIZARD_CREATE_NEW_TITLE;
 	public static String _UI_RADIO_XML_FROM_DTD;
 	public static String _UI_RADIO_XML_FROM_SCHEMA;
+	public static String _UI_RADIO_XML_FROM_DTD_OR_SCHEMA;
 	public static String _UI_RADIO_XML_FROM_SCRATCH;
 	public static String _UI_WIZARD_CREATE_XML_HEADING;
 	public static String _UI_WIZARD_CREATE_XML_EXPL;
@@ -37,6 +37,8 @@
 	public static String _UI_WIZARD_SELECT_DTD_FILE_TITLE;
 	public static String _UI_WIZARD_SELECT_XSD_FILE_DESC;
 	public static String _UI_WIZARD_SELECT_XSD_FILE_TITLE;
+	public static String _UI_WIZARD_SELECT_GRAMMAR_FILE_DESC;
+	public static String _UI_WIZARD_SELECT_GRAMMAR_FILE_TITLE;
 	public static String _UI_WIZARD_SELECT_ROOT_HEADING;
 	public static String _UI_WIZARD_SELECT_ROOT_EXPL;
 	public static String _UI_LABEL_ROOT_ELEMENT;
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/wizardResource.properties b/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/wizardResource.properties
index 4fc3987..ad2d161 100644
--- a/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/wizardResource.properties
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src-wizards/org/eclipse/wst/xml/ui/internal/wizards/wizardResource.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2001, 2010 IBM Corporation and others.
+# Copyright (c) 2001, 2021 IBM Corporation and others.
 # 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
@@ -23,7 +23,8 @@
 _UI_WIZARD_CREATE_NEW_TITLE           = New XML File
 _UI_RADIO_XML_FROM_DTD                = Create XML file from a &DTD file
 _UI_RADIO_XML_FROM_SCHEMA             = Create XML file from an &XML schema file
-_UI_RADIO_XML_FROM_SCRATCH            = Create XML file from an XML &template
+_UI_RADIO_XML_FROM_DTD_OR_SCHEMA      = Create file using a &DTD or &XML Schema file
+_UI_RADIO_XML_FROM_SCRATCH            = Create file from a &template
 _UI_WIZARD_CREATE_XML_HEADING         = Create XML File From
 _UI_WIZARD_CREATE_XML_EXPL            = Select how you would like to create your XML file.
 _UI_WIZARD_CREATE_XML_FILE_HEADING    = XML
@@ -32,6 +33,8 @@
 _UI_WIZARD_SELECT_DTD_FILE_TITLE      = Select DTD File
 _UI_WIZARD_SELECT_XSD_FILE_DESC       = Select the schema file to create the XML file.
 _UI_WIZARD_SELECT_XSD_FILE_TITLE      = Select XML Schema File
+_UI_WIZARD_SELECT_GRAMMAR_FILE_DESC   = Select the DTD or Schema file to create the XML file.
+_UI_WIZARD_SELECT_GRAMMAR_FILE_TITLE  = Select DTD or XML Schema File
 _UI_WIZARD_SELECT_ROOT_HEADING        = Select Root Element
 _UI_WIZARD_SELECT_ROOT_EXPL           = Select the root element of the XML file.
 _UI_LABEL_ROOT_ELEMENT                = Root element:
@@ -100,5 +103,5 @@
 NewXMLTemplatesWizardPage_3=Description
 NewXMLTemplatesWizardPage_4=&Use XML Template
 NewXMLTemplatesWizardPage_5=&Preview:
-NewXMLTemplatesWizardPage_6=Templates are 'New XML' templates found in the <a>XML Templates</a> preference page.
+NewXMLTemplatesWizardPage_6=Configure 'New XML' templates <a>here</a>
 NewXMLTemplatesWizardPage_7=&Templates:
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectFileOrXMLCatalogIdPanel.java b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectFileOrXMLCatalogIdPanel.java
index 8fe519a..4d9c6e3 100644
--- a/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectFileOrXMLCatalogIdPanel.java
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectFileOrXMLCatalogIdPanel.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2021 IBM Corporation and others.
  * 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
@@ -104,7 +104,7 @@
 
 		ICatalog xmlCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();
 		selectXMLCatalogIdPanel = new SelectXMLCatalogIdPanel(pageBook, xmlCatalog);
-		selectXMLCatalogIdPanel.getTableViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+		selectXMLCatalogIdPanel.getCatalogViewer().addSelectionChangedListener(new ISelectionChangedListener() {
 			public void selectionChanged(SelectionChangedEvent event) {
 				updateCompletionStateChange();
 			}
@@ -151,10 +151,8 @@
 	}
 
 	public void setFilterExtensions(String[] filterExtensions) {
-		selectSingleFileView.resetFilters();
-		selectSingleFileView.addFilterExtensions(filterExtensions);
-
-		selectXMLCatalogIdPanel.getTableViewer().setFilterExtensions(filterExtensions);
+		selectSingleFileView.setFilterExtensions(filterExtensions);
+		selectXMLCatalogIdPanel.setFilterExtensions(filterExtensions);
 	}
 
 	public void setListener(Listener listener) {
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdDialog.java b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdDialog.java
index ee9bf2e..3b3daa2 100644
--- a/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdDialog.java
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdDialog.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2021 IBM Corporation and others.
  * 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
@@ -13,7 +13,6 @@
  *     
  *******************************************************************************/
 
-
 package org.eclipse.wst.xml.ui.internal.dialogs;
 
 import org.eclipse.jface.dialogs.Dialog;
@@ -51,7 +50,7 @@
 
 	protected void buttonPressed(int buttonId) {
 		if (buttonId == IDialogConstants.OK_ID) {
-			ISelection selection = panel.getTableViewer().getSelection();
+			ISelection selection = panel.getCatalogViewer().getSelection();
 			Object selectedObject = (selection instanceof IStructuredSelection) ? ((IStructuredSelection) selection).getFirstElement() : null;
 
 			if (selectedObject instanceof ICatalogEntry) {
@@ -91,8 +90,8 @@
 				updateButtonState();
 			}
 		};
-		panel.getTableViewer().setFilterExtensions(extensions);
-		panel.getTableViewer().addSelectionChangedListener(listener);
+		panel.setFilterExtensions(extensions);
+		panel.getCatalogViewer().addSelectionChangedListener(listener);
 		return dialogArea;
 	}
 
@@ -107,7 +106,7 @@
 	}
 
 	protected void updateButtonState() {
-		ISelection selection = panel.getTableViewer().getSelection();
+		ISelection selection = panel.getCatalogViewer().getSelection();
 		okButton.setEnabled(!selection.isEmpty());
 	}
 }
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdPanel.java b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdPanel.java
index b2bb834..55d435f 100644
--- a/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdPanel.java
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/SelectXMLCatalogIdPanel.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2011 IBM Corporation and others.
+ * Copyright (c) 2001, 2021 IBM Corporation and others.
  * 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
@@ -14,17 +14,22 @@
  *******************************************************************************/
 package org.eclipse.wst.xml.ui.internal.dialogs;
 
-import java.util.Collection;
 import java.util.List;
-import java.util.Vector;
 
+import org.eclipse.jface.viewers.ColumnWeightData;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.ViewerFilter;
 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.Label;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
 import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;
 import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
 import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;
@@ -35,8 +40,9 @@
 	protected int catalogEntryType;
 	protected boolean doTableSizeHack = false;
 
-	protected XMLCatalogTableViewer tableViewer;
+	protected StructuredViewer tableViewer;
 	protected ICatalog fXmlCatalog;
+	private ViewerFilter fExtensionsFilter;
 
 	public SelectXMLCatalogIdPanel(Composite parent, ICatalog xmlCatalog) {
 		super(parent, SWT.NONE);
@@ -52,72 +58,67 @@
 		Label label = new Label(this, SWT.NONE);
 		label.setText(XMLUIMessages._UI_LABEL_XML_CATALOG_COLON);
 
-		tableViewer = createTableViewer(this);
+		tableViewer = createCatalogViewer(this);
+		tableViewer.setInput("dummy");
+
 		tableViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-		tableViewer.setInput("dummy"); //$NON-NLS-1$
 	}
 
-	protected XMLCatalogTableViewer createTableViewer(Composite parent) {
-		String headings[] = new String[2];
-		headings[0] = XMLUIMessages._UI_LABEL_KEY;
-		headings[1] = XMLUIMessages._UI_LABEL_URI;
-
-		XMLCatalogTableViewer theTableViewer = new XMLCatalogTableViewer(parent, headings) {
-
-			protected void addXMLCatalogEntries(List list, ICatalogEntry[] entries) {
-				for (int i = 0; i < entries.length; i++) {
-					ICatalogEntry entry = entries[i];
-					if (catalogEntryType == 0) {
-						list.add(entry);
-					}
-					else if (catalogEntryType == entry.getEntryType()) {
-						list.add(entry);
-					}
-				}
+	void addXMLCatalogEntries(List<ICatalogEntry> list, ICatalogEntry[] entries) {
+		for (int i = 0; i < entries.length; i++) {
+			ICatalogEntry entry = entries[i];
+			if (catalogEntryType == 0) {
+				list.add(entry);
 			}
-
-			public Collection getXMLCatalogEntries() {
-				List result = null;
-
-				if ((fXmlCatalog == null) || doTableSizeHack) {
-					// this lets us create a table with an initial height of
-					// 10 rows
-					// otherwise we get stuck with 0 row heigh table... that's
-					// too small
-					doTableSizeHack = false;
-					result = new Vector();
-					for (int i = 0; i < 6; i++) {
-						result.add(""); //$NON-NLS-1$
-					}
-				}
-				else {
-					result = new Vector();
-					processCatalog(result, fXmlCatalog);
-				}
-				return result;
+			else if (catalogEntryType == entry.getEntryType()) {
+				list.add(entry);
 			}
-			
-			private void processCatalog(List result, ICatalog catalog) {
-                addXMLCatalogEntries(result, catalog.getCatalogEntries());
-                INextCatalog[] nextCatalogs = catalog.getNextCatalogs();
-                for (int i = 0; i < nextCatalogs.length; i++) {
-                    ICatalog nextCatalog = nextCatalogs[i].getReferencedCatalog();
-                    if (nextCatalog != null) {
-                        processCatalog(result, nextCatalog);
-                    }
-                }
-			}
-		};
-		return theTableViewer;
+		}
 	}
 
+	void processCatalog(List<ICatalogEntry> result, ICatalog catalog) {
+        addXMLCatalogEntries(result, catalog.getCatalogEntries());
+        INextCatalog[] nextCatalogs = catalog.getNextCatalogs();
+        for (int i = 0; i < nextCatalogs.length; i++) {
+            ICatalog nextCatalog = nextCatalogs[i].getReferencedCatalog();
+            if (nextCatalog != null) {
+                processCatalog(result, nextCatalog);
+            }
+        }
+	}
+
+	protected StructuredViewer createCatalogViewer(Composite parent) {
+		String columnProperties[] = new String[2];
+		columnProperties[0] = XMLUIMessages._UI_LABEL_KEY;
+		columnProperties[1] = XMLUIMessages._UI_LABEL_URI;
+
+		FilteredTree viewerCreator = new FilteredTree(parent, SWT.FULL_SELECTION | SWT.BORDER, new PatternFilter(), true, true);
+		viewerCreator.getViewer().setContentProvider(new XMLCatalogEntryContentProvider());
+		viewerCreator.getViewer().setLabelProvider(new XMLCatalogEntryLabelProvider());
+
+		viewerCreator.getViewer().getTree().setLinesVisible(true);
+		viewerCreator.getViewer().getTree().setHeaderVisible(true);
+		viewerCreator.getViewer().getTree().setLinesVisible(true);
+
+		TableLayout layout = new TableLayout();
+		for (int i = 0; i < columnProperties.length; i++) {
+			TreeColumn column = new TreeColumn(viewerCreator.getViewer().getTree(), i);
+			column.setText(columnProperties[i]);
+			column.setAlignment(SWT.LEFT);
+			layout.addColumnData(new ColumnWeightData(50, true));
+		}
+		viewerCreator.getViewer().getTree().setLayout(layout);
+		viewerCreator.getViewer().getTree().setLinesVisible(false);
+		viewerCreator.getViewer().setColumnProperties(columnProperties);
+		return viewerCreator.getViewer();
+	}
 
 	public String getId() {
 		ICatalogEntry entry = getXMLCatalogEntry();
 		return entry != null ? entry.getKey() : null;
 	}
 
-	public XMLCatalogTableViewer getTableViewer() {
+	public StructuredViewer getCatalogViewer() {
 		return tableViewer;
 	}
 
@@ -140,4 +141,10 @@
 		this.catalogEntryType = catalogEntryType;
 		tableViewer.refresh();
 	}
+	void setFilterExtensions(String[] extensions) {
+		if (fExtensionsFilter != null) {
+			getCatalogViewer().removeFilter(fExtensionsFilter);
+		}
+		getCatalogViewer().addFilter(fExtensionsFilter = new XMLCatalogViewerFilter(extensions));
+	}
 }
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogEntryContentProvider.java b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogEntryContentProvider.java
new file mode 100644
index 0000000..c92cd7d
--- /dev/null
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogEntryContentProvider.java
@@ -0,0 +1,139 @@
+/*******************************************************************************

+ * Copyright (c) 2001, 2021 IBM Corporation and others.

+ * 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:

+ *     IBM Corporation - initial API and implementation

+ *     

+ *******************************************************************************/

+package org.eclipse.wst.xml.ui.internal.dialogs;

+

+import java.util.Arrays;

+import java.util.Comparator;

+import java.util.List;

+import java.util.Vector;

+

+import org.eclipse.jface.viewers.ITreeContentProvider;

+import org.eclipse.jface.viewers.Viewer;

+import org.eclipse.wst.xml.core.internal.XMLCorePlugin;

+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog;

+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement;

+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;

+import org.eclipse.wst.xml.core.internal.catalog.provisional.IDelegateCatalog;

+import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog;

+import org.eclipse.wst.xml.ui.internal.catalog.XMLCatalogMessages;

+

+import com.ibm.icu.text.Collator;

+

+public class XMLCatalogEntryContentProvider implements ITreeContentProvider {

+

+	protected Object[] roots;

+	private ICatalog fWorkingUserCatalog;

+	private ICatalog fSystemCatalog;

+	static final String USER_SPECIFIED_ENTRIES_OBJECT = XMLCatalogMessages.UI_LABEL_USER_SPECIFIED_ENTRIES;

+	static final String PLUGIN_SPECIFIED_ENTRIES_OBJECT = XMLCatalogMessages.UI_LABEL_PLUGIN_SPECIFIED_ENTRIES;

+

+	public XMLCatalogEntryContentProvider() {

+		roots = new Object[2];

+

+		roots[0] = USER_SPECIFIED_ENTRIES_OBJECT;

+		roots[1] = PLUGIN_SPECIFIED_ENTRIES_OBJECT;

+

+		ICatalog defaultCatalog = XMLCorePlugin.getDefault().getDefaultXMLCatalog();

+		INextCatalog[] nextCatalogs = defaultCatalog.getNextCatalogs();

+		for (int i = 0; i < nextCatalogs.length; i++) {

+			INextCatalog catalog = nextCatalogs[i];

+			ICatalog referencedCatalog = catalog.getReferencedCatalog();

+			if (referencedCatalog != null) {

+				if (XMLCorePlugin.SYSTEM_CATALOG_ID.equals(referencedCatalog.getId())) {

+					fSystemCatalog = referencedCatalog;

+				}

+				else if (XMLCorePlugin.USER_CATALOG_ID.equals(referencedCatalog.getId())) {

+					fWorkingUserCatalog = referencedCatalog;

+				}

+			}

+		}

+	}

+

+	public boolean isRoot(Object object) {

+		return (object instanceof String) || (object instanceof INextCatalog);

+	}

+

+	public Object[] getElements(Object element) {

+		return roots;

+	}

+

+	public Object[] getChildren(Object parentElement) {

+		Object[] result = new Object[0];

+		if (parentElement == roots[0]) {

+			result = getChildrenHelper(fWorkingUserCatalog);

+		}

+		else if (parentElement == roots[1]) {

+			result = getChildrenHelper(fSystemCatalog);

+		}

+		else if (parentElement instanceof INextCatalog) {

+			ICatalog nextCatalog = ((INextCatalog) parentElement).getReferencedCatalog();

+			result = getChildrenHelper(nextCatalog);

+		}

+		else if (parentElement instanceof IDelegateCatalog) {

+			ICatalog nextCatalog = ((IDelegateCatalog) parentElement).getReferencedCatalog();

+			result = getChildrenHelper(nextCatalog);

+		}

+		return result;

+	}

+

+	protected Object[] getChildrenHelper(ICatalog catalog) {

+

+		ICatalogEntry[] entries = catalog.getCatalogEntries();

+		if (entries.length > 0) {

+			Comparator comparator = new Comparator() {

+				public int compare(Object o1, Object o2) {

+					int result = 0;

+					if ((o1 instanceof ICatalogEntry) && (o2 instanceof ICatalogEntry)) {

+						ICatalogEntry entry1 = (ICatalogEntry) o1;

+						ICatalogEntry entry2 = (ICatalogEntry) o2;

+						result = Collator.getInstance().compare(entry1.getKey(), entry2.getKey());

+					}

+					return result;

+				}

+			};

+			Arrays.sort(entries, comparator);

+		}

+		Vector result = new Vector();

+		result.addAll(Arrays.asList(entries));

+		result.addAll(Arrays.asList(catalog.getRewriteEntries()));

+		result.addAll(Arrays.asList(catalog.getSuffixEntries()));

+		result.addAll(Arrays.asList(catalog.getDelegateCatalogs()));

+		INextCatalog[] nextCatalogs = catalog.getNextCatalogs();

+		List nextCatalogsList = Arrays.asList(nextCatalogs);

+		result.addAll(nextCatalogsList);

+

+		return result.toArray(new ICatalogElement[result.size()]);

+	}

+

+	public Object getParent(Object element) {

+		return (element instanceof String) ? null : USER_SPECIFIED_ENTRIES_OBJECT;

+	}

+

+	public boolean hasChildren(Object element) {

+		return isRoot(element) ? getChildren(element).length > 0 : false;

+	}

+

+	public void dispose() {

+		// nothing to dispose

+	}

+

+	public void inputChanged(Viewer viewer, Object old, Object newobj) {

+		// ISSUE: seems we should do something here

+	}

+

+	public boolean isDeleted(Object object) {

+		return false;

+	}

+

+}
\ No newline at end of file
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogEntryLabelProvider.java b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogEntryLabelProvider.java
new file mode 100644
index 0000000..b4d2d54
--- /dev/null
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogEntryLabelProvider.java
@@ -0,0 +1,76 @@
+/*******************************************************************************

+ * Copyright (c) 2001, 2021 IBM Corporation and others.

+ * 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:

+ *     IBM Corporation - initial API and implementation

+ *     Jens Lukowski/Innoopract - initial renaming/restructuring

+ *     

+ *******************************************************************************/

+

+package org.eclipse.wst.xml.ui.internal.dialogs;

+

+import org.eclipse.jface.viewers.ITableLabelProvider;

+import org.eclipse.jface.viewers.LabelProvider;

+import org.eclipse.swt.graphics.Image;

+import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;

+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;

+import org.eclipse.wst.xml.ui.internal.catalog.ImageFactory;

+

+public class XMLCatalogEntryLabelProvider extends LabelProvider implements ITableLabelProvider {

+

+	public Image getColumnImage(Object object, int columnIndex) {

+		Image result = null;

+		if (columnIndex == 0) {

+			Image base = null;

+			if (object instanceof ICatalogEntry) {

+				ICatalogEntry catalogEntry = (ICatalogEntry) object;

+				String uri = catalogEntry.getURI();

+				if (uri.endsWith("dtd")) { //$NON-NLS-1$

+					base = XMLCatalogTableViewer.dtdFileImage;

+				}

+				else if (uri.endsWith("xsd")) { //$NON-NLS-1$

+					base = XMLCatalogTableViewer.xsdFileImage;

+				}

+				else {

+					base = XMLCatalogTableViewer.unknownFileImage;

+				}

+

+				if (base != null) {

+					if (URIHelper.isReadableURI(uri, false)) {

+						result = base;

+					}

+					else {

+						// TODO... SSE port

+						result = base;// imageFactory.createCompositeImage(base,

+						// errorImage,

+						// ImageFactory.BOTTOM_LEFT);

+					}

+				}

+			}

+			else if (object instanceof String) {

+				result = ImageFactory.INSTANCE.getImage("icons/obj16/xmlcatalog_obj.gif");

+			}

+		}

+		return result;

+	}

+	@Override

+	public String getText(Object element) {

+		return getColumnText(element, 0);

+	}

+

+	public String getColumnText(Object object, int columnIndex) {

+		String result = null;

+		if (object instanceof ICatalogEntry) {

+			ICatalogEntry catalogEntry = (ICatalogEntry) object;

+			result = columnIndex == 0 ? catalogEntry.getKey() : catalogEntry.getURI();

+			result = URIHelper.removePlatformResourceProtocol(result);

+		}

+		return result != null ? result : (columnIndex == 0 ? object.toString() : ""); //$NON-NLS-1$

+	}

+}
\ No newline at end of file
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogTableViewer.java b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogTableViewer.java
index 37d31dd..401f8bf 100644
--- a/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogTableViewer.java
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogTableViewer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2010 IBM Corporation and others.
+ * Copyright (c) 2001, 2021 IBM Corporation and others.
  * 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
@@ -13,141 +13,25 @@
  *     
  *******************************************************************************/
 
-
 package org.eclipse.wst.xml.ui.internal.dialogs;
 
-import com.ibm.icu.text.Collator;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Comparator;
 
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.TableLayout;
 import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
-import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;
 import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImageHelper;
 import org.eclipse.wst.xml.ui.internal.editor.XMLEditorPluginImages;
 
-
+@Deprecated
 public class XMLCatalogTableViewer extends TableViewer {
 
 
-	public class CatalogEntryContentProvider implements IStructuredContentProvider {
-
-		public void dispose() {
-		}
-
-		public Object[] getElements(Object element) {
-			Object[] array = getXMLCatalogEntries().toArray();
-			Comparator comparator = new Comparator() {
-				public int compare(Object o1, Object o2) {
-					int result = 0;
-					if ((o1 instanceof ICatalogEntry) && (o2 instanceof ICatalogEntry)) {
-						ICatalogEntry mappingInfo1 = (ICatalogEntry) o1;
-						ICatalogEntry mappingInfo2 = (ICatalogEntry) o2;
-						result = Collator.getInstance().compare(mappingInfo1.getKey(), mappingInfo2.getKey());
-					}
-					return result;
-				}
-			};
-			Arrays.sort(array, comparator);
-			return array;
-		}
-
-		public void inputChanged(Viewer viewer, Object old, Object newobj) {
-		}
-
-		public boolean isDeleted(Object object) {
-			return false;
-		}
-	}
-
-	public class CatalogEntryLabelProvider extends LabelProvider implements ITableLabelProvider {
-
-		public Image getColumnImage(Object object, int columnIndex) {
-			Image result = null;
-			if (columnIndex == 0) {
-				Image base = null;
-				if (object instanceof ICatalogEntry) {
-					ICatalogEntry catalogEntry = (ICatalogEntry) object;
-					String uri = catalogEntry.getURI();
-					if (uri.endsWith("dtd")) { //$NON-NLS-1$
-						base = dtdFileImage;
-					}
-					else if (uri.endsWith("xsd")) { //$NON-NLS-1$
-						base = xsdFileImage;
-					}
-					else {
-						base = unknownFileImage;
-					}
-
-					if (base != null) {
-						if (URIHelper.isReadableURI(uri, false)) {
-							result = base;
-						}
-						else {
-							// TODO... SSE port
-							result = base;// imageFactory.createCompositeImage(base,
-							// errorImage,
-							// ImageFactory.BOTTOM_LEFT);
-						}
-					}
-				}
-			}
-			return result;
-		}
-
-		public String getColumnText(Object object, int columnIndex) {
-			String result = null;
-			if (object instanceof ICatalogEntry) {
-				ICatalogEntry catalogEntry = (ICatalogEntry) object;
-				result = columnIndex == 0 ? catalogEntry.getKey() : catalogEntry.getURI();
-				result = URIHelper.removePlatformResourceProtocol(result);
-			}
-			return result != null ? result : ""; //$NON-NLS-1$
-		}
-	}
-
-
-	class XMLCatalogTableViewerFilter extends ViewerFilter {
-		protected String[] extensions;
-
-		public XMLCatalogTableViewerFilter(String[] extensions) {
-			this.extensions = extensions;
-		}
-
-		public boolean isFilterProperty(Object element, Object property) {
-			return false;
-		}
-
-		public boolean select(Viewer viewer, Object parent, Object element) {
-			boolean result = false;
-			if (element instanceof ICatalogEntry) {
-				ICatalogEntry catalogEntry = (ICatalogEntry) element;
-				for (int i = 0; i < extensions.length; i++) {
-					if (catalogEntry.getURI().endsWith(extensions[i])) {
-						result = true;
-						break;
-					}
-				}
-			}
-			return result;
-		}
-	}
-
 	protected static Image dtdFileImage = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_DTDFILE);
 
 	protected static String ERROR_STATE_KEY = "errorstatekey"; //$NON-NLS-1$
@@ -156,6 +40,8 @@
 	protected static Image unknownFileImage = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_TXTEXT);
 	protected static Image xsdFileImage = XMLEditorPluginImageHelper.getInstance().getImage(XMLEditorPluginImages.IMG_OBJ_XSDFILE);
 
+	private XMLCatalogViewerFilter fExtensionsFilter;
+
 	// protected ImageFactory imageFactory = new ImageFactory();
 
 	public XMLCatalogTableViewer(Composite parent, String[] columnProperties) {
@@ -178,26 +64,18 @@
 
 		setColumnProperties(columnProperties);
 
-		setContentProvider(new CatalogEntryContentProvider());
-		setLabelProvider(new CatalogEntryLabelProvider());
+		setContentProvider(new XMLCatalogEntryContentProvider());
+		setLabelProvider(new XMLCatalogEntryLabelProvider());
 	}
 
 	public Collection getXMLCatalogEntries() {
 		return null;
 	}
 
-
-	public void menuAboutToShow(IMenuManager menuManager) {
-		Action action = new Action("hello") { //$NON-NLS-1$
-			public void run() {
-				System.out.println("run!"); //$NON-NLS-1$
-			}
-		};
-		menuManager.add(action);
-	}
-
 	public void setFilterExtensions(String[] extensions) {
-		resetFilters();
-		addFilter(new XMLCatalogTableViewerFilter(extensions));
+		if (fExtensionsFilter != null) {
+			removeFilter(fExtensionsFilter);
+		}
+		addFilter(fExtensionsFilter = new XMLCatalogViewerFilter(extensions));
 	}
 }
diff --git a/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogViewerFilter.java b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogViewerFilter.java
new file mode 100644
index 0000000..3d72e8f
--- /dev/null
+++ b/xml/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/dialogs/XMLCatalogViewerFilter.java
@@ -0,0 +1,51 @@
+/*******************************************************************************

+ * Copyright (c) 2001, 2021 IBM Corporation and others.

+ * 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:

+ *     IBM Corporation - initial API and implementation

+ *     

+ *******************************************************************************/

+package org.eclipse.wst.xml.ui.internal.dialogs;

+

+import org.eclipse.jface.viewers.Viewer;

+import org.eclipse.jface.viewers.ViewerFilter;

+import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry;

+

+public class XMLCatalogViewerFilter extends ViewerFilter {

+

+	protected String[] extensions;

+

+	public XMLCatalogViewerFilter() {

+	}

+

+

+	public XMLCatalogViewerFilter(String[] extensions) {

+		this.extensions = extensions;

+	}

+

+	public boolean isFilterProperty(Object element, Object property) {

+		return false;

+	}

+

+	@Override

+	public boolean select(Viewer viewer, Object parent, Object element) {

+		boolean isCatalogEntry = (element instanceof ICatalogEntry);

+		boolean result = !isCatalogEntry;

+		if (isCatalogEntry) {

+			ICatalogEntry catalogEntry = (ICatalogEntry) element;

+			for (int i = 0; i < extensions.length; i++) {

+				if (catalogEntry.getURI().endsWith(extensions[i])) {

+					result = true;

+					break;

+				}

+			}

+		}

+		return result;

+	}

+}