blob: 327854f7e8e2b3cf6d98efb8572ed84d200f4dc3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2018 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.actions;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.ui.PlatformUI;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.internal.core.manipulation.CodeTemplateContextType;
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.dialogs.SourceActionDialog;
import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor;
import org.eclipse.jdt.internal.ui.refactoring.IVisibilityChangeListener;
import org.eclipse.jdt.internal.ui.util.SWTUtil;
import org.eclipse.jdt.internal.ui.viewsupport.BindingLabelProvider;
public class GenerateConstructorUsingFieldsSelectionDialog extends SourceActionDialog {
class GenerateConstructorUsingFieldsTreeViewerAdapter implements ISelectionChangedListener, IDoubleClickListener {
@Override
public void doubleClick(DoubleClickEvent event) {
// Do nothing
}
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection= (IStructuredSelection) getTreeViewer().getSelection();
List<?> selectedList= selection.toList();
GenerateConstructorUsingFieldsContentProvider cp= (GenerateConstructorUsingFieldsContentProvider) getContentProvider();
fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.UP_INDEX].setEnabled(cp.canMoveUp(selectedList));
fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.DOWN_INDEX].setEnabled(cp.canMoveDown(selectedList));
}
}
private static final int DOWN_BUTTON= IDialogConstants.CLIENT_ID + 2;
private static final int UP_BUTTON= IDialogConstants.CLIENT_ID + 1;
protected Button[] fButtonControls;
boolean[] fButtonsEnabled;
IDialogSettings fGenConstructorSettings;
int fHeight= 18;
boolean fOmitSuper;
Button fOmitSuperButton;
IMethodBinding[] fSuperConstructors;
int fSuperIndex;
GenerateConstructorUsingFieldsTreeViewerAdapter fTreeViewerAdapter;
int fWidth= 60;
final String OMIT_SUPER= "OmitCallToSuper"; //$NON-NLS-1$
final String SETTINGS_SECTION= "GenerateConstructorUsingFieldsSelectionDialog"; //$NON-NLS-1$
private static final int DOWN_INDEX= 1;
private static final int UP_INDEX= 0;
public GenerateConstructorUsingFieldsSelectionDialog(Shell parent, ILabelProvider labelProvider, GenerateConstructorUsingFieldsContentProvider contentProvider, CompilationUnitEditor editor, IType type, IMethodBinding[] superConstructors) throws JavaModelException {
super(parent, labelProvider, contentProvider, editor, type, true);
fTreeViewerAdapter= new GenerateConstructorUsingFieldsTreeViewerAdapter();
fSuperConstructors= superConstructors;
IDialogSettings dialogSettings= JavaPlugin.getDefault().getDialogSettings();
fGenConstructorSettings= dialogSettings.getSection(SETTINGS_SECTION);
if (fGenConstructorSettings == null) {
fGenConstructorSettings= dialogSettings.addNewSection(SETTINGS_SECTION);
fGenConstructorSettings.put(OMIT_SUPER, false);
}
final boolean isEnum= type.isEnum();
fOmitSuper= fGenConstructorSettings.getBoolean(OMIT_SUPER) || isEnum;
if (isEnum)
setVisibility(Modifier.PRIVATE);
}
Composite addSuperClassConstructorChoices(Composite composite) {
Label label= new Label(composite, SWT.NONE);
label.setText(ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_sort_constructor_choices_label);
GridData gd= new GridData(GridData.FILL_HORIZONTAL);
label.setLayoutData(gd);
BindingLabelProvider provider= new BindingLabelProvider();
final Combo combo= new Combo(composite, SWT.READ_ONLY);
SWTUtil.setDefaultVisibleItemCount(combo);
for (int i= 0; i < fSuperConstructors.length; i++) {
combo.add(provider.getText(fSuperConstructors[i]));
}
// TODO: Can we be a little more intelligent about guessing the super() ?
combo.setText(combo.getItem(0));
combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
combo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fSuperIndex= combo.getSelectionIndex();
// Disable omit super checkbox unless default constructor
fOmitSuperButton.setEnabled(getSuperConstructorChoice().getParameterTypes().length == 0);
updateOKStatus();
}
});
return composite;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_button_generate, true);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
@Override
protected void buttonPressed(int buttonId) {
super.buttonPressed(buttonId);
switch (buttonId) {
case UP_BUTTON: {
GenerateConstructorUsingFieldsContentProvider contentProvider= (GenerateConstructorUsingFieldsContentProvider) getTreeViewer().getContentProvider();
contentProvider.up(getElementList(), getTreeViewer());
updateOKStatus();
break;
}
case DOWN_BUTTON: {
GenerateConstructorUsingFieldsContentProvider contentProvider= (GenerateConstructorUsingFieldsContentProvider) getTreeViewer().getContentProvider();
contentProvider.down(getElementList(), getTreeViewer());
updateOKStatus();
break;
}
}
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
PlatformUI.getWorkbench().getHelpSystem().setHelp(shell, IJavaHelpContextIds.GENERATE_CONSTRUCTOR_USING_FIELDS_SELECTION_DIALOG);
}
@Override
protected Control createDialogArea(Composite parent) {
initializeDialogUnits(parent);
Composite composite= new Composite(parent, SWT.NONE);
GridLayout layout= new GridLayout();
GridData gd= null;
layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
composite.setLayout(layout);
Composite classConstructorComposite= addSuperClassConstructorChoices(composite);
gd= new GridData(GridData.FILL_BOTH);
classConstructorComposite.setLayoutData(gd);
Composite inner= new Composite(composite, SWT.NONE);
GridLayout innerLayout= new GridLayout();
innerLayout.numColumns= 2;
innerLayout.marginHeight= 0;
innerLayout.marginWidth= 0;
inner.setLayout(innerLayout);
Label messageLabel= createMessageArea(inner);
if (messageLabel != null) {
gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan= 2;
messageLabel.setLayoutData(gd);
}
CheckboxTreeViewer treeViewer= createTreeViewer(inner);
gd= new GridData(GridData.FILL_BOTH);
gd.widthHint= convertWidthInCharsToPixels(fWidth);
gd.heightHint= convertHeightInCharsToPixels(fHeight);
treeViewer.getControl().setLayoutData(gd);
treeViewer.addSelectionChangedListener(fTreeViewerAdapter);
Composite buttonComposite= createSelectionButtons(inner);
gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
buttonComposite.setLayoutData(gd);
gd= new GridData(GridData.FILL_BOTH);
inner.setLayoutData(gd);
Composite entryComposite= createInsertPositionCombo(composite);
entryComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Composite commentComposite= createCommentSelection(composite);
commentComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Composite overrideSuperComposite= createOmitSuper(composite);
overrideSuperComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Control linkControl= createLinkControl(composite);
if (linkControl != null)
linkControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
gd= new GridData(GridData.FILL_BOTH);
composite.setLayoutData(gd);
applyDialogFont(composite);
return composite;
}
@Override
protected Composite createInsertPositionCombo(Composite composite) {
Composite entryComposite= super.createInsertPositionCombo(composite);
addVisibilityAndModifiersChoices(entryComposite);
return entryComposite;
}
/*
* @see org.eclipse.jdt.internal.ui.dialogs.SourceActionDialog#createLinkControl(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createLinkControl(Composite composite) {
Link link= new Link(composite, SWT.WRAP);
link.setText(ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_template_link_message);
link.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
openCodeTempatePage(CodeTemplateContextType.CONSTRUCTORCOMMENT_ID);
}
});
link.setToolTipText(ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_template_link_tooltip);
GridData gridData= new GridData(SWT.FILL, SWT.BEGINNING, true, false);
gridData.widthHint= convertWidthInCharsToPixels(40); // only expand further if anyone else requires it
link.setLayoutData(gridData);
return link;
}
protected Composite createOmitSuper(Composite composite) {
Composite omitSuperComposite= new Composite(composite, SWT.NONE);
GridLayout layout= new GridLayout();
layout.marginHeight= 0;
layout.marginWidth= 0;
omitSuperComposite.setLayout(layout);
fOmitSuperButton= new Button(omitSuperComposite, SWT.CHECK);
fOmitSuperButton.setText(ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_omit_super);
fOmitSuperButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
fOmitSuperButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
@Override
public void widgetSelected(SelectionEvent e) {
boolean isSelected= (((Button) e.widget).getSelection());
setOmitSuper(isSelected);
}
});
fOmitSuperButton.setSelection(isOmitSuper());
try {
// Disable omit super checkbox unless default constructor and enum
final boolean hasContructor= getSuperConstructorChoice().getParameterTypes().length == 0;
fOmitSuperButton.setEnabled(hasContructor && !getType().isEnum());
} catch (JavaModelException exception) {
JavaPlugin.log(exception);
}
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan= 2;
fOmitSuperButton.setLayoutData(gd);
return omitSuperComposite;
}
@Override
protected Composite createSelectionButtons(Composite composite) {
Composite buttonComposite= super.createSelectionButtons(composite);
GridLayout layout= new GridLayout();
buttonComposite.setLayout(layout);
createUpDownButtons(buttonComposite);
layout.marginHeight= 0;
layout.marginWidth= 0;
layout.numColumns= 1;
return buttonComposite;
}
void createUpDownButtons(Composite buttonComposite) {
int numButtons= 2; // up, down
fButtonControls= new Button[numButtons];
fButtonsEnabled= new boolean[numButtons];
fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.UP_INDEX]= createButton(buttonComposite, UP_BUTTON, ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_up_button,false);
fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.DOWN_INDEX]= createButton(buttonComposite, DOWN_BUTTON, ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_down_button,false);
boolean defaultState= false;
fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.UP_INDEX].setEnabled(defaultState);
fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.DOWN_INDEX].setEnabled(defaultState);
fButtonsEnabled[GenerateConstructorUsingFieldsSelectionDialog.UP_INDEX]= defaultState;
fButtonsEnabled[GenerateConstructorUsingFieldsSelectionDialog.DOWN_INDEX]= defaultState;
}
@Override
protected Composite createVisibilityControlAndModifiers(Composite parent, final IVisibilityChangeListener visibilityChangeListener, int[] availableVisibilities, int correctVisibility) {
int[] visibilities= availableVisibilities;
try {
if (getType().isEnum())
visibilities= new int[] { };
} catch (JavaModelException exception) {
JavaPlugin.log(exception);
}
return createVisibilityControl(parent, visibilityChangeListener, visibilities, correctVisibility);
}
List<?> getElementList() {
IStructuredSelection selection= (IStructuredSelection) getTreeViewer().getSelection();
List<?> elements= selection.toList();
ArrayList<Object> elementList= new ArrayList<>();
for (int i= 0; i < elements.size(); i++) {
elementList.add(elements.get(i));
}
return elementList;
}
public IMethodBinding getSuperConstructorChoice() {
return fSuperConstructors[fSuperIndex];
}
public boolean isOmitSuper() {
return fOmitSuper;
}
public void setOmitSuper(boolean omitSuper) {
if (fOmitSuper != omitSuper) {
fOmitSuper= omitSuper;
fGenConstructorSettings.put(OMIT_SUPER, omitSuper);
}
}
}