/******************************************************************************* * Copyright (c) 2006, 2007 IBM Corporation 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 au.gov.ga.earthsci.eclipse.extras.ide; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Rectangle; 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.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.events.IExpansionListener; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.internal.misc.StatusUtil; import org.eclipse.ui.preferences.SettingsTransfer; import au.gov.ga.earthsci.eclipse.extras.Activator; /** * The ChooseWorkspaceWithSettingsDialog is the dialog used to switch workspaces * with an optional settings export. * * @since 3.3 * */ public class ChooseWorkspaceWithSettingsDialog extends ChooseWorkspaceDialog { private static final String WORKBENCH_SETTINGS = "WORKBENCH_SETTINGS"; //$NON-NLS-1$ private static final String ENABLED_TRANSFERS = "ENABLED_TRANSFERS"; //$NON-NLS-1$ /** * The class attribute for a settings transfer. */ private static final String ATT_CLASS = "class"; //$NON-NLS-1$ /** * The name attribute for the settings transfer. */ private static final String ATT_NAME = "name"; //$NON-NLS-1$ /** * The id attribute for the settings transfer. */ private static final String ATT_ID = "id"; //$NON-NLS-1$ private static final String ATT_HELP_CONTEXT = "helpContext"; //$NON-NLS-1$ private Collection selectedSettings = new HashSet(); /** * Open a new instance of the receiver. * * @param parentShell * @param launchData * @param suppressAskAgain * @param centerOnMonitor */ public ChooseWorkspaceWithSettingsDialog(Shell parentShell, ChooseWorkspaceData launchData, boolean suppressAskAgain, boolean centerOnMonitor) { super(parentShell, launchData, suppressAskAgain, centerOnMonitor); } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.ide.ChooseWorkspaceDialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ protected Control createDialogArea(Composite parent) { Control top = super.createDialogArea(parent); PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IIDEHelpContextIds.SWITCH_WORKSPACE_ACTION); createSettingsControls((Composite) top); applyDialogFont(parent); return top; } /** * Create the controls for selecting the controls we are going to export. * * @param workArea */ private void createSettingsControls(Composite workArea) { final FormToolkit toolkit = new FormToolkit(workArea.getDisplay()); workArea.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { toolkit.dispose(); }}); final ScrolledForm form = toolkit.createScrolledForm(workArea); form.setBackground(workArea.getBackground()); form.getBody().setLayout(new GridLayout()); GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); form.setLayoutData(layoutData); final ExpandableComposite expandable = toolkit .createExpandableComposite(form.getBody(), ExpandableComposite.TWISTIE); expandable .setText(IDEWorkbenchMessages.ChooseWorkspaceWithSettingsDialog_SettingsGroupName); expandable.setBackground(workArea.getBackground()); expandable.setLayout(new GridLayout()); expandable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); expandable.addExpansionListener(new IExpansionListener() { boolean notExpanded = true; /* * (non-Javadoc) * * @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanged(org.eclipse.ui.forms.events.ExpansionEvent) */ public void expansionStateChanged(ExpansionEvent e) { form.reflow(true); if (e.getState() && notExpanded) { getShell().setRedraw(false); Rectangle shellBounds = getShell().getBounds(); int entriesToShow = Math.min(4, SettingsTransfer .getSettingsTransfers().length); shellBounds.height += convertHeightInCharsToPixels(entriesToShow) + IDialogConstants.VERTICAL_SPACING; getShell().setBounds(shellBounds); getShell().setRedraw(true); notExpanded = false; } } /* * (non-Javadoc) * * @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanging(org.eclipse.ui.forms.events.ExpansionEvent) */ public void expansionStateChanging(ExpansionEvent e) { // Nothing to do here } }); Composite sectionClient = toolkit.createComposite(expandable); sectionClient.setLayout(new GridLayout()); sectionClient.setBackground(workArea.getBackground()); if (createButtons(toolkit, sectionClient)) expandable.setExpanded(true); expandable.setClient(sectionClient); } /** * Create the buttons for the settings transfer. * * @param toolkit * @param sectionClient * @return boolean <code>true</code> if any were selected */ private boolean createButtons(FormToolkit toolkit, Composite sectionClient) { IConfigurationElement[] settings = SettingsTransfer .getSettingsTransfers(); String[] enabledSettings = getEnabledSettings(Activator .getDefault().getDialogSettings() .getSection(WORKBENCH_SETTINGS)); for (int i = 0; i < settings.length; i++) { final IConfigurationElement settingsTransfer = settings[i]; final Button button = toolkit.createButton(sectionClient, settings[i].getAttribute(ATT_NAME), SWT.CHECK); String helpId = settings[i].getAttribute(ATT_HELP_CONTEXT); if (helpId != null) PlatformUI.getWorkbench().getHelpSystem().setHelp(button, helpId); if (enabledSettings != null && enabledSettings.length > 0) { String id = settings[i].getAttribute(ATT_ID); for (int j = 0; j < enabledSettings.length; j++) { if (enabledSettings[j].equals(id)) { button.setSelection(true); selectedSettings.add(settingsTransfer); break; } } } button.setBackground(sectionClient.getBackground()); button.addSelectionListener(new SelectionAdapter() { /* * (non-Javadoc) * * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ public void widgetSelected(SelectionEvent e) { if (button.getSelection()) selectedSettings.add(settingsTransfer); else selectedSettings.remove(settingsTransfer); } }); } return enabledSettings != null && enabledSettings.length > 0; } /** * Get the settings for the receiver based on the entries in section. * * @param section * @return String[] or <code>null</code> */ private String[] getEnabledSettings(IDialogSettings section) { if (section == null) return null; return section.getArray(ENABLED_TRANSFERS); } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.ide.ChooseWorkspaceDialog#okPressed() */ protected void okPressed() { Iterator settingsIterator = selectedSettings.iterator(); MultiStatus result = new MultiStatus( PlatformUI.PLUGIN_ID, IStatus.OK, IDEWorkbenchMessages.ChooseWorkspaceWithSettingsDialog_ProblemsTransferTitle, null); IPath path = new Path(getWorkspaceLocation()); String[] selectionIDs = new String[selectedSettings.size()]; int index = 0; while (settingsIterator.hasNext()) { IConfigurationElement elem = (IConfigurationElement) settingsIterator .next(); result.add(transferSettings(elem, path)); selectionIDs[index] = elem.getAttribute(ATT_ID); } if (result.getSeverity() != IStatus.OK) { ErrorDialog .openError( getShell(), IDEWorkbenchMessages.ChooseWorkspaceWithSettingsDialog_TransferFailedMessage, IDEWorkbenchMessages.ChooseWorkspaceWithSettingsDialog_SaveSettingsFailed, result); return; } saveSettings(selectionIDs); super.okPressed(); } /** * Save the ids of the selected elements. * * @param selectionIDs */ private void saveSettings(String[] selectionIDs) { IDialogSettings settings = Activator.getDefault() .getDialogSettings().getSection(WORKBENCH_SETTINGS); if (settings == null) settings = Activator.getDefault().getDialogSettings() .addNewSection(WORKBENCH_SETTINGS); settings.put(ENABLED_TRANSFERS, selectionIDs); } /** * Take the values from element and execute the class for path. * * @param elem * @param path * @return IStatus the result of the settings transfer. */ private IStatus transferSettings(final IConfigurationElement element, final IPath path) { final IStatus[] exceptions = new IStatus[1]; SafeRunner.run(new ISafeRunnable() { /* * (non-Javadoc) * * @see org.eclipse.core.runtime.ISafeRunnable#run() */ public void run() throws Exception { try { SettingsTransfer transfer = (SettingsTransfer) WorkbenchPlugin .createExtension(element, ATT_CLASS); transfer.transferSettings(path); } catch (CoreException exception) { exceptions[0] = exception.getStatus(); } } /* * (non-Javadoc) * * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable) */ public void handleException(Throwable exception) { exceptions[0] = StatusUtil .newStatus( IStatus.ERROR, NLS .bind( IDEWorkbenchMessages.ChooseWorkspaceWithSettingsDialog_ClassCreationFailed, element.getAttribute(ATT_CLASS)), exception); } }); if (exceptions[0] != null) return exceptions[0]; return Status.OK_STATUS; } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsStrategy() */ protected int getDialogBoundsStrategy() { return DIALOG_PERSISTLOCATION; } }