/******************************************************************************* * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * *******************************************************************************/ package com.liferay.ide.ui.dialog; import java.io.File; 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.Platform; 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.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Group; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.internal.ide.ChooseWorkspaceData; import org.eclipse.ui.internal.ide.ChooseWorkspaceDialog; import org.eclipse.ui.internal.ide.IDEWorkbenchMessages; import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; import org.eclipse.ui.internal.ide.IIDEHelpContextIds; import org.eclipse.ui.internal.ide.StatusUtil; import org.eclipse.ui.preferences.SettingsTransfer; /** * @author Andy Wu */ @SuppressWarnings( "restriction" ) public class ChooseWorkspaceWithPreferenceDialog 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$ @SuppressWarnings( "rawtypes" ) private Collection selectedSettings = new HashSet(); public ChooseWorkspaceWithPreferenceDialog( Shell parentShell, ChooseWorkspaceData launchData, boolean suppressAskAgain, boolean centerOnMonitor ) { super( parentShell, launchData, suppressAskAgain, centerOnMonitor ); } @Override protected Control createDialogArea( Composite parent ) { Control top = super.createDialogArea( parent ); PlatformUI.getWorkbench().getHelpSystem().setHelp( parent, IIDEHelpContextIds.SWITCH_WORKSPACE_ACTION ); createButtons( (Composite) top ); applyDialogFont( parent ); return top; } @SuppressWarnings( "unchecked" ) private boolean createButtons( Composite parent ) { IConfigurationElement[] settings = SettingsTransfer.getSettingsTransfers(); String[] enabledSettings = getEnabledSettings( IDEWorkbenchPlugin.getDefault().getDialogSettings().getSection( WORKBENCH_SETTINGS ) ); Composite panel = new Composite( parent, SWT.NONE ); GridLayout layout = new GridLayout( 1, false ); layout.marginWidth = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_MARGIN ); layout.horizontalSpacing = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_SPACING ); panel.setLayout( layout ); panel.setFont( parent.getFont() ); Group group = new Group( panel, SWT.NONE ); group.setText( "Copy Settings" ); group.setLayout( layout ); group.setFont( parent.getFont() ); for( int i = 0; i < settings.length; i++ ) { final IConfigurationElement settingsTransfer = settings[i]; final Button button = new Button( group, SWT.CHECK ); button.setText( settings[i].getAttribute( ATT_NAME ) ); 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] != null && enabledSettings[j].equals( id ) ) { button.setSelection( true ); selectedSettings.add( settingsTransfer ); break; } } } button.setBackground( parent.getBackground() ); button.addSelectionListener( new SelectionAdapter() { @Override 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 ); } @SuppressWarnings( "rawtypes" ) @Override 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 = IDEWorkbenchPlugin.getDefault().getDialogSettings().getSection( WORKBENCH_SETTINGS ); if( settings == null ) settings = IDEWorkbenchPlugin.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() { @Override public void run() throws Exception { try { SettingsTransfer transfer = (SettingsTransfer) WorkbenchPlugin.createExtension( element, ATT_CLASS ); patchWorkingSets(element,path); transfer.transferSettings( path ); } catch( CoreException exception ) { exceptions[0] = exception.getStatus(); } } @Override 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; } @Override protected int getDialogBoundsStrategy() { return DIALOG_PERSISTLOCATION; } private IPath getNewWorkbenchStateLocation( IPath newWorkspaceRoot ) { IPath currentWorkspaceRoot = Platform.getLocation(); IPath dataLocation = WorkbenchPlugin.getDefault().getDataLocation(); if( dataLocation == null ) return null; int segmentsToRemove = dataLocation.matchingFirstSegments( currentWorkspaceRoot ); // Strip it down to the extension dataLocation = dataLocation.removeFirstSegments( segmentsToRemove ); // Now add in the dataLocation = newWorkspaceRoot.append( dataLocation ); return dataLocation; } private void patchWorkingSets( final IConfigurationElement element, final IPath path ) { String name = element.getAttribute( ATT_NAME ); if( name.trim().equals( "Working Sets" ) ) { IPath dataLocation = getNewWorkbenchStateLocation( path ); if( dataLocation == null ) return; File dir = new File( dataLocation.toOSString() ); dir.mkdirs(); } } }