blob: 9361ade5e8ef71387520673c4a7dbe1420cfe517 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2011 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.ui.fix;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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.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.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.jdt.internal.ui.preferences.cleanup.CleanUpTabPage;
import org.eclipse.jdt.internal.ui.preferences.formatter.IModifyDialogTabPage;
public abstract class CleanUpSelectionDialog extends StatusDialog implements IModifyDialogTabPage.IModificationListener {
protected final class NamedCleanUpTabPage {
private final String fName;
private final CleanUpTabPage fPage;
public NamedCleanUpTabPage(String name, CleanUpTabPage page) {
fName= name;
fPage= page;
}
public CleanUpTabPage getPage() {
return fPage;
}
public String getName() {
return fName;
}
}
private static final String DS_KEY_PREFERRED_WIDTH= ".preferred_width"; //$NON-NLS-1$
private static final String DS_KEY_PREFERRED_HEIGHT= ".preferred_height"; //$NON-NLS-1$
private static final String DS_KEY_PREFERRED_X= ".preferred_x"; //$NON-NLS-1$
private static final String DS_KEY_PREFERRED_Y= ".preferred_y"; //$NON-NLS-1$
private static final String DS_KEY_LAST_FOCUS= ".last_focus"; //$NON-NLS-1$
private final Map<String, String> fWorkingValues;
private final List<IModifyDialogTabPage> fTabPages;
private final IDialogSettings fDialogSettings;
private TabFolder fTabFolder;
private CleanUpTabPage[] fPages;
private Label fCountLabel;
public CleanUpSelectionDialog(Shell parent, Map<String, String> settings, String title) {
super(parent);
setTitle(title);
fWorkingValues= settings;
setStatusLineAboveButtons(false);
fTabPages= new ArrayList<>();
fDialogSettings= JavaPlugin.getDefault().getDialogSettings();
}
/*
* @see org.eclipse.jface.dialogs.Dialog#isResizable()
* @since 3.4
*/
@Override
protected boolean isResizable() {
return true;
}
protected abstract NamedCleanUpTabPage[] createTabPages(Map<String, String> workingValues);
protected abstract String getPreferenceKeyPrefix();
protected abstract String getSelectionCountMessage(int selectionCount, int size);
protected abstract String getEmptySelectionMessage();
protected Map<String, String> getWorkingValues() {
return fWorkingValues;
}
@Override
public boolean close() {
final Rectangle shell= getShell().getBounds();
fDialogSettings.put(getPreferenceKeyWidth(), shell.width);
fDialogSettings.put(getPreferenceKeyHeight(), shell.height);
fDialogSettings.put(getPreferenceKeyPositionX(), shell.x);
fDialogSettings.put(getPreferenceKeyPositionY(), shell.y);
return super.close();
}
@Override
public void create() {
super.create();
int lastFocusNr= 0;
try {
lastFocusNr= fDialogSettings.getInt(getPreferenceKeyFocus());
if (lastFocusNr < 0)
lastFocusNr= 0;
if (lastFocusNr > fTabPages.size() - 1)
lastFocusNr= fTabPages.size() - 1;
} catch (NumberFormatException x) {
lastFocusNr= 0;
}
fTabFolder.setSelection(lastFocusNr);
((IModifyDialogTabPage) fTabFolder.getSelection()[0].getData()).setInitialFocus();
}
@Override
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));
NamedCleanUpTabPage[] pages= createTabPages(fWorkingValues);
fPages= new CleanUpTabPage[pages.length];
for (int i= 0; i < pages.length; i++) {
fPages[i]= pages[i].getPage();
addTabPage(pages[i].getName(), fPages[i]);
}
fCountLabel= new Label(composite, SWT.NONE);
fCountLabel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
updateCountLabel();
applyDialogFont(composite);
fTabFolder.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
@Override
public void widgetSelected(SelectionEvent e) {
final TabItem tabItem= (TabItem) e.item;
final IModifyDialogTabPage page= (IModifyDialogTabPage) tabItem.getData();
fDialogSettings.put(getPreferenceKeyFocus(), fTabPages.indexOf(page));
page.makeVisible();
}
});
updateStatus(StatusInfo.OK_STATUS);
return composite;
}
@Override
public void updateStatus(IStatus status) {
int count= 0;
for (CleanUpTabPage page : fPages) {
count+= page.getSelectedCleanUpCount();
}
if (count == 0) {
super.updateStatus(new Status(IStatus.ERROR, JavaUI.ID_PLUGIN, getEmptySelectionMessage()));
} else {
if (status == null) {
super.updateStatus(StatusInfo.OK_STATUS);
} else {
super.updateStatus(status);
}
}
}
@Override
protected Point getInitialSize() {
Point initialSize= super.getInitialSize();
try {
int lastWidth= fDialogSettings.getInt(getPreferenceKeyWidth());
if (initialSize.x > lastWidth)
lastWidth= initialSize.x;
int lastHeight= fDialogSettings.getInt(getPreferenceKeyHeight());
if (initialSize.y > lastHeight)
lastHeight= initialSize.y;
return new Point(lastWidth, lastHeight);
} catch (NumberFormatException ex) {
}
return initialSize;
}
@Override
protected Point getInitialLocation(Point initialSize) {
try {
return new Point(fDialogSettings.getInt(getPreferenceKeyPositionX()), fDialogSettings.getInt(getPreferenceKeyPositionY()));
} catch (NumberFormatException ex) {
return super.getInitialLocation(initialSize);
}
}
private final void addTabPage(String title, IModifyDialogTabPage 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);
}
@Override
public void valuesModified() {
updateCountLabel();
updateStatus(StatusInfo.OK_STATUS);
}
private void updateCountLabel() {
int size= 0, count= 0;
for (CleanUpTabPage page : fPages) {
size+= page.getCleanUpCount();
count+= page.getSelectedCleanUpCount();
}
fCountLabel.setText(getSelectionCountMessage(count, size));
}
private String getPreferenceKeyWidth() {
return getPreferenceKeyPrefix() + DS_KEY_PREFERRED_WIDTH;
}
private String getPreferenceKeyHeight() {
return getPreferenceKeyPrefix() + DS_KEY_PREFERRED_HEIGHT;
}
private String getPreferenceKeyPositionY() {
return getPreferenceKeyPrefix() + DS_KEY_PREFERRED_Y;
}
private String getPreferenceKeyFocus() {
return getPreferenceKeyPrefix() + DS_KEY_LAST_FOCUS;
}
private String getPreferenceKeyPositionX() {
return getPreferenceKeyPrefix() + DS_KEY_PREFERRED_X;
}
}