/******************************************************************************* * Copyright (c) 2004, 2012 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * QNX Software Systems - initial API and implementation * IBM Corporation *******************************************************************************/ package org.eclipse.cdt.internal.ui.wizards; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.IAction; import org.eclipse.ui.IPluginContribution; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.activities.WorkbenchActivityHelper; import org.eclipse.cdt.ui.CUIPlugin; /** * Convenience class for drop-in C/C++ Wizard contributions. */ public class CWizardRegistry { private final static String TAG_WIZARD = "wizard"; //$NON-NLS-1$ private final static String ATT_CATEGORY = "category";//$NON-NLS-1$ private final static String ATT_PROJECT = "project";//$NON-NLS-1$ private final static String TAG_PARAMETER = "parameter";//$NON-NLS-1$ private final static String TAG_NAME = "name";//$NON-NLS-1$ private final static String TAG_VALUE = "value";//$NON-NLS-1$ private final static String ATT_CTYPE = "ctype";//$NON-NLS-1$ private final static String ATT_CFILE = "cfile";//$NON-NLS-1$ private final static String ATT_CFOLDER = "cfolder";//$NON-NLS-1$ private final static String ATT_CPROJECT = "cproject";//$NON-NLS-1$ private final static String ATT_CCPROJECT = "ccproject";//$NON-NLS-1$ private final static String TAG_CLASS = "class"; //$NON-NLS-1$ private final static String TAG_ID = "id"; //$NON-NLS-1$ private final static String PL_NEW = "newWizards"; //$NON-NLS-1$ /** * Checks if wizard supports C projects. * * @param element the wizard element * * @return <code>true</code> if the given wizard element applies to a C Project */ public static boolean isCProjectWizard(IConfigurationElement element) { String category = element.getAttribute(ATT_CATEGORY); return (category != null && category.equals(CUIPlugin.CWIZARD_CATEGORY_ID)); } /** * Checks if wizard supports C++ project. * * @param element the wizard element * * @return <code>true</code> if the given wizard element applies to a C++ Project */ public static boolean isCCProjectWizard(IConfigurationElement element) { String category = element.getAttribute(ATT_CATEGORY); return (category != null && category.equals(CUIPlugin.CCWIZARD_CATEGORY_ID)); } /** * Returns IDs of all C/C++ project wizards contributed to the workbench. * * @return an array of wizard ids */ public static String[] getProjectWizardIDs() { return getWizardIDs(getProjectWizardElements()); } /** * Returns extension data for all the C/C++ project wizards contributed to the workbench. * <wizard * name="My C Wizard" * icon="icons/cwiz.gif" * category="org.eclipse.cdt.ui.newCWizards" * id="xx.MyCWizard" * class="org.xx.MyCWizard" * project="true"> * <description> * My C Wizard * </description> * </wizard> * * * @return an array of IConfigurationElement */ public static IConfigurationElement[] getProjectWizardElements() { List<IConfigurationElement> elemList = new ArrayList<IConfigurationElement>(); IConfigurationElement[] elements = getAllWizardElements(); for (int i = 0; i < elements.length; ++i) { IConfigurationElement element = elements[i]; if (isProjectWizard(element)) { elemList.add(element); } } return elemList.toArray(new IConfigurationElement[elemList.size()]); } private static boolean isProjectWizard(IConfigurationElement element) { String project = element.getAttribute(ATT_PROJECT); if (project != null) { return Boolean.valueOf(project).booleanValue(); } IConfigurationElement[] classElements = element.getChildren(TAG_CLASS); if (classElements.length > 0) { for (IConfigurationElement classElement : classElements) { IConfigurationElement[] paramElements = classElement.getChildren(TAG_PARAMETER); for (IConfigurationElement curr : paramElements) { String name = curr.getAttribute(TAG_NAME); if (name != null && (name.equals(ATT_CPROJECT) || name.equals(ATT_CCPROJECT))) { String value = curr.getAttribute(TAG_VALUE); if (value != null) return Boolean.valueOf(value).booleanValue(); } } } return false; } // fall back, if no <class> element found then assume it's a project wizard return true; } public static IAction[] getProjectWizardActions() { return createActions(getProjectWizardElements()); } /** * Returns IDs of all C/C++ type wizards contributed to the workbench. * * @return an array of wizard ids */ public static String[] getTypeWizardIDs() { return getWizardIDs(getTypeWizardElements()); } /** * Returns extension data for all the C/C++ type wizards contributed to the workbench. * <wizard * name="My C Wizard" * icon="icons/cwiz.gif" * category="org.eclipse.cdt.ui.newCWizards" * id="xx.MyCWizard"> * <class class="org.xx.MyCWizard"> * <parameter name="ctype" value="true" /> * </class> * <description> * My C Wizard * </description> * </wizard> * * @return an array of IConfigurationElement */ public static IConfigurationElement[] getTypeWizardElements() { List<IConfigurationElement> elemList = new ArrayList<IConfigurationElement>(); IConfigurationElement[] elements = getAllWizardElements(); for (int i = 0; i < elements.length; ++i) { IConfigurationElement element = elements[i]; if (isTypeWizard(element)) { elemList.add(element); } } return elemList.toArray(new IConfigurationElement[elemList.size()]); } private static boolean isTypeWizard(IConfigurationElement element) { IConfigurationElement[] classElements = element.getChildren(TAG_CLASS); if (classElements.length > 0) { for (IConfigurationElement classElement : classElements) { IConfigurationElement[] paramElements = classElement.getChildren(TAG_PARAMETER); for (IConfigurationElement curr : paramElements) { String name = curr.getAttribute(TAG_NAME); if (name != null && name.equals(ATT_CTYPE)) { String value = curr.getAttribute(TAG_VALUE); if (value != null) return Boolean.valueOf(value).booleanValue(); } } } } return false; } public static IAction[] getTypeWizardActions() { return createActions(getTypeWizardElements()); } /** * Returns IDs of all C/C++ file wizards contributed to the workbench. * * @return an array of wizard ids */ public static String[] getFileWizardIDs() { return getWizardIDs(getFileWizardElements()); } /** * Returns extension data for all the C/C++ file wizards contributed to the workbench. * <wizard * name="My C File Wizard" * icon="icons/cwiz.gif" * category="org.eclipse.cdt.ui.newCWizards" * id="xx.MyCWizard"> * <class class="org.xx.MyCFileWizard"> * <parameter name="cfile" value="true" /> * </class> * <description> * My C File Wizard * </description> * </wizard> * * @return an array of IConfigurationElement */ public static IConfigurationElement[] getFileWizardElements() { List<IConfigurationElement> elemList = new ArrayList<IConfigurationElement>(); IConfigurationElement[] elements = getAllWizardElements(); for (int i = 0; i < elements.length; ++i) { IConfigurationElement element = elements[i]; if (isFileWizard(element)) { elemList.add(element); } } return elemList.toArray(new IConfigurationElement[elemList.size()]); } private static boolean isFileWizard(IConfigurationElement element) { IConfigurationElement[] classElements = element.getChildren(TAG_CLASS); if (classElements.length > 0) { for (IConfigurationElement classElement : classElements) { IConfigurationElement[] paramElements = classElement.getChildren(TAG_PARAMETER); for (IConfigurationElement curr : paramElements) { String name = curr.getAttribute(TAG_NAME); if (name != null && name.equals(ATT_CFILE)) { String value = curr.getAttribute(TAG_VALUE); if (value != null) return Boolean.valueOf(value).booleanValue(); } } } } return false; } public static IAction[] getFolderWizardActions() { return createActions(getFolderWizardElements()); } /** * Returns IDs of all C/C++ folder wizards contributed to the workbench. * * @return an array of wizard ids */ public static String[] getFolderWizardIDs() { return getWizardIDs(getFolderWizardElements()); } /** * Returns extension data for all the C/C++ folder wizards contributed to the workbench. * <wizard * name="My C Folder Wizard" * icon="icons/cwiz.gif" * category="org.eclipse.cdt.ui.newCWizards" * id="xx.MyCWizard"> * <class class="org.xx.MyCFolderWizard"> * <parameter name="cfolder" value="true" /> * </class> * <description> * My C Folder Wizard * </description> * </wizard> * * @return an array of IConfigurationElement */ public static IConfigurationElement[] getFolderWizardElements() { List<IConfigurationElement> elemList = new ArrayList<IConfigurationElement>(); IConfigurationElement[] elements = getAllWizardElements(); for (int i = 0; i < elements.length; ++i) { IConfigurationElement element = elements[i]; if (isFolderWizard(element)) { elemList.add(element); } } return elemList.toArray(new IConfigurationElement[elemList.size()]); } private static boolean isFolderWizard(IConfigurationElement element) { IConfigurationElement[] classElements = element.getChildren(TAG_CLASS); if (classElements.length > 0) { for (IConfigurationElement classElement : classElements) { IConfigurationElement[] paramElements = classElement.getChildren(TAG_PARAMETER); for (IConfigurationElement curr : paramElements) { String name = curr.getAttribute(TAG_NAME); if (name != null && name.equals(ATT_CFOLDER)) { String value = curr.getAttribute(TAG_VALUE); if (value != null) return Boolean.valueOf(value).booleanValue(); } } } } return false; } public static IAction[] getFileWizardActions() { return createActions(getFileWizardElements()); } private static String[] getWizardIDs(IConfigurationElement[] elements) { List<String> idList = new ArrayList<String>(); // add C wizards first for (int i = 0; i < elements.length; ++i) { IConfigurationElement element= elements[i]; if (isCProjectWizard(element)) { String id = element.getAttribute(TAG_ID); if (id != null && !idList.contains(id)) { idList.add(id); } } } // now add C++ wizards for (int i = 0; i < elements.length; ++i) { IConfigurationElement element= elements[i]; if (isCCProjectWizard(element)) { String id = element.getAttribute(TAG_ID); if (id != null && !idList.contains(id)) { idList.add(id); } } } return idList.toArray(new String[idList.size()]); } private static IAction[] createActions(IConfigurationElement[] elements) { List<String> idList = new ArrayList<String>(); List<IAction> actionList = new ArrayList<IAction>(); // add C wizards first for (int i = 0; i < elements.length; ++i) { IConfigurationElement element = elements[i]; if (isCProjectWizard(element)) { String id = element.getAttribute(TAG_ID); if (id != null && !idList.contains(id)) { idList.add(id); IAction action = new OpenNewWizardAction(element); actionList.add(action); } } } // now add C++ wizards for (int i = 0; i < elements.length; ++i) { IConfigurationElement element = elements[i]; if (isCCProjectWizard(element)) { String id = element.getAttribute(TAG_ID); if (id != null && !idList.contains(id)) { idList.add(id); IAction action = new OpenNewWizardAction(element); actionList.add(action); } } } return actionList.toArray(new IAction[actionList.size()]); } private static class WizardConfig implements IPluginContribution { private IConfigurationElement fElement; public WizardConfig(IConfigurationElement element) { fElement = element; } @Override public String getLocalId() { return fElement.getAttribute("id"); //$NON-NLS-1$ } @Override public String getPluginId() { return fElement.getContributor().getName(); } } /** * Returns extension data for all the C/C++ wizards contributed to the workbench. * <wizard * name="My C Wizard" * icon="icons/cwiz.gif" * category="org.eclipse.cdt.ui.newCWizards" * id="xx.MyCWizard"> * <description> * My C Wizard * </description> * </wizard> * * @return an array of IConfigurationElement */ public static IConfigurationElement[] getAllWizardElements() { List<IConfigurationElement> elemList = new ArrayList<IConfigurationElement>(); IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(PlatformUI.PLUGIN_ID, PL_NEW); if (extensionPoint != null) { IConfigurationElement[] elements = extensionPoint.getConfigurationElements(); for (IConfigurationElement element : elements) { if (element.getName().equals(TAG_WIZARD)) { if (!WorkbenchActivityHelper.filterItem(new WizardConfig(element))) { String category = element.getAttribute(ATT_CATEGORY); if (category != null && (category.equals(CUIPlugin.CCWIZARD_CATEGORY_ID) || category.equals(CUIPlugin.CWIZARD_CATEGORY_ID))) { elemList.add(element); } } } } } return elemList.toArray(new IConfigurationElement[elemList.size()]); } }