blob: a8df16eded6864ba0edb0e6d8bfc6d0a63e8b8c3 [file] [log] [blame]
package com.jetbrains.python.refactoring.classes.membersManager.vp;
import com.google.common.base.Preconditions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Pair;
import com.intellij.refactoring.BaseRefactoringProcessor;
import com.intellij.refactoring.ui.RefactoringDialog;
import com.intellij.util.containers.MultiMap;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyElement;
import com.jetbrains.python.refactoring.classes.membersManager.MembersConflictDialog;
import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
import com.jetbrains.python.refactoring.classes.ui.PyMemberSelectionPanel;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import java.util.Collection;
/**
* {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView} implementation on swing.
* Consists of {@link #myTopPanel} and {@link #myCenterPanel}. Children must fill them in constructor.
* Presenter is stored in {@link #myPresenter}.
* Panel with members in {@link #myPyMemberSelectionPanel}
*
* @param <P> View presenter class
* @param <C> View configuration class
*/
public abstract class MembersBasedViewSwingImpl<P extends MembersBasedPresenter, C extends MembersViewInitializationInfo>
extends RefactoringDialog implements MembersBasedView<C> {
/**
* Panel to be displayed on the top
*/
@NotNull
protected final JPanel myTopPanel;
/**
* Panel to be displayed at the center
*/
@NotNull
protected final JComponent myCenterPanel;
/**
* Presenter
*/
@NotNull
protected final P myPresenter;
/**
* Panel with members
*/
@NotNull
protected final PyMemberSelectionPanel myPyMemberSelectionPanel;
private boolean myConfigured;
/**
*
* @param project project this view runs
* @param presenter view's presenter
* @param title window title
* @param supportAbstract supports "abstract" column?
*/
protected MembersBasedViewSwingImpl(@NotNull final Project project, @NotNull final P presenter, @NotNull final String title,
final boolean supportAbstract) {
super(project, true);
myTopPanel = new JPanel(new BorderLayout());
myCenterPanel = new JPanel(new BorderLayout());
myPresenter = presenter;
myPyMemberSelectionPanel = new PyMemberSelectionPanel(title, supportAbstract);
//TODO: Take this from presenter to prevent inconsistence: now it is possible to create view that supports abstract backed by presenter that does not. And vice versa.
}
@Override
public boolean showConflictsDialog(@NotNull final MultiMap<PyClass, PyMemberInfo<?>> duplicatesConflict,
@NotNull final Collection<PyMemberInfo<?>> dependenciesConflicts) {
Preconditions.checkArgument(!(duplicatesConflict.isEmpty() && dependenciesConflicts.isEmpty()), "Can't show dialog for empty conflicts");
final DialogWrapper conflictsDialog = new MembersConflictDialog(myProject, duplicatesConflict, dependenciesConflicts);
conflictsDialog.show();
return conflictsDialog.isOK();
}
@Override
public void showError(@NotNull final String message) {
Messages.showErrorDialog(getContentPane(), message);
}
@Override
protected boolean hasPreviewButton() {
return myPresenter.showPreview();
}
@Override
protected void doAction() {
myPresenter.okClicked();
}
@NotNull
@Override
protected JComponent createNorthPanel() {
return myTopPanel;
}
@Override
public void close() {
close(OK_EXIT_CODE);
}
@Override
protected JComponent createCenterPanel() {
return myCenterPanel;
}
@NotNull
@Override
public Collection<PyMemberInfo<PyElement>> getSelectedMemberInfos() {
return myPyMemberSelectionPanel.getSelectedMemberInfos();
}
@Override
public void invokeRefactoring(@NotNull final BaseRefactoringProcessor processor) {
super.invokeRefactoring(processor);
}
@Override
public void configure(@NotNull final C configInfo) {
Preconditions.checkArgument(!myConfigured, "Already configured");
myConfigured = true;
myPyMemberSelectionPanel.init(configInfo.getMemberInfoModel(), configInfo.getMemberInfos());
}
@Override
public void initAndShow() {
Preconditions.checkArgument(myConfigured, "Not configured, run 'configure' first!");
init();
myPyMemberSelectionPanel.redraw(); // To display errors for checked member
show();
}
}