/*******************************************************************************
* 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)}));
}
}