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.ArrayList;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Map;
  
  import org.eclipse.core.runtime.IStatus;
  import org.eclipse.core.runtime.Status;
  import org.eclipse.jface.dialogs.IDialogConstants;
  import org.eclipse.jface.dialogs.IDialogSettings;
  import org.eclipse.jface.dialogs.StatusDialog;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.events.SelectionEvent;
  import org.eclipse.swt.events.SelectionListener;
  import org.eclipse.swt.graphics.Point;
  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.Label;
  import org.eclipse.swt.widgets.Shell;
  import org.eclipse.swt.widgets.TabFolder;
  import org.eclipse.swt.widgets.TabItem;
  import org.eclipse.wst.jsdt.internal.corext.util.Messages;
  import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
  import org.eclipse.wst.jsdt.internal.ui.dialogs.StatusInfo;
  import org.eclipse.wst.jsdt.internal.ui.preferences.cleanup.CleanUpTabPage;
  import org.eclipse.wst.jsdt.internal.ui.preferences.cleanup.CodeFormatingTabPage;
  import org.eclipse.wst.jsdt.internal.ui.preferences.cleanup.CodeStyleTabPage;
  import org.eclipse.wst.jsdt.internal.ui.preferences.cleanup.UnnecessaryCodeTabPage;
  import org.eclipse.wst.jsdt.internal.ui.preferences.formatter.ModifyDialogTabPage;
  import org.eclipse.wst.jsdt.internal.ui.preferences.formatter.ModifyDialogTabPage.IModificationListener;
  import org.eclipse.wst.jsdt.ui.JavaScriptUI;
  
  public class CleanUpSaveParticipantConfigurationModifyDialog extends StatusDialog implements IModificationListener {
  	
  	private static final String DS_KEY_PREFERRED_WIDTH= "clean_up_save_particpant_modify_dialog.preferred_width"; //$NON-NLS-1$
  	private static final String DS_KEY_PREFERRED_HEIGHT= "clean_up_save_particpant_modify_dialog.preferred_height"; //$NON-NLS-1$
  	private static final String DS_KEY_PREFERRED_X= "clean_up_save_particpant_modify_dialog.preferred_x"; //$NON-NLS-1$
  	private static final String DS_KEY_PREFERRED_Y= "clean_up_save_particpant_modify_dialog.preferred_y"; //$NON-NLS-1$
  	private static final String DS_KEY_LAST_FOCUS= "clean_up_save_particpant_modify_dialog.last_focus"; //$NON-NLS-1$
  	
  	private static final int APPLY_BUTTON_ID= IDialogConstants.CLIENT_ID;
  	
  	private final Map fWorkingValues;
  	private Map fOrginalValues;
  	private final List fTabPages;
  	private final IDialogSettings fDialogSettings;
  	private TabFolder fTabFolder;
  	private Button fApplyButton;
  	private CleanUpTabPage[] fPages;
  	private Label fCountLabel;
  	
  	public CleanUpSaveParticipantConfigurationModifyDialog(Shell parentShell, Map settings, String title) {
  		super(parentShell);
  		
  		setShellStyle(getShellStyle() | SWT.RESIZE | SWT.MAX);
  		
  		setTitle(title);
  		fWorkingValues= settings;
  		fOrginalValues= new HashMap(settings);
  		setStatusLineAboveButtons(false);
  		fTabPages= new ArrayList();
  		fDialogSettings= JavaScriptPlugin.getDefault().getDialogSettings();
  	}
  	
  	public void create() {
  		super.create();
  		int lastFocusNr= 0;
  		try {
  			lastFocusNr= fDialogSettings.getInt(DS_KEY_LAST_FOCUS);
  			if (lastFocusNr < 0)
  				lastFocusNr= 0;
  			if (lastFocusNr > fTabPages.size() - 1)
  				lastFocusNr= fTabPages.size() - 1;
  		} catch (NumberFormatException x) {
  			lastFocusNr= 0;
  		}
  		
  		fTabFolder.setSelection(lastFocusNr);
  		((ModifyDialogTabPage)fTabFolder.getSelection()[0].getData()).setInitialFocus();
  	}
  	
  	protected Control createDialogArea(Composite parent) {
  		final Composite composite= (Composite)super.createDialogArea(parent);
  		
  		fTabFolder= new TabFolder(composite, SWT.NONE);
  		fTabFolder.setFont(composite.getFont());
  		fTabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
  		
  		fPages= createTabPages(fWorkingValues);
  		
  		fCountLabel= new Label(composite, SWT.NONE);
  		fCountLabel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
  		updateCountLabel();
  		
  		applyDialogFont(composite);
  		
  		fTabFolder.addSelectionListener(new SelectionListener() {
  			public void widgetDefaultSelected(SelectionEvent e) {}
  			
  			public void widgetSelected(SelectionEvent e) {
  				final TabItem tabItem= (TabItem)e.item;
  				final ModifyDialogTabPage page= (ModifyDialogTabPage)tabItem.getData();
  				fDialogSettings.put(DS_KEY_LAST_FOCUS, fTabPages.indexOf(page));
  				page.makeVisible();
  			}
  		});
  		
  		updateStatus(StatusInfo.OK_STATUS);
  		
  		return composite;
  	}
  
  	protected CleanUpTabPage[] createTabPages(Map workingValues) {
  		CleanUpTabPage[] result= new CleanUpTabPage[3];
  		result[0]= new CodeStyleTabPage(this, workingValues, true);
  //		result[1]= new MemberAccessesTabPage(this, workingValues, true);
  		result[1]= new UnnecessaryCodeTabPage(this, workingValues, true);
  //		result[3]= new MissingCodeTabPage(this, workingValues, true);
  		result[2]= new CodeFormatingTabPage(this, workingValues, true);
  		
  		addTabPage(SaveParticipantMessages.CleanUpSaveParticipantConfigurationModifyDialog_CodeStyle_TabPage, result[0]);
  //		addTabPage(SaveParticipantMessages.CleanUpSaveParticipantConfigurationModifyDialog_MemberAccesses_TabPage, result[1]);
  		addTabPage(SaveParticipantMessages.CleanUpSaveParticipantConfigurationModifyDialog_UnnecessaryCode_TabPage, result[1]);
  //		addTabPage(SaveParticipantMessages.CleanUpSaveParticipantConfigurationModifyDialog_MissingCode_TabPage, result[3]);
  		addTabPage(SaveParticipantMessages.CleanUpSaveParticipantConfigurationModifyDialog_CodeOrganizing_TabPage, result[2]);
  		
  		return result;
  	}
  	
  	public void updateStatus(IStatus status) {
  		int count= 0;
  		for (int i= 0; i < fPages.length; i++) { 
  			count+= fPages[i].getSelectedCleanUpCount();
  		}
  		if (count == 0) {
  			super.updateStatus(new Status(IStatus.ERROR, JavaScriptUI.ID_PLUGIN, SaveParticipantMessages.CleanUpSaveParticipantConfigurationModifyDialog_SelectAnAction_Error));
  		} else {
  			if (status == null) {
  				super.updateStatus(StatusInfo.OK_STATUS);
  			} else {
  				super.updateStatus(status);
  			}
  		}
  	}
  	
  	/*
  	 * (non-Javadoc)
  	 * 
  	 * @see org.eclipse.jface.window.Window#getInitialSize()
  	 */
  	protected Point getInitialSize() {
  		Point initialSize= super.getInitialSize();
  		try {
  			int lastWidth= fDialogSettings.getInt(DS_KEY_PREFERRED_WIDTH);
  			if (initialSize.x > lastWidth)
  				lastWidth= initialSize.x;
  			int lastHeight= fDialogSettings.getInt(DS_KEY_PREFERRED_HEIGHT);
  			if (initialSize.y > lastHeight)
  				lastHeight= initialSize.x;
  			return new Point(lastWidth, lastHeight);
  		} catch (NumberFormatException ex) {
  		}
  		return initialSize;
  	}
  	
  	/*
  	 * (non-Javadoc)
  	 * 
  	 * @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
  	 */
  	protected Point getInitialLocation(Point initialSize) {
  		try {
  			return new Point(fDialogSettings.getInt(DS_KEY_PREFERRED_X), fDialogSettings.getInt(DS_KEY_PREFERRED_Y));
  		} catch (NumberFormatException ex) {
  			return super.getInitialLocation(initialSize);
  		}
  	}
  	
  	public boolean close() {
  		final Rectangle shell= getShell().getBounds();
  		
  		fDialogSettings.put(DS_KEY_PREFERRED_WIDTH, shell.width);
  		fDialogSettings.put(DS_KEY_PREFERRED_HEIGHT, shell.height);
  		fDialogSettings.put(DS_KEY_PREFERRED_X, shell.x);
  		fDialogSettings.put(DS_KEY_PREFERRED_Y, shell.y);
  		
  		return super.close();
  	}
  	
  	/*
  	 * (non-Javadoc)
  	 * 
  	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
  	 */
  	protected void okPressed() {
  		applyPressed();
  		super.okPressed();
  	}
  	
  	protected void buttonPressed(int buttonId) {
  		if (buttonId == APPLY_BUTTON_ID) {
  			applyPressed();
  		} else {
  			super.buttonPressed(buttonId);
  		}
  	}
  	
  	private void applyPressed() {
  		fOrginalValues= new HashMap(fWorkingValues);
  		updateStatus(StatusInfo.OK_STATUS);
  	}
  	
  	protected void createButtonsForButtonBar(Composite parent) {
  		fApplyButton= createButton(parent, APPLY_BUTTON_ID, SaveParticipantMessages.CleanUpSaveParticipantConfigurationModifyDialog_Apply_Button, false);
  		fApplyButton.setEnabled(false);
  		
  		GridLayout layout= (GridLayout)parent.getLayout();
  		layout.numColumns++;
  		layout.makeColumnsEqualWidth= false;
  		Label label= new Label(parent, SWT.NONE);
  		GridData data= new GridData();
  		data.widthHint= layout.horizontalSpacing;
  		label.setLayoutData(data);
  		super.createButtonsForButtonBar(parent);
  	}
  	
  	protected final void addTabPage(String title, ModifyDialogTabPage tabPage) {
  		final TabItem tabItem= new TabItem(fTabFolder, SWT.NONE);
  		applyDialogFont(tabItem.getControl());
  		tabItem.setText(title);
  		tabItem.setData(tabPage);
  		tabItem.setControl(tabPage.createContents(fTabFolder));
  		fTabPages.add(tabPage);
  	}
  	
  	protected void updateButtonsEnableState(IStatus status) {
  		super.updateButtonsEnableState(status);
  		if (fApplyButton != null && !fApplyButton.isDisposed()) {
  			fApplyButton.setEnabled(hasChanges() && !status.matches(IStatus.ERROR));
  		}
  	}
  	
  	private boolean hasChanges() {
  		for (Iterator iterator= fWorkingValues.keySet().iterator(); iterator.hasNext();) {
  			String key= (String)iterator.next();
  			if (!fWorkingValues.get(key).equals(fOrginalValues.get(key)))
  				return true;
  		}
  		return false;
  	}
  	
  	/**
  	 * {@inheritDoc}
  	 */
  	public void valuesModified() {
  		updateCountLabel();
  		updateStatus(StatusInfo.OK_STATUS);
  	}
  	
  	private void updateCountLabel() {
  		int size= 0, count= 0;
  		for (int i= 0; i < fPages.length; i++) {
  			size+= fPages[i].getCleanUpCount();
  			count+= fPages[i].getSelectedCleanUpCount();
  		}
  		
  		fCountLabel.setText(Messages.format(SaveParticipantMessages.CleanUpSaveParticipantConfigurationModifyDialog_XofYSelected_Label, new Object[] {Integer.valueOf(count), Integer.valueOf(size)}));
  	}
  }
  