/******************************************************************************* * Copyright (c) 2000, 2006 IBM Corporation, 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ecf.ui.wizards; import java.util.ArrayList; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.ecf.core.ContainerFactory; import org.eclipse.ecf.core.ContainerTypeDescription; import org.eclipse.ecf.internal.ui.Activator; import org.eclipse.ecf.internal.ui.Messages; import org.eclipse.ecf.internal.ui.wizards.*; import org.eclipse.ecf.ui.ContainerConfigurationResult; import org.eclipse.ecf.ui.IConfigurationWizard; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.viewers.*; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.WizardSelectionPage; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.activities.ITriggerPoint; import org.eclipse.ui.activities.WorkbenchActivityHelper; import org.eclipse.ui.dialogs.FilteredTree; import org.eclipse.ui.dialogs.PatternFilter; import org.eclipse.ui.model.AdaptableList; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.wizards.IWizardCategory; /** * A wizard page for {@link ConfigurationWizardSelectionWizard}. */ public class ConfigurationWizardSelectionPage extends WizardSelectionPage { private static final int CONTAINERTYPEDESCRIPTION_ERROR_CODE = 333; protected IWorkbench workbench; protected TreeViewer treeViewer; protected CategorizedWizardSelectionTree wizardSelectionTree; protected IStructuredSelection currentResourceSelection; protected IWorkbench getWorkbench() { return this.workbench; } protected TreeViewer getTreeViewer() { return treeViewer; } protected void setTreeViewer(TreeViewer viewer) { treeViewer = viewer; } protected class CategorizedWizardSelectionTree { private final static int SIZING_LISTS_HEIGHT = 200; private IWizardCategory wizardCategories; private String message; private TreeViewer viewer; /** * Constructor for CategorizedWizardSelectionTree * * @param categories * root wizard category for the wizard type * @param msg * message describing what the user should choose from the * tree. */ protected CategorizedWizardSelectionTree(IWizardCategory categories, String msg) { this.wizardCategories = categories; this.message = msg; } /** * Create the tree viewer and a message describing what the user should * choose from the tree. * * @param parent * Composite on which the tree viewer is to be created * @return Comoposite with all widgets */ protected Composite createControl(Composite parent) { Font font = parent.getFont(); // create composite for page. Composite outerContainer = new Composite(parent, SWT.NONE); outerContainer.setLayout(new GridLayout()); outerContainer.setLayoutData(new GridData(GridData.FILL_BOTH)); outerContainer.setFont(font); Label messageLabel = new Label(outerContainer, SWT.NONE); if (message != null) { messageLabel.setText(message); } messageLabel.setFont(font); createFilteredTree(outerContainer); layoutTopControl(viewer.getControl()); return outerContainer; } /** * Create the categorized tree viewer. * * @param parent */ private void createFilteredTree(Composite parent) { // Create a FilteredTree for the categories and wizards FilteredTree filteredTree = new FilteredTree(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, new WizardPatternFilter()); viewer = filteredTree.getViewer(); filteredTree.setFont(parent.getFont()); viewer.setContentProvider(new WizardContentProvider()); viewer.setLabelProvider(new WorkbenchLabelProvider()); viewer.setComparator(new ViewerComparator() { public int category(Object element) { if (element instanceof WizardCollectionElement) { String id = ((WizardCollectionElement) element).getId(); String wizardCategory = Messages.ConfigurationWizardSelectionPage_WIZARD_CATEGORY; if (wizardCategory != null && wizardCategory.equals(id)) return 1; String uncategorizedCategory = Messages.ConfigurationWizardSelectionPage_UNCATEGORIZED_WIZARD_CATEGORY; if (uncategorizedCategory != null && uncategorizedCategory.equals(id)) return 3; return 2; } return super.category(element); } }); ArrayList inputArray = new ArrayList(); boolean expandTop = false; if (wizardCategories != null) { if (wizardCategories.getParent() == null) { IWizardCategory[] children = wizardCategories.getCategories(); for (int i = 0; i < children.length; i++) { inputArray.add(children[i]); } } else { expandTop = true; inputArray.add(wizardCategories); } } // ensure the category is expanded. If there is a remembered // expansion it will be set later. if (expandTop) { viewer.setAutoExpandLevel(2); } AdaptableList input = new AdaptableList(inputArray); // filter wizard list according to capabilities that are enabled viewer.addFilter(new WizardActivityFilter()); viewer.setInput(input); } protected class WizardPatternFilter extends PatternFilter { /** * Create a new instance of a WizardPatternFilter * */ public WizardPatternFilter() { super(); } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.dialogs.PatternFilter#isElementSelectable(java.lang.Object) */ public boolean isElementSelectable(Object element) { return element instanceof WorkbenchWizardElement; } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.dialogs.PatternFilter#isElementMatch(org.eclipse.jface.viewers.Viewer, * java.lang.Object) */ protected boolean isLeafMatch(Viewer v, Object element) { if (element instanceof WizardCollectionElement) return false; if (element instanceof WorkbenchWizardElement) { WorkbenchWizardElement desc = (WorkbenchWizardElement) element; String text = desc.getLabel(); if (wordMatches(text)) return true; } return false; } } /** * * @return the categorized tree viewer */ protected TreeViewer getViewer() { return viewer; } /** * Layout for the given control. * * @param control */ private void layoutTopControl(Control control) { GridData data = new GridData(GridData.FILL_BOTH); int availableRows = control.getParent().getDisplay().getClientArea().height / (control.getParent().getFont().getFontData())[0].getHeight(); // Only give a height hint if the dialog is going to be too small if (availableRows > 50) { data.heightHint = SIZING_LISTS_HEIGHT; } else { data.heightHint = availableRows * 3; } control.setLayoutData(data); } } public ConfigurationWizardSelectionPage(IWorkbench workbench, IStructuredSelection selection) { super(Messages.ConfigurationWizardSelectionPage_CONFIGURATION_WIZARD_PAGE_NAME); this.workbench = workbench; this.currentResourceSelection = selection; setTitle(Messages.Select); } protected ITriggerPoint getTriggerPoint() { return getWorkbench().getActivitySupport().getTriggerPointManager().getTriggerPoint(IWizardRegistryConstants.CONFIGURE_EPOINT_ID); } protected ContainerConfigurationResult getContainerResult() { ConfigurationWizardNode cwn = (ConfigurationWizardNode) getSelectedNode(); if (cwn == null) return null; return ((IConfigurationWizard) getSelectedNode().getWizard()).getConfigurationResult(); } private ContainerTypeDescription getContainerTypeDescriptionForElement(WorkbenchWizardElement element) { ContainerTypeDescription typeDescription = ContainerFactory.getDefault().getDescriptionByName(element.getContainerTypeName()); if (typeDescription == null) { String msg = NLS.bind(Messages.ConfigurationWizardSelectionPage_ERROR_MESSAGE, element); setErrorMessage(msg); ErrorDialog.openError(getShell(), Messages.ConfigurationWizardSelectionPage_CONFIGRATION_ERROR_TITLE, Messages.ConfigurationWizardSelectionPage_CONFIGURATION_ERROR_MESSAGE, new Status(IStatus.ERROR, Activator.PLUGIN_ID, CONTAINERTYPEDESCRIPTION_ERROR_CODE, msg, null)); return null; } return typeDescription; } protected void updateSelectedNode(WorkbenchWizardElement wizardElement) { setErrorMessage(null); if (wizardElement == null) { updateMessage(); setSelectedNode(null); return; } setSelectedNode(new ConfigurationWizardNode(getWorkbench(), this, wizardElement, getContainerTypeDescriptionForElement(wizardElement))); setMessage(wizardElement.getDescription()); } protected IWizardCategory getRootCategory() { return new WizardsRegistryReader(Activator.PLUGIN_ID, IWizardRegistryConstants.CONFIGURE_EPOINT).getWizardElements(); } public IWizardPage getNextPage() { ITriggerPoint triggerPoint = getTriggerPoint(); if (triggerPoint == null || WorkbenchActivityHelper.allowUseOf(triggerPoint, getSelectedNode())) { return super.getNextPage(); } return null; } protected Composite createTreeViewer(Composite parent) { IWizardCategory root = getRootCategory(); wizardSelectionTree = new CategorizedWizardSelectionTree(root, Messages.ConfigurationWizardSelectionPage_SELECT); Composite importComp = wizardSelectionTree.createControl(parent); wizardSelectionTree.getViewer().addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { listSelectionChanged(event.getSelection()); } }); wizardSelectionTree.getViewer().addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { treeDoubleClicked(event); } }); setTreeViewer(wizardSelectionTree.getViewer()); return importComp; } protected void treeDoubleClicked(DoubleClickEvent event) { ISelection selection = event.getViewer().getSelection(); IStructuredSelection ss = (IStructuredSelection) selection; listSelectionChanged(ss); Object element = ss.getFirstElement(); TreeViewer v = (TreeViewer) event.getViewer(); if (v.isExpandable(element)) { v.setExpandedState(element, !v.getExpandedState(element)); } else if (element instanceof WorkbenchWizardElement) { if (canFlipToNextPage()) { getContainer().showPage(getNextPage()); } } getContainer().showPage(getNextPage()); } protected void listSelectionChanged(ISelection selection) { setErrorMessage(null); IStructuredSelection ss = (IStructuredSelection) selection; Object sel = ss.getFirstElement(); if (sel instanceof WorkbenchWizardElement) { WorkbenchWizardElement currentWizardSelection = (WorkbenchWizardElement) sel; updateSelectedNode(currentWizardSelection); } else { updateSelectedNode(null); } } protected void updateMessage() { TreeViewer viewer = getTreeViewer(); if (viewer != null) { ISelection selection = viewer.getSelection(); IStructuredSelection ss = (IStructuredSelection) selection; Object sel = ss.getFirstElement(); if (sel instanceof WorkbenchWizardElement) { updateSelectedNode((WorkbenchWizardElement) sel); } else { setSelectedNode(null); } } else { setMessage(null); } } public void createControl(Composite parent) { Font font = parent.getFont(); Composite outerContainer = new Composite(parent, SWT.NONE); outerContainer.setLayout(new GridLayout()); outerContainer.setLayoutData(new GridData(GridData.FILL_BOTH)); outerContainer.setFont(font); Composite comp = createTreeViewer(outerContainer); Dialog.applyDialogFont(comp); setControl(outerContainer); } }