| 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(); |
| } |
| } |
| } |