content: /*******************************************************************************
   * Copyright (c) 2000, 2008 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 org.eclipse.wst.jsdt.internal.ui.fix;
  
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.Map;
  
  import org.eclipse.core.resources.IProject;
  import org.eclipse.core.resources.ProjectScope;
  import org.eclipse.core.runtime.IAdaptable;
  import org.eclipse.core.runtime.preferences.IEclipsePreferences;
  import org.eclipse.core.runtime.preferences.IScopeContext;
  import org.eclipse.core.runtime.preferences.InstanceScope;
  import org.eclipse.jface.preference.IPreferencePageContainer;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.events.SelectionAdapter;
  import org.eclipse.swt.events.SelectionEvent;
  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.Link;
  import org.eclipse.swt.widgets.Shell;
  import org.eclipse.ui.dialogs.PreferencesUtil;
  import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
  import org.eclipse.wst.jsdt.core.IJavaScriptProject;
  import org.eclipse.wst.jsdt.core.JavaScriptCore;
  import org.eclipse.wst.jsdt.internal.corext.fix.CleanUpConstants;
  import org.eclipse.wst.jsdt.internal.corext.fix.CleanUpPostSaveListener;
  import org.eclipse.wst.jsdt.internal.corext.fix.CleanUpPreferenceUtil;
  import org.eclipse.wst.jsdt.internal.corext.fix.CleanUpRefactoring;
  import org.eclipse.wst.jsdt.internal.ui.javaeditor.saveparticipant.AbstractSaveParticipantPreferenceConfiguration;
  import org.eclipse.wst.jsdt.internal.ui.preferences.BulletListBlock;
  import org.eclipse.wst.jsdt.internal.ui.preferences.CodeFormatterPreferencePage;
  import org.eclipse.wst.jsdt.internal.ui.util.PixelConverter;
  import org.eclipse.wst.jsdt.ui.JavaScriptUI;
  
  /**
   * Preference configuration UI for the clean up save participant.
   * 
   * 
   */
  public class CleanUpSaveParticipantPreferenceConfiguration extends AbstractSaveParticipantPreferenceConfiguration {
  	
  	private static final int INDENT= 10;
  	
  	private IScopeContext fContext;
  	private Map fSettings;
  	private BulletListBlock fSelectedActionsText;
  	private Button fFormatCodeButton;
  //	private Button fOrganizeImportsButton;
  	private Shell fShell;
  	private Link fFormatConfigLink;
  //	private Link fOrganizeImportsConfigLink;
  	private IPreferencePageContainer fContainer;
  	private Button fAdditionalActionButton;
  	private Button fConfigureButton;
  	
  	/**
  	 * {@inheritDoc}
  	 */
  	public Control createConfigControl(final Composite parent, IPreferencePageContainer container) {
  		fContainer= container;
  		fShell= parent.getShell();
  		
  		final Composite composite= new Composite(parent, SWT.NONE);
  		GridData gridData= new GridData(SWT.FILL, SWT.FILL, true, true);
  		gridData.horizontalIndent= INDENT;
  		composite.setLayoutData(gridData);
  		GridLayout gridLayout= new GridLayout(1, false);
  		gridLayout.marginHeight= 0;
  		gridLayout.marginWidth= 0;
  		composite.setLayout(gridLayout);
  		
  		fFormatCodeButton= new Button(composite, SWT.CHECK);
  		fFormatCodeButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePage_FormatSource_Checkbox);
  		fFormatCodeButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
  		fFormatCodeButton.addSelectionListener(new SelectionAdapter() {
  			/**
  			 * {@inheritDoc}
  			 */
  			public void widgetSelected(SelectionEvent e) {
  				changeSettingsValue(CleanUpConstants.FORMAT_SOURCE_CODE, fFormatCodeButton.getSelection());
  			}
  		});
  		
  		PixelConverter pixelConverter= new PixelConverter(parent);
  		int heightOneHalf= (int)Math.round(pixelConverter.convertHeightInCharsToPixels(1) * 1.5);
  		
  		fFormatConfigLink= new Link(composite, SWT.NONE);
  		fFormatConfigLink.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_ConfigureFormatter_Link);
  		GridData gridData2= new GridData(SWT.LEFT, SWT.TOP, false, true);
  		gridData2.horizontalIndent= 20;
  		gridData2.minimumHeight= heightOneHalf;
  		fFormatConfigLink.setLayoutData(gridData2);
  		
  //		fOrganizeImportsButton= new Button(composite, SWT.CHECK);
  //		fOrganizeImportsButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_SaveActionPreferencePage_OrganizeImports_Checkbox);
  //		fOrganizeImportsButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
  //		fOrganizeImportsButton.addSelectionListener(new SelectionAdapter() {
  //			/**
  //			 * {@inheritDoc}
  //			 */
  //			public void widgetSelected(SelectionEvent e) {
  //				changeSettingsValue(CleanUpConstants.ORGANIZE_IMPORTS, fOrganizeImportsButton.getSelection());
  //			}
  //		});
  		
  //		fOrganizeImportsConfigLink= new Link(composite, SWT.NONE);
  //		fOrganizeImportsConfigLink.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_ConfigureImports_Link);
  //		GridData gridData3= new GridData(SWT.LEFT, SWT.TOP, false, true);
  //		gridData3.horizontalIndent= 20;
  //		gridData3.minimumHeight= heightOneHalf;
  //		fOrganizeImportsConfigLink.setLayoutData(gridData3);
  		
  		fAdditionalActionButton= new Button(composite, SWT.CHECK);
  		fAdditionalActionButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_AdditionalActions_Checkbox);
  		
  		createAdvancedComposite(composite);
  		fAdditionalActionButton.addSelectionListener(new SelectionAdapter() {
  			/**
  			 * {@inheritDoc}
  			 */
  			public void widgetSelected(SelectionEvent e) {
  				changeSettingsValue(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS, fAdditionalActionButton.getSelection());
  			}
  		});
  		
  		return composite;
  	}
  	
  	private Composite createAdvancedComposite(final Composite parent) {
  		Composite composite= new Composite(parent, SWT.NONE);
  		GridData gridData= new GridData(SWT.FILL, SWT.FILL, true, true);
  		gridData.horizontalIndent= INDENT;
  		composite.setLayoutData(gridData);
  		GridLayout layout= new GridLayout(2, false);
  		layout.marginHeight= 0;
  		layout.marginWidth= 0;
  		composite.setLayout(layout);
  		
  		fSelectedActionsText= new BulletListBlock();
  		final GridData data= (GridData)fSelectedActionsText.createControl(composite).getLayoutData();
  		data.heightHint= new PixelConverter(composite).convertHeightInCharsToPixels(8);
  		
  		fConfigureButton= new Button(composite, SWT.NONE);
  		fConfigureButton.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_Configure_Button);
  		fConfigureButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
  		fConfigureButton.addSelectionListener(new SelectionAdapter() {
  			/**
  			 * {@inheritDoc}
  			 */
  			public void widgetSelected(SelectionEvent e) {
  				new CleanUpSaveParticipantConfigurationModifyDialog(parent.getShell(), fSettings, SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_CleanUpSaveParticipantConfiguration_Title).open();
  				settingsChanged();
  			}
  			
  		});
  		
  		return composite;
  	}
  	
  	/**
  	 * {@inheritDoc}
  	 */
  	public void initialize(final IScopeContext context, IAdaptable element) {
  		fContext= context;
  		fSettings= CleanUpPreferenceUtil.loadSaveParticipantOptions(context);
  		
  		settingsChanged();
  		
  		IJavaScriptProject javaProject= null;
  		if (element != null) {
  			IProject project= (IProject)element.getAdapter(IProject.class);
  			if (project != null) {
  				IJavaScriptProject jProject= JavaScriptCore.create(project);
  				if (jProject != null && jProject.exists()) {
  					javaProject= jProject;
  				}
  			}
  		}
  		
  		configurePreferenceLink(fFormatConfigLink, javaProject, CodeFormatterPreferencePage.PREF_ID, CodeFormatterPreferencePage.PROP_ID);
  //		configurePreferenceLink(fOrganizeImportsConfigLink, javaProject, ImportOrganizePreferencePage.PREF_ID, ImportOrganizePreferencePage.PROP_ID);
  		
  		super.initialize(context, element);
  	}
  	
  	/**
  	 * {@inheritDoc}
  	 */
  	public void dispose() {
  		super.dispose();
  	}
  	
  	/**
  	 * {@inheritDoc}
  	 */
  	public void performDefaults() {
  		fSettings= CleanUpPreferenceUtil.loadSaveParticipantOptions(new InstanceScope());
  		settingsChanged();
  	}
  	
  	/**
  	 * {@inheritDoc}
  	 */
  	public void performOk() {
  		super.performOk();
  		
  		if (!ProjectScope.SCOPE.equals(fContext.getName()) || hasSettingsInScope(fContext))
  			CleanUpPreferenceUtil.saveSaveParticipantOptions(fContext, fSettings);
  	}
  	
  	/**
  	 * {@inheritDoc}
  	 */
  	public void enableProjectSettings() {
  		super.enableProjectSettings();
  		
  		CleanUpPreferenceUtil.saveSaveParticipantOptions(fContext, fSettings);
  		
  		updateAdvancedEnableState();
  	}
  	
  	/**
  	 * {@inheritDoc}
  	 */
  	public void disableProjectSettings() {
  		super.disableProjectSettings();
  		
  		IEclipsePreferences node= fContext.getNode(JavaScriptUI.ID_PLUGIN);
  		
  		Map settings= CleanUpConstants.getSaveParticipantSettings();
  		for (Iterator iterator= settings.keySet().iterator(); iterator.hasNext();) {
  			String key= (String)iterator.next();
  			node.remove(CleanUpPreferenceUtil.SAVE_PARTICIPANT_KEY_PREFIX + key);
  		}
  		
  		updateAdvancedEnableState();
  	}
  	
  	/**
  	 * {@inheritDoc}
  	 */
  	protected String getPostSaveListenerId() {
  		return CleanUpPostSaveListener.POSTSAVELISTENER_ID;
  	}
  	
  	/**
  	 * {@inheritDoc}
  	 */
  	protected String getPostSaveListenerName() {
  		return SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_CleanUpActionsTopNodeName_Checkbox;
  	}
  	
  	/**
  	 * {@inheritDoc}
  	 */
  	protected void enableConfigControl(boolean isEnabled) {
  		super.enableConfigControl(isEnabled);
  		
  		updateAdvancedEnableState();
  	}
  	
  	private void settingsChanged() {
  		fFormatCodeButton.setSelection(CleanUpConstants.TRUE.equals(fSettings.get(CleanUpConstants.FORMAT_SOURCE_CODE)));
  //		fOrganizeImportsButton.setSelection(CleanUpConstants.TRUE.equals(fSettings.get(CleanUpConstants.ORGANIZE_IMPORTS)));
  		fAdditionalActionButton.setSelection(CleanUpConstants.TRUE.equals(fSettings.get(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS)));
  		
  		updateAdvancedEnableState();
  		
  		Map settings= new HashMap(fSettings);
  		settings.put(CleanUpConstants.FORMAT_SOURCE_CODE, CleanUpConstants.FALSE);
  		settings.put(CleanUpConstants.ORGANIZE_IMPORTS, CleanUpConstants.FALSE);
  		
  		final ICleanUp[] cleanUps= CleanUpRefactoring.createCleanUps(settings);
  		
  		if (cleanUps.length == 0) {			
  			fSelectedActionsText.setText(SaveParticipantMessages.CleanUpSaveParticipantPreferenceConfiguration_NoActionEnabled_Info);
  		} else {
  			StringBuffer buf= new StringBuffer();
  			
  			boolean first= true;
  	    	for (int i= 0; i < cleanUps.length; i++) {
  		        String[] descriptions= cleanUps[i].getDescriptions();
  		        if (descriptions != null) {
  	    	        for (int j= 0; j < descriptions.length; j++) {
  	    	        	if (first) {
  	    	        		first= false;
  	    	        	} else {
  	    	        		buf.append('\n');	    	        		
  	    	        	}
  	    	            buf.append(descriptions[j]);
  	                }
  		        }
  	        }
  	    	fSelectedActionsText.setText(buf.toString());
  		}
  	}
  	
  	private void updateAdvancedEnableState() {
  		boolean additionalOptionEnabled= isEnabled(fContext) && CleanUpConstants.TRUE.equals(fSettings.get(CleanUpConstants.CLEANUP_ON_SAVE_ADDITIONAL_OPTIONS));
  		boolean additionalEnabled= additionalOptionEnabled && (!ProjectScope.SCOPE.equals(fContext.getName()) || hasSettingsInScope(fContext));
  		fSelectedActionsText.setEnabled(additionalEnabled);
  		fConfigureButton.setEnabled(additionalEnabled);
  	}
  	
  	private void configurePreferenceLink(Link link, final IJavaScriptProject javaProject, final String preferenceId, final String propertyId) {
  		link.addSelectionListener(new SelectionAdapter() {
  			public void widgetSelected(SelectionEvent e) {
  				if (fContainer instanceof IWorkbenchPreferenceContainer) {
  					IWorkbenchPreferenceContainer container= (IWorkbenchPreferenceContainer)fContainer;
  					if (javaProject != null) {
  						container.openPage(propertyId, null);
  					} else {
  						container.openPage(preferenceId, null);
  					}
  				} else {
  					PreferencesUtil.createPreferenceDialogOn(fShell, preferenceId, null, null);
  				}
  			}
  		});
  	}
  	
  	private void changeSettingsValue(String key, boolean enabled) {
  		String value;
  		if (enabled) {
  			value= CleanUpConstants.TRUE;
  		} else {
  			value= CleanUpConstants.FALSE;
  		}
  		fSettings.put(key, value);
  		settingsChanged();
  	}
  }
  