blob: 12e6903d6dacfae6cc3c6f93df86583ab3986a2c [file] [log] [blame]
package com.intellij.codeInsight.generation.ui;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.ide.wizard.AbstractWizard;
import com.intellij.ide.wizard.Step;
import com.intellij.ide.wizard.StepAdapter;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.classMembers.MemberInfoBase;
import com.intellij.refactoring.ui.AbstractMemberSelectionPanel;
import com.intellij.util.containers.HashMap;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import java.awt.*;
import java.util.Collection;
import java.util.List;
/**
* Nikolay.Tropin
* 8/20/13
*/
public abstract class AbstractGenerateEqualsWizard <C extends PsiElement, M extends PsiElement, I extends MemberInfoBase<M>>
extends AbstractWizard<Step> {
protected final C myClass;
protected final AbstractMemberSelectionPanel<M, I> myEqualsPanel;
protected final AbstractMemberSelectionPanel<M, I> myHashCodePanel;
protected final AbstractMemberSelectionPanel<M, I> myNonNullPanel;
protected final HashMap<M, I> myFieldsToHashCode;
protected final HashMap<M, I> myFieldsToNonNull;
private int myNonNullStepCode;
private int myEqualsStepCode;
private int myHashCodeStepCode;
protected int getHashCodeStepCode() {
return myHashCodeStepCode;
}
protected int getEqualsStepCode() {
return myEqualsStepCode;
}
protected int getNonNullStepCode() {
return myNonNullStepCode;
}
protected final List<I> myClassFields;
protected final Builder<C, M, I> myBuilder;
public static abstract class Builder<C extends PsiElement, M extends PsiElement, I extends MemberInfoBase<M>> {
protected abstract C getPsiClass();
protected abstract List<I> getClassFields();
protected abstract HashMap<M, I> getFieldsToHashCode();
protected abstract HashMap<M, I> getFieldsToNonNull();
protected abstract AbstractMemberSelectionPanel<M, I> getEqualsPanel();
protected abstract AbstractMemberSelectionPanel<M, I> getHashCodePanel();
protected abstract AbstractMemberSelectionPanel<M, I> getNonNullPanel();
protected abstract void updateHashCodeMemberInfos(Collection<I> equalsMemberInfos);
protected abstract void updateNonNullMemberInfos(Collection<I> equalsMemberInfos);
}
public AbstractGenerateEqualsWizard(Project project, Builder<C, M, I> builder) {
super(CodeInsightBundle.message("generate.equals.hashcode.wizard.title"), project);
myBuilder = builder;
myClass = builder.getPsiClass();
myClassFields = builder.getClassFields();
myFieldsToHashCode = builder.getFieldsToHashCode();
myFieldsToNonNull = builder.getFieldsToNonNull();
myEqualsPanel = builder.getEqualsPanel();
myHashCodePanel = builder.getHashCodePanel();
myNonNullPanel = builder.getNonNullPanel();
addTableListeners();
addSteps();
init();
updateButtons();
}
protected void addSteps() {
myEqualsStepCode = addStepForPanel(myEqualsPanel);
myHashCodeStepCode = addStepForPanel(myHashCodePanel);
myNonNullStepCode = addStepForPanel(myNonNullPanel);
}
protected int addStepForPanel(AbstractMemberSelectionPanel<M, I> panel) {
if (panel != null) {
addStep(new MyStep(panel));
return getStepCount() - 1;
} else {
return -1;
}
}
protected void addTableListeners() {
final MyTableModelListener listener = new MyTableModelListener();
if (myEqualsPanel != null) myEqualsPanel.getTable().getModel().addTableModelListener(listener);
if (myHashCodePanel != null) myHashCodePanel.getTable().getModel().addTableModelListener(listener);
}
@Override
protected void doNextAction() {
if (getCurrentStep() == getEqualsStepCode() && myEqualsPanel != null) {
equalsFieldsSelected();
}
else if (getCurrentStep() == getHashCodeStepCode() && myHashCodePanel != null) {
Collection<I> selectedMemberInfos = myEqualsPanel != null ? myEqualsPanel.getTable().getSelectedMemberInfos()
: myHashCodePanel.getTable().getSelectedMemberInfos();
updateNonNullMemberInfos(selectedMemberInfos);
}
super.doNextAction();
updateButtons();
}
@Override
protected String getHelpID() {
return "editing.altInsert.equals";
}
private void equalsFieldsSelected() {
Collection<I> selectedMemberInfos = myEqualsPanel.getTable().getSelectedMemberInfos();
updateHashCodeMemberInfos(selectedMemberInfos);
updateNonNullMemberInfos(selectedMemberInfos);
}
@Override
protected void doOKAction() {
if (myEqualsPanel != null) {
equalsFieldsSelected();
}
super.doOKAction();
}
protected void updateHashCodeMemberInfos(Collection<I> equalsMemberInfos) {
myBuilder.updateHashCodeMemberInfos(equalsMemberInfos);
}
protected void updateNonNullMemberInfos(Collection<I> equalsMemberInfos) {
myBuilder.updateNonNullMemberInfos(equalsMemberInfos);
}
@Override
protected boolean canGoNext() {
if (getCurrentStep() == myEqualsStepCode) {
for (I classField : myClassFields) {
if (classField.isChecked()) {
return true;
}
}
return false;
}
return true;
}
@Override
public JComponent getPreferredFocusedComponent() {
final Component stepComponent = getCurrentStepComponent();
if (stepComponent instanceof AbstractMemberSelectionPanel) {
return ((AbstractMemberSelectionPanel)stepComponent).getTable();
}
else {
return null;
}
}
private class MyTableModelListener implements TableModelListener {
public void tableChanged(TableModelEvent modelEvent) {
updateButtons();
}
}
private static class MyStep extends StepAdapter {
final AbstractMemberSelectionPanel myPanel;
public MyStep(AbstractMemberSelectionPanel panel) {
myPanel = panel;
}
@Override
public Icon getIcon() {
return null;
}
@Override
public JComponent getComponent() {
return myPanel;
}
@Override
public JComponent getPreferredFocusedComponent() {
return myPanel.getTable();
}
}
}