com.intellij.refactoring.copy.CopyClassDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.intellij.refactoring.copy.CopyClassDialog.java

Source

/*
 * Copyright 2000-2009 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.copy;

import java.awt.BorderLayout;
import java.awt.Font;

import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;

import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Pass;
import com.intellij.psi.JavaDirectoryService;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiJavaPackage;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiNameHelper;
import com.intellij.refactoring.HelpID;
import com.intellij.refactoring.MoveDestination;
import com.intellij.refactoring.PackageWrapper;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.move.moveClassesOrPackages.DestinationFolderComboBox;
import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo;
import com.intellij.refactoring.util.RefactoringMessageUtil;
import com.intellij.ui.EditorTextField;
import com.intellij.ui.RecentsManager;
import com.intellij.ui.ReferenceEditorComboWithBrowseButton;
import com.intellij.usageView.UsageViewUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.ui.FormBuilder;
import com.intellij.util.ui.UIUtil;

class CopyClassDialog extends DialogWrapper {
    @NonNls
    private static final String RECENTS_KEY = "CopyClassDialog.RECENTS_KEY";
    private final JLabel myInformationLabel = new JLabel();
    private EditorTextField myNameField;
    private final JLabel myPackageLabel = new JLabel();
    private ReferenceEditorComboWithBrowseButton myTfPackage;
    private final Project myProject;
    private final boolean myDoClone;
    private final PsiDirectory myDefaultTargetDirectory;
    private final DestinationFolderComboBox myDestinationCB = new DestinationFolderComboBox() {
        @Override
        public String getTargetPackage() {
            return myTfPackage.getText().trim();
        }

        @Override
        protected boolean reportBaseInTestSelectionInSource() {
            return true;
        }
    };
    protected MoveDestination myDestination;

    public CopyClassDialog(PsiClass aClass, PsiDirectory defaultTargetDirectory, Project project, boolean doClone) {
        super(project, true);
        myProject = project;
        myDefaultTargetDirectory = defaultTargetDirectory;
        myDoClone = doClone;
        String text = myDoClone
                ? RefactoringBundle.message("copy.class.clone.0.1", UsageViewUtil.getType(aClass),
                        UsageViewUtil.getLongName(aClass))
                : RefactoringBundle.message("copy.class.copy.0.1", UsageViewUtil.getType(aClass),
                        UsageViewUtil.getLongName(aClass));
        myInformationLabel.setText(text);
        myInformationLabel.setFont(myInformationLabel.getFont().deriveFont(Font.BOLD));
        init();
        myDestinationCB.setData(myProject, defaultTargetDirectory, new Pass<String>() {
            @Override
            public void pass(String s) {
                setErrorText(s);
            }
        }, myTfPackage.getChildComponent());
        myNameField.setText(UsageViewUtil.getShortName(aClass));
        myNameField.selectAll();
    }

    @NotNull
    protected Action[] createActions() {
        return new Action[] { getOKAction(), getCancelAction(), getHelpAction() };
    }

    public JComponent getPreferredFocusedComponent() {
        return myNameField;
    }

    protected JComponent createCenterPanel() {
        return new JPanel(new BorderLayout());
    }

    protected JComponent createNorthPanel() {
        myNameField = new EditorTextField("");

        String qualifiedName = getQualifiedName();
        myTfPackage = new PackageNameReferenceEditorCombo(qualifiedName, myProject, RECENTS_KEY,
                RefactoringBundle.message("choose.destination.package"));
        myTfPackage.setTextFieldPreferredWidth(Math.max(qualifiedName.length() + 5, 40));
        myPackageLabel.setText(RefactoringBundle.message("destination.package"));
        myPackageLabel.setLabelFor(myTfPackage);
        if (myDoClone) {
            myTfPackage.setVisible(false);
            myPackageLabel.setVisible(false);
        }

        final JLabel label = new JLabel(RefactoringBundle.message("target.destination.folder"));
        final boolean isMultipleSourceRoots = ProjectRootManager.getInstance(myProject)
                .getContentSourceRoots().length > 1;
        myDestinationCB.setVisible(!myDoClone && isMultipleSourceRoots);
        label.setVisible(!myDoClone && isMultipleSourceRoots);
        label.setLabelFor(myDestinationCB);

        return FormBuilder.createFormBuilder().addComponent(myInformationLabel)
                .addLabeledComponent(RefactoringBundle.message("copy.files.new.name.label"), myNameField,
                        UIUtil.LARGE_VGAP)
                .addLabeledComponent(myPackageLabel, myTfPackage).addLabeledComponent(label, myDestinationCB)
                .getPanel();
    }

    protected String getQualifiedName() {
        String qualifiedName = "";
        if (myDefaultTargetDirectory != null) {
            final PsiJavaPackage aPackage = JavaDirectoryService.getInstance().getPackage(myDefaultTargetDirectory);
            if (aPackage != null) {
                qualifiedName = aPackage.getQualifiedName();
            }
        }
        return qualifiedName;
    }

    public MoveDestination getTargetDirectory() {
        return myDestination;
    }

    public String getClassName() {
        return myNameField.getText();
    }

    protected void doOKAction() {
        final String packageName = myTfPackage.getText();
        final String className = getClassName();

        final String[] errorString = new String[1];
        final PsiManager manager = PsiManager.getInstance(myProject);
        final PsiNameHelper nameHelper = PsiNameHelper.getInstance(manager.getProject());
        if (packageName.length() > 0 && !nameHelper.isQualifiedName(packageName)) {
            errorString[0] = RefactoringBundle.message("invalid.target.package.name.specified");
        } else if (className != null && className.isEmpty()) {
            errorString[0] = RefactoringBundle.message("no.class.name.specified");
        } else {
            if (!nameHelper.isIdentifier(className)) {
                errorString[0] = RefactoringMessageUtil.getIncorrectIdentifierMessage(className);
            } else if (!myDoClone) {
                try {
                    final PackageWrapper targetPackage = new PackageWrapper(manager, packageName);
                    myDestination = myDestinationCB.selectDirectory(targetPackage, false);
                    if (myDestination == null)
                        return;
                } catch (IncorrectOperationException e) {
                    errorString[0] = e.getMessage();
                }
            }
            RecentsManager.getInstance(myProject).registerRecentEntry(RECENTS_KEY, packageName);
        }

        if (errorString[0] != null) {
            if (errorString[0].length() > 0) {
                Messages.showMessageDialog(myProject, errorString[0], RefactoringBundle.message("error.title"),
                        Messages.getErrorIcon());
            }
            myNameField.requestFocusInWindow();
            return;
        }
        super.doOKAction();
    }

    protected void doHelpAction() {
        HelpManager.getInstance().invokeHelp(HelpID.COPY_CLASS);
    }
}