/******************************************************************************* * Copyright (c) 2007 Remy Suen, Composent, Inc., 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: * Remy Suen <remy.suen@gmail.com> - initial API and implementation * Scott Lewis <slewis@composent.com> - error checking ******************************************************************************/ package org.eclipse.ecf.internal.ui.actions; import java.util.*; import java.util.List; import org.eclipse.core.runtime.*; import org.eclipse.ecf.core.*; import org.eclipse.ecf.internal.ui.Activator; import org.eclipse.ecf.internal.ui.Messages; import org.eclipse.ecf.internal.ui.wizards.IWizardRegistryConstants; import org.eclipse.ecf.ui.*; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.*; import org.eclipse.ui.*; import org.eclipse.ui.dialogs.ElementListSelectionDialog; // TODO, we should rework this class... it's confusing >_< public class SelectProviderAction implements IWizardRegistryConstants, IWorkbenchWindowActionDelegate, IWorkbenchWindowPulldownDelegate, IViewActionDelegate { private IWorkbenchWindow window; private Menu menu; private HashMap map = new HashMap(); private List elements = new ArrayList(); private IExtension[] configurationWizards; public SelectProviderAction() { try { IExtensionRegistry registry = Activator.getDefault().getExtensionRegistry(); if (registry != null) { configurationWizards = registry.getExtensionPoint(CONFIGURE_EPOINT_ID).getExtensions(); IExtension[] connectWizards = registry.getExtensionPoint(CONNECT_EPOINT_ID).getExtensions(); for (int i = 0; i < connectWizards.length; i++) { final IConfigurationElement[] ices = connectWizards[i].getConfigurationElements(); for (int j = 0; j < ices.length; j++) { if (ices[j].getName().equals(ELEMENT_CATEGORY)) { continue; } final String factoryName = ices[j].getAttribute(ATT_CONTAINER_TYPE_NAME); final IConfigurationWizard wizard = getWizard(configurationWizards, factoryName); final IConfigurationElement ice = ices[j]; ContainerTypeDescription typeDescription = ContainerFactory.getDefault().getDescriptionByName(factoryName); if (typeDescription != null) { if (!typeDescription.isHidden()) { elements.add(ice); // add to list if (wizard == null) { map.put(ice.getAttribute(ATT_NAME), new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { openConnectWizard(ice, factoryName); } }); } else { map.put(ice.getAttribute(ATT_NAME), new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { openConnectWizard(wizard, ice, factoryName); } }); } } } else { Activator.getDefault().getLog().log(new Status(IStatus.WARNING, Activator.PLUGIN_ID, IStatus.WARNING, NLS.bind(Messages.SelectProviderAction_WARNING_CONTAINER_TYPE_DESCRIPTION_NOT_FOUND, factoryName), null)); } } } } } catch (Exception e) { e.printStackTrace(); } } void openConnectWizard(IConfigurationElement element, String factoryName) { try { IContainer container = ContainerFactory.getDefault().createContainer(factoryName); IConnectWizard icw = (IConnectWizard) element.createExecutableExtension(ATT_CLASS); icw.init(window.getWorkbench(), container); WizardDialog dialog = new WizardDialog(window.getShell(), icw); dialog.open(); } catch (Exception ex) { ex.printStackTrace(); } } void openConnectWizard(IConfigurationWizard wizard, IConfigurationElement element, String factoryName) { try { IWorkbench workbench = window.getWorkbench(); wizard.init(workbench, ContainerFactory.getDefault().getDescriptionByName(factoryName)); WizardDialog dialog = new WizardDialog(window.getShell(), wizard); if (dialog.open() == Window.OK) { IConnectWizard icw = (IConnectWizard) element.createExecutableExtension(ATT_CLASS); icw.init(workbench, wizard.getConfigurationResult().getContainer()); dialog = new WizardDialog(window.getShell(), icw); dialog.open(); } } catch (Exception ex) { ex.printStackTrace(); } } public void dispose() { // dispose of the menu if (menu != null && !menu.isDisposed()) { menu.dispose(); } } public void init(IWorkbenchWindow w) { this.window = w; } public void run(IAction action) { ElementListSelectionDialog dialog = new ElementListSelectionDialog(window.getShell(), new ProviderLabelProvider()); dialog.setElements(elements.toArray()); dialog.setTitle(Messages.SelectProviderAction_selectProviderDialog_title); dialog.setMessage(Messages.SelectProviderAction_selectProviderDialog_message); dialog.setImage(SharedImages.getImage(SharedImages.IMG_COMMUNICATIONS)); dialog.setHelpAvailable(false); if (dialog.open() == Window.OK) { Object[] result = dialog.getResult(); IConfigurationElement element = (IConfigurationElement) result[0]; String factoryName = element.getAttribute(ATT_CONTAINER_TYPE_NAME); IConfigurationWizard wizard = getWizard(configurationWizards, factoryName); if (wizard == null) { openConnectWizard(element, factoryName); } else { openConnectWizard(wizard, element, factoryName); } } } public void selectionChanged(IAction action, ISelection selection) { // nothing to do } private static IConfigurationWizard getWizard(IExtension[] extensions, String containerFactoryName) { for (int i = 0; i < extensions.length; i++) { IConfigurationElement[] elements = extensions[i].getConfigurationElements(); for (int j = 0; j < elements.length; j++) { if (containerFactoryName.equals(elements[j].getAttribute(ATT_CONTAINER_TYPE_NAME))) { IConfigurationWizard wizard = null; try { wizard = (IConfigurationWizard) elements[j].createExecutableExtension(ATT_CLASS); } catch (CoreException e) { Activator.log(e.getMessage()); } return wizard; } } } return null; } public Menu getMenu(Control parent) { if (menu == null) { menu = new Menu(parent); for (Iterator it = map.keySet().iterator(); it.hasNext();) { String name = (String) it.next(); MenuItem item = new MenuItem(menu, SWT.PUSH); item.setText(name); item.addSelectionListener((SelectionListener) map.get(name)); } } return menu; } // isn't this a funny name? class ProviderLabelProvider extends LabelProvider { public Image getImage(Object element) { return null; } public String getText(Object element) { IConfigurationElement provider = (IConfigurationElement) element; return provider.getAttribute(ATT_NAME); } } public void init(IViewPart view) { this.window = view.getSite().getWorkbenchWindow(); } }