blob: a3e777b34739013e5263561fd2e54b9b79c4b0c1 [file] [log] [blame]
/*
* Copyright 2000-2010 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.refactoring.extractSuperclass;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComponentWithBrowseButton;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.BaseRefactoringProcessor;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.classMembers.MemberInfoBase;
import com.intellij.refactoring.ui.DocCommentPanel;
import com.intellij.refactoring.ui.RefactoringDialog;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.ui.RecentsManager;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author dsl
*/
public abstract class ExtractSuperBaseDialog<ClassType extends PsiElement, MemberInfoType extends MemberInfoBase> extends RefactoringDialog {
private final String myRefactoringName;
protected final ClassType mySourceClass;
protected PsiDirectory myTargetDirectory;
protected final List<MemberInfoType> myMemberInfos;
private JRadioButton myRbExtractSuperclass;
private JRadioButton myRbExtractSubclass;
private JTextField mySourceClassField;
private JLabel myClassNameLabel;
private JTextField myExtractedSuperNameField;
protected JLabel myPackageNameLabel;
protected ComponentWithBrowseButton myPackageNameField;
protected DocCommentPanel myDocCommentPanel;
private JPanel myDestinationRootPanel;
protected abstract ComponentWithBrowseButton createPackageNameField();
protected JPanel createDestinationRootPanel() {
return null;
}
protected abstract JTextField createSourceClassField();
protected abstract String getDocCommentPanelName();
protected abstract String getExtractedSuperNameNotSpecifiedMessage();
protected abstract BaseRefactoringProcessor createProcessor();
protected abstract int getDocCommentPolicySetting();
protected abstract void setDocCommentPolicySetting(int policy);
@Override
protected abstract String getHelpId();
@Nullable
protected abstract String validateName(String name);
protected abstract String getTopLabelText();
protected abstract String getClassNameLabelText();
protected abstract String getPackageNameLabelText();
protected abstract String getEntityName();
protected abstract void preparePackage() throws OperationFailedException;
protected abstract String getDestinationPackageRecentKey();
public ExtractSuperBaseDialog(Project project, ClassType sourceClass, List<MemberInfoType> members, String refactoringName) {
super(project, true);
myRefactoringName = refactoringName;
mySourceClass = sourceClass;
myMemberInfos = members;
myTargetDirectory = mySourceClass.getContainingFile().getContainingDirectory();
}
@Override
protected void init() {
setTitle(myRefactoringName);
myPackageNameField = createPackageNameField();
myDestinationRootPanel = createDestinationRootPanel();
mySourceClassField = createSourceClassField();
myExtractedSuperNameField = createExtractedSuperNameField();
myDocCommentPanel = new DocCommentPanel(getDocCommentPanelName());
myDocCommentPanel.setPolicy(getDocCommentPolicySetting());
super.init();
updateDialog();
}
protected JTextField createExtractedSuperNameField() {
return new JTextField();
}
protected JComponent createActionComponent() {
Box box = Box.createHorizontalBox();
final String s = StringUtil.decapitalize(getEntityName());
myRbExtractSuperclass = new JRadioButton();
myRbExtractSuperclass.setText(RefactoringBundle.message("extractSuper.extract", s));
myRbExtractSubclass = new JRadioButton();
myRbExtractSubclass.setText(RefactoringBundle.message("extractSuper.rename.original.class", s));
box.add(myRbExtractSuperclass);
box.add(myRbExtractSubclass);
box.add(Box.createHorizontalGlue());
final ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(myRbExtractSuperclass);
buttonGroup.add(myRbExtractSubclass);
customizeRadiobuttons(box, buttonGroup);
myRbExtractSuperclass.setSelected(true);
ItemListener listener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
updateDialog();
}
};
myRbExtractSuperclass.addItemListener(listener);
myRbExtractSubclass.addItemListener(listener);
return box;
}
protected void customizeRadiobuttons(Box box, ButtonGroup buttonGroup) {
}
@Override
protected JComponent createNorthPanel() {
Box box = Box.createVerticalBox();
JPanel _panel = new JPanel(new BorderLayout());
_panel.add(new JLabel(getTopLabelText()), BorderLayout.NORTH);
_panel.add(mySourceClassField, BorderLayout.CENTER);
box.add(_panel);
box.add(Box.createVerticalStrut(10));
box.add(createActionComponent());
box.add(Box.createVerticalStrut(10));
myClassNameLabel = new JLabel();
_panel = new JPanel(new BorderLayout());
_panel.add(myClassNameLabel, BorderLayout.NORTH);
_panel.add(myExtractedSuperNameField, BorderLayout.CENTER);
box.add(_panel);
box.add(Box.createVerticalStrut(5));
_panel = new JPanel(new BorderLayout());
myPackageNameLabel = new JLabel();
_panel.add(myPackageNameLabel, BorderLayout.NORTH);
_panel.add(myPackageNameField, BorderLayout.CENTER);
if (myDestinationRootPanel != null) {
_panel.add(myDestinationRootPanel, BorderLayout.SOUTH);
}
box.add(_panel);
box.add(Box.createVerticalStrut(10));
JPanel panel = new JPanel(new BorderLayout());
panel.add(box, BorderLayout.CENTER);
return panel;
}
@Override
public JComponent getPreferredFocusedComponent() {
return myExtractedSuperNameField;
}
protected void updateDialog() {
myClassNameLabel.setText(getClassNameLabelText());
myPackageNameLabel.setText(getPackageNameLabelText());
getPreviewAction().setEnabled(!isExtractSuperclass());
}
public String getExtractedSuperName() {
return myExtractedSuperNameField.getText().trim();
}
protected abstract String getTargetPackageName();
public PsiDirectory getTargetDirectory() {
return myTargetDirectory;
}
public int getDocCommentPolicy() {
return myDocCommentPanel.getPolicy();
}
public boolean isExtractSuperclass() {
return myRbExtractSuperclass != null && myRbExtractSuperclass.isSelected();
}
@Override
protected void doAction() {
final String[] errorString = new String[]{null};
final String extractedSuperName = getExtractedSuperName();
final String packageName = getTargetPackageName();
RecentsManager.getInstance(myProject).registerRecentEntry(getDestinationPackageRecentKey(), packageName);
if ("".equals(extractedSuperName)) {
// TODO just disable OK button
errorString[0] = getExtractedSuperNameNotSpecifiedMessage();
myExtractedSuperNameField.requestFocusInWindow();
}
else {
String nameError = validateName(extractedSuperName);
if (nameError != null) {
errorString[0] = nameError;
myExtractedSuperNameField.requestFocusInWindow();
}
else {
CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
@Override
public void run() {
try {
preparePackage();
}
catch (IncorrectOperationException e) {
errorString[0] = e.getMessage();
myPackageNameField.requestFocusInWindow();
}
catch (OperationFailedException e) {
errorString[0] = e.getMessage();
myPackageNameField.requestFocusInWindow();
}
}
}, RefactoringBundle.message("create.directory"), null);
}
}
if (errorString[0] != null) {
if (errorString[0].length() > 0) {
CommonRefactoringUtil.showErrorMessage(myRefactoringName, errorString[0], getHelpId(), myProject);
}
return;
}
if (!checkConflicts()) return;
executeRefactoring();
setDocCommentPolicySetting(getDocCommentPolicy());
closeOKAction();
}
protected void executeRefactoring() {
if (!isExtractSuperclass()) {
invokeRefactoring(createProcessor());
}
}
@Override
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp(getHelpId());
}
protected boolean checkConflicts() {
return true;
}
protected static class OperationFailedException extends Exception {
public OperationFailedException(String message) {
super(message);
}
}
public Collection<MemberInfoType> getSelectedMemberInfos() {
ArrayList<MemberInfoType> result = new ArrayList<MemberInfoType>(myMemberInfos.size());
for (MemberInfoType info : myMemberInfos) {
if (info.isChecked()) {
result.add(info);
}
}
return result;
}
}