KT-43941 [Sealed interfaces]: preliminary, J2K
This commit is contained in:
@@ -126,7 +126,7 @@ class CreateKotlinSubClassIntention : SelfTargetingRangeIntention<KtClass>(
|
|||||||
val dlg = chooseSubclassToCreate(baseClass, baseName) ?: return
|
val dlg = chooseSubclassToCreate(baseClass, baseName) ?: return
|
||||||
val targetName = dlg.className
|
val targetName = dlg.className
|
||||||
val (file, klass) = runWriteAction {
|
val (file, klass) = runWriteAction {
|
||||||
val file = getOrCreateKotlinFile("$targetName.kt", dlg.targetDirectory)!!
|
val file = getOrCreateKotlinFile("$targetName.kt", dlg.targetDirectory!!)!!
|
||||||
val builder = buildClassHeader(targetName, baseClass, baseClass.fqName!!.asString())
|
val builder = buildClassHeader(targetName, baseClass, baseClass.fqName!!.asString())
|
||||||
file.add(factory.createClass(builder.asString()))
|
file.add(factory.createClass(builder.asString()))
|
||||||
val klass = file.getChildOfType<KtClass>()!!
|
val klass = file.getChildOfType<KtClass>()!!
|
||||||
@@ -164,7 +164,7 @@ class CreateKotlinSubClassIntention : SelfTargetingRangeIntention<KtClass>(
|
|||||||
CreateClassKind.CLASS, true,
|
CreateClassKind.CLASS, true,
|
||||||
ModuleUtilCore.findModuleForPsiElement(baseClass)
|
ModuleUtilCore.findModuleForPsiElement(baseClass)
|
||||||
) {
|
) {
|
||||||
override fun getBaseDir(packageName: String) = sourceDir
|
override fun getBaseDir(packageName: String?) = sourceDir
|
||||||
|
|
||||||
override fun reportBaseInTestSelectionInSource() = true
|
override fun reportBaseInTestSelectionInSource() = true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,281 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.refactoring.ui;
|
|
||||||
|
|
||||||
import com.intellij.CommonBundle;
|
|
||||||
import com.intellij.codeInsight.CodeInsightBundle;
|
|
||||||
import com.intellij.codeInsight.daemon.impl.quickfix.ClassKind;
|
|
||||||
import com.intellij.ide.util.PackageUtil;
|
|
||||||
import com.intellij.openapi.actionSystem.AnAction;
|
|
||||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
|
||||||
import com.intellij.openapi.actionSystem.CustomShortcutSet;
|
|
||||||
import com.intellij.openapi.application.WriteAction;
|
|
||||||
import com.intellij.openapi.command.CommandProcessor;
|
|
||||||
import com.intellij.openapi.module.Module;
|
|
||||||
import com.intellij.openapi.project.Project;
|
|
||||||
import com.intellij.openapi.ui.DialogWrapper;
|
|
||||||
import com.intellij.openapi.ui.Messages;
|
|
||||||
import com.intellij.openapi.util.Pass;
|
|
||||||
import com.intellij.openapi.util.text.StringUtil;
|
|
||||||
import com.intellij.psi.PsiDirectory;
|
|
||||||
import com.intellij.psi.PsiManager;
|
|
||||||
import com.intellij.psi.PsiNameHelper;
|
|
||||||
import com.intellij.refactoring.MoveDestination;
|
|
||||||
import com.intellij.refactoring.PackageWrapper;
|
|
||||||
import com.intellij.refactoring.RefactoringBundle;
|
|
||||||
import com.intellij.refactoring.move.moveClassesOrPackages.MultipleRootsMoveDestination;
|
|
||||||
import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo;
|
|
||||||
import com.intellij.refactoring.util.RefactoringMessageUtil;
|
|
||||||
import com.intellij.ui.DocumentAdapter;
|
|
||||||
import com.intellij.ui.RecentsManager;
|
|
||||||
import com.intellij.ui.ReferenceEditorComboWithBrowseButton;
|
|
||||||
import com.intellij.ui.components.JBLabel;
|
|
||||||
import com.intellij.util.IncorrectOperationException;
|
|
||||||
import com.intellij.util.ui.JBUI;
|
|
||||||
import org.jetbrains.annotations.NonNls;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle;
|
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.idea.roots.ProjectRootUtilsKt.getSuitableDestinationSourceRoots;
|
|
||||||
|
|
||||||
import javax.swing.*;
|
|
||||||
import javax.swing.event.DocumentEvent;
|
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.event.InputEvent;
|
|
||||||
import java.awt.event.KeyEvent;
|
|
||||||
|
|
||||||
// Based on com.intellij.codeInsight.intention.impl.CreateClassDialog
|
|
||||||
public class CreateKotlinClassDialog extends DialogWrapper {
|
|
||||||
private final JLabel myInformationLabel = new JLabel("#");
|
|
||||||
private final JLabel myPackageLabel = new JLabel(CodeInsightBundle.message("dialog.create.class.destination.package.label"));
|
|
||||||
private final ReferenceEditorComboWithBrowseButton myPackageComponent;
|
|
||||||
private final JTextField myTfClassName = new MyTextField();
|
|
||||||
private final Project myProject;
|
|
||||||
private PsiDirectory myTargetDirectory;
|
|
||||||
private final String myClassName;
|
|
||||||
private final boolean myClassNameEditable;
|
|
||||||
private final Module myModule;
|
|
||||||
private final KotlinDestinationFolderComboBox myDestinationCB = new KotlinDestinationFolderComboBox() {
|
|
||||||
@Override
|
|
||||||
public String getTargetPackage() {
|
|
||||||
return myPackageComponent.getText().trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean reportBaseInTestSelectionInSource() {
|
|
||||||
return CreateKotlinClassDialog.this.reportBaseInTestSelectionInSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean reportBaseInSourceSelectionInTest() {
|
|
||||||
return CreateKotlinClassDialog.this.reportBaseInSourceSelectionInTest();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@NonNls private static final String RECENTS_KEY = "CreateKotlinClassDialog.RecentsKey";
|
|
||||||
|
|
||||||
public CreateKotlinClassDialog(@NotNull Project project,
|
|
||||||
@NotNull String title,
|
|
||||||
@NotNull String targetClassName,
|
|
||||||
@NotNull String targetPackageName,
|
|
||||||
@NotNull ClassKind kind,
|
|
||||||
boolean classNameEditable,
|
|
||||||
@Nullable Module defaultModule) {
|
|
||||||
super(project, true);
|
|
||||||
myClassNameEditable = classNameEditable;
|
|
||||||
myModule = defaultModule;
|
|
||||||
myClassName = targetClassName;
|
|
||||||
myProject = project;
|
|
||||||
myPackageComponent = new PackageNameReferenceEditorCombo(targetPackageName, myProject, RECENTS_KEY, CodeInsightBundle.message("dialog.create.class.package.chooser.title"));
|
|
||||||
myPackageComponent.setTextFieldPreferredWidth(40);
|
|
||||||
|
|
||||||
init();
|
|
||||||
|
|
||||||
if (!myClassNameEditable) {
|
|
||||||
setTitle(CodeInsightBundle.message("dialog.create.class.name", StringUtil.capitalize(kind.getDescription()), targetClassName));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
myInformationLabel.setText(CodeInsightBundle.message("dialog.create.class.label", kind.getDescription()));
|
|
||||||
setTitle(title);
|
|
||||||
}
|
|
||||||
|
|
||||||
myTfClassName.setText(myClassName);
|
|
||||||
myDestinationCB.setData(myProject, getBaseDir(targetPackageName), new Pass<String>() {
|
|
||||||
@Override
|
|
||||||
public void pass(String s) {
|
|
||||||
setErrorText(s, myDestinationCB);
|
|
||||||
}
|
|
||||||
}, myPackageComponent.getChildComponent());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean reportBaseInTestSelectionInSource() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean reportBaseInSourceSelectionInTest() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
protected Action[] createActions() {
|
|
||||||
return new Action[]{getOKAction(), getCancelAction()};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JComponent getPreferredFocusedComponent() {
|
|
||||||
return myClassNameEditable ? myTfClassName : myPackageComponent.getChildComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected JComponent createCenterPanel() {
|
|
||||||
return new JPanel(new BorderLayout());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected JComponent createNorthPanel() {
|
|
||||||
JPanel panel = new JPanel(new GridBagLayout());
|
|
||||||
GridBagConstraints gbConstraints = new GridBagConstraints();
|
|
||||||
|
|
||||||
gbConstraints.insets = JBUI.insets(4, 8);
|
|
||||||
gbConstraints.fill = GridBagConstraints.HORIZONTAL;
|
|
||||||
gbConstraints.anchor = GridBagConstraints.WEST;
|
|
||||||
|
|
||||||
if (myClassNameEditable) {
|
|
||||||
gbConstraints.weightx = 0;
|
|
||||||
gbConstraints.gridwidth = 1;
|
|
||||||
panel.add(myInformationLabel, gbConstraints);
|
|
||||||
gbConstraints.insets = JBUI.insets(4, 8);
|
|
||||||
gbConstraints.gridx = 1;
|
|
||||||
gbConstraints.weightx = 1;
|
|
||||||
gbConstraints.gridwidth = 1;
|
|
||||||
gbConstraints.fill = GridBagConstraints.HORIZONTAL;
|
|
||||||
gbConstraints.anchor = GridBagConstraints.WEST;
|
|
||||||
panel.add(myTfClassName, gbConstraints);
|
|
||||||
|
|
||||||
myTfClassName.getDocument().addDocumentListener(new DocumentAdapter() {
|
|
||||||
@Override
|
|
||||||
protected void textChanged(DocumentEvent e) {
|
|
||||||
getOKAction().setEnabled(PsiNameHelper.getInstance(myProject).isIdentifier(myTfClassName.getText()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
getOKAction().setEnabled(StringUtil.isNotEmpty(myClassName));
|
|
||||||
}
|
|
||||||
|
|
||||||
gbConstraints.gridx = 0;
|
|
||||||
gbConstraints.gridy = 2;
|
|
||||||
gbConstraints.weightx = 0;
|
|
||||||
gbConstraints.gridwidth = 1;
|
|
||||||
panel.add(myPackageLabel, gbConstraints);
|
|
||||||
|
|
||||||
gbConstraints.gridx = 1;
|
|
||||||
gbConstraints.weightx = 1;
|
|
||||||
|
|
||||||
new AnAction() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(AnActionEvent e) {
|
|
||||||
myPackageComponent.getButton().doClick();
|
|
||||||
}
|
|
||||||
}.registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.SHIFT_DOWN_MASK)), myPackageComponent.getChildComponent());
|
|
||||||
|
|
||||||
JPanel _panel = new JPanel(new BorderLayout());
|
|
||||||
_panel.add(myPackageComponent, BorderLayout.CENTER);
|
|
||||||
panel.add(_panel, gbConstraints);
|
|
||||||
|
|
||||||
gbConstraints.gridy = 3;
|
|
||||||
gbConstraints.gridx = 0;
|
|
||||||
gbConstraints.gridwidth = 2;
|
|
||||||
gbConstraints.insets.top = 12;
|
|
||||||
gbConstraints.anchor = GridBagConstraints.WEST;
|
|
||||||
gbConstraints.fill = GridBagConstraints.NONE;
|
|
||||||
JBLabel label = new JBLabel(RefactoringBundle.message("target.destination.folder"));
|
|
||||||
panel.add(label, gbConstraints);
|
|
||||||
|
|
||||||
gbConstraints.gridy = 4;
|
|
||||||
gbConstraints.gridx = 0;
|
|
||||||
gbConstraints.fill = GridBagConstraints.HORIZONTAL;
|
|
||||||
gbConstraints.insets.top = 4;
|
|
||||||
panel.add(myDestinationCB, gbConstraints);
|
|
||||||
|
|
||||||
boolean isMultipleSourceRoots = getSuitableDestinationSourceRoots(myProject).size() > 1;
|
|
||||||
myDestinationCB.setVisible(isMultipleSourceRoots);
|
|
||||||
label.setVisible(isMultipleSourceRoots);
|
|
||||||
label.setLabelFor(myDestinationCB);
|
|
||||||
return panel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PsiDirectory getTargetDirectory() {
|
|
||||||
return myTargetDirectory;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getPackageName() {
|
|
||||||
String name = myPackageComponent.getText();
|
|
||||||
return name != null ? name.trim() : "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class MyTextField extends JTextField {
|
|
||||||
@Override
|
|
||||||
public Dimension getPreferredSize() {
|
|
||||||
Dimension size = super.getPreferredSize();
|
|
||||||
FontMetrics fontMetrics = getFontMetrics(getFont());
|
|
||||||
size.width = fontMetrics.charWidth('a') * 40;
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void doOKAction() {
|
|
||||||
RecentsManager.getInstance(myProject).registerRecentEntry(RECENTS_KEY, myPackageComponent.getText());
|
|
||||||
String packageName = getPackageName();
|
|
||||||
|
|
||||||
String[] errorString = new String[1];
|
|
||||||
CommandProcessor.getInstance().executeCommand(myProject, () -> {
|
|
||||||
try {
|
|
||||||
PackageWrapper targetPackage = new PackageWrapper(PsiManager.getInstance(myProject), packageName);
|
|
||||||
MoveDestination destination = myDestinationCB.selectDirectory(targetPackage, false);
|
|
||||||
if (destination == null) return;
|
|
||||||
myTargetDirectory = WriteAction.compute(() -> {
|
|
||||||
PsiDirectory baseDir = getBaseDir(packageName);
|
|
||||||
if (baseDir == null && destination instanceof MultipleRootsMoveDestination) {
|
|
||||||
errorString[0] = KotlinBundle.message("destination.not.found.for.package.0", packageName);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return destination.getTargetDirectory(baseDir);
|
|
||||||
});
|
|
||||||
if (myTargetDirectory == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
errorString[0] = RefactoringMessageUtil.checkCanCreateClass(myTargetDirectory, getClassName());
|
|
||||||
}
|
|
||||||
catch (IncorrectOperationException e) {
|
|
||||||
errorString[0] = e.getMessage();
|
|
||||||
}
|
|
||||||
}, CodeInsightBundle.message("create.directory.command"), null);
|
|
||||||
|
|
||||||
if (errorString[0] != null) {
|
|
||||||
if (errorString[0].length() > 0) {
|
|
||||||
Messages.showMessageDialog(myProject, errorString[0], CommonBundle.getErrorTitle(), Messages.getErrorIcon());
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
super.doOKAction();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
protected PsiDirectory getBaseDir(String packageName) {
|
|
||||||
return myModule == null? null : PackageUtil.findPossiblePackageDirectoryInModule(myModule, packageName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public String getClassName() {
|
|
||||||
if (myClassNameEditable) {
|
|
||||||
return myTfClassName.getText();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return myClassName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,244 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
package org.jetbrains.kotlin.idea.refactoring.ui
|
||||||
|
|
||||||
|
import com.intellij.CommonBundle
|
||||||
|
import com.intellij.codeInsight.CodeInsightBundle
|
||||||
|
import com.intellij.codeInsight.daemon.impl.quickfix.ClassKind
|
||||||
|
import com.intellij.ide.util.PackageUtil
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.actionSystem.CustomShortcutSet
|
||||||
|
import com.intellij.openapi.application.WriteAction
|
||||||
|
import com.intellij.openapi.command.CommandProcessor
|
||||||
|
import com.intellij.openapi.module.Module
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.openapi.ui.DialogWrapper
|
||||||
|
import com.intellij.openapi.ui.Messages
|
||||||
|
import com.intellij.openapi.util.Pass
|
||||||
|
import com.intellij.openapi.util.text.StringUtil
|
||||||
|
import com.intellij.psi.PsiDirectory
|
||||||
|
import com.intellij.psi.PsiManager
|
||||||
|
import com.intellij.psi.PsiNameHelper
|
||||||
|
import com.intellij.refactoring.PackageWrapper
|
||||||
|
import com.intellij.refactoring.RefactoringBundle
|
||||||
|
import com.intellij.refactoring.move.moveClassesOrPackages.MultipleRootsMoveDestination
|
||||||
|
import com.intellij.refactoring.ui.PackageNameReferenceEditorCombo
|
||||||
|
import com.intellij.refactoring.util.RefactoringMessageUtil
|
||||||
|
import com.intellij.ui.DocumentAdapter
|
||||||
|
import com.intellij.ui.RecentsManager
|
||||||
|
import com.intellij.ui.ReferenceEditorComboWithBrowseButton
|
||||||
|
import com.intellij.ui.components.JBLabel
|
||||||
|
import com.intellij.util.IncorrectOperationException
|
||||||
|
import com.intellij.util.ui.JBUI
|
||||||
|
import org.jetbrains.annotations.NonNls
|
||||||
|
import org.jetbrains.kotlin.idea.KotlinBundle.message
|
||||||
|
import org.jetbrains.kotlin.idea.roots.getSuitableDestinationSourceRoots
|
||||||
|
import java.awt.BorderLayout
|
||||||
|
import java.awt.Dimension
|
||||||
|
import java.awt.GridBagConstraints
|
||||||
|
import java.awt.GridBagLayout
|
||||||
|
import java.awt.event.InputEvent
|
||||||
|
import java.awt.event.KeyEvent
|
||||||
|
import javax.swing.*
|
||||||
|
import javax.swing.event.DocumentEvent
|
||||||
|
|
||||||
|
// Based on com.intellij.codeInsight.intention.impl.CreateClassDialog
|
||||||
|
open class CreateKotlinClassDialog(
|
||||||
|
private val myProject: Project,
|
||||||
|
title: String,
|
||||||
|
private val myClassName: String,
|
||||||
|
targetPackageName: String,
|
||||||
|
kind: ClassKind,
|
||||||
|
private val myClassNameEditable: Boolean,
|
||||||
|
private val myModule: Module?
|
||||||
|
) : DialogWrapper(myProject, true) {
|
||||||
|
|
||||||
|
private val myInformationLabel = JLabel("#")
|
||||||
|
private val myPackageLabel = JLabel(CodeInsightBundle.message("dialog.create.class.destination.package.label"))
|
||||||
|
private var myPackageComponent: ReferenceEditorComboWithBrowseButton = PackageNameReferenceEditorCombo(
|
||||||
|
targetPackageName,
|
||||||
|
myProject,
|
||||||
|
RECENTS_KEY,
|
||||||
|
CodeInsightBundle.message("dialog.create.class.package.chooser.title")
|
||||||
|
)
|
||||||
|
private val myTfClassName: JTextField = MyTextField()
|
||||||
|
var targetDirectory: PsiDirectory? = null
|
||||||
|
private set
|
||||||
|
private val myDestinationCB: KotlinDestinationFolderComboBox = object : KotlinDestinationFolderComboBox() {
|
||||||
|
override fun getTargetPackage(): String {
|
||||||
|
return myPackageComponent.text.trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun reportBaseInTestSelectionInSource(): Boolean {
|
||||||
|
return this@CreateKotlinClassDialog.reportBaseInTestSelectionInSource()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun reportBaseInSourceSelectionInTest(): Boolean {
|
||||||
|
return this@CreateKotlinClassDialog.reportBaseInSourceSelectionInTest()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected open fun reportBaseInTestSelectionInSource(): Boolean {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
protected open fun reportBaseInSourceSelectionInTest(): Boolean {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createActions(): Array<Action> {
|
||||||
|
return arrayOf(okAction, cancelAction)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getPreferredFocusedComponent(): JComponent? {
|
||||||
|
return if (myClassNameEditable) myTfClassName else myPackageComponent.childComponent
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createCenterPanel(): JComponent? {
|
||||||
|
return JPanel(BorderLayout())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createNorthPanel(): JComponent? {
|
||||||
|
val panel = JPanel(GridBagLayout())
|
||||||
|
val gbConstraints = GridBagConstraints()
|
||||||
|
gbConstraints.insets = JBUI.insets(4, 8)
|
||||||
|
gbConstraints.fill = GridBagConstraints.HORIZONTAL
|
||||||
|
gbConstraints.anchor = GridBagConstraints.WEST
|
||||||
|
if (myClassNameEditable) {
|
||||||
|
gbConstraints.weightx = 0.0
|
||||||
|
gbConstraints.gridwidth = 1
|
||||||
|
panel.add(myInformationLabel, gbConstraints)
|
||||||
|
gbConstraints.insets = JBUI.insets(4, 8)
|
||||||
|
gbConstraints.gridx = 1
|
||||||
|
gbConstraints.weightx = 1.0
|
||||||
|
gbConstraints.gridwidth = 1
|
||||||
|
gbConstraints.fill = GridBagConstraints.HORIZONTAL
|
||||||
|
gbConstraints.anchor = GridBagConstraints.WEST
|
||||||
|
panel.add(myTfClassName, gbConstraints)
|
||||||
|
myTfClassName.document.addDocumentListener(object : DocumentAdapter() {
|
||||||
|
override fun textChanged(e: DocumentEvent) {
|
||||||
|
okAction.isEnabled = PsiNameHelper.getInstance(myProject).isIdentifier(myTfClassName.text)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
okAction.isEnabled = StringUtil.isNotEmpty(myClassName)
|
||||||
|
}
|
||||||
|
gbConstraints.gridx = 0
|
||||||
|
gbConstraints.gridy = 2
|
||||||
|
gbConstraints.weightx = 0.0
|
||||||
|
gbConstraints.gridwidth = 1
|
||||||
|
panel.add(myPackageLabel, gbConstraints)
|
||||||
|
gbConstraints.gridx = 1
|
||||||
|
gbConstraints.weightx = 1.0
|
||||||
|
object : AnAction() {
|
||||||
|
override fun actionPerformed(e: AnActionEvent) {
|
||||||
|
myPackageComponent.button.doClick()
|
||||||
|
}
|
||||||
|
}.registerCustomShortcutSet(
|
||||||
|
CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.SHIFT_DOWN_MASK)),
|
||||||
|
myPackageComponent.childComponent
|
||||||
|
)
|
||||||
|
val _panel = JPanel(BorderLayout())
|
||||||
|
_panel.add(myPackageComponent, BorderLayout.CENTER)
|
||||||
|
panel.add(_panel, gbConstraints)
|
||||||
|
gbConstraints.gridy = 3
|
||||||
|
gbConstraints.gridx = 0
|
||||||
|
gbConstraints.gridwidth = 2
|
||||||
|
gbConstraints.insets.top = 12
|
||||||
|
gbConstraints.anchor = GridBagConstraints.WEST
|
||||||
|
gbConstraints.fill = GridBagConstraints.NONE
|
||||||
|
val label = JBLabel(RefactoringBundle.message("target.destination.folder"))
|
||||||
|
panel.add(label, gbConstraints)
|
||||||
|
gbConstraints.gridy = 4
|
||||||
|
gbConstraints.gridx = 0
|
||||||
|
gbConstraints.fill = GridBagConstraints.HORIZONTAL
|
||||||
|
gbConstraints.insets.top = 4
|
||||||
|
panel.add(myDestinationCB, gbConstraints)
|
||||||
|
val isMultipleSourceRoots = getSuitableDestinationSourceRoots(myProject).size > 1
|
||||||
|
myDestinationCB.isVisible = isMultipleSourceRoots
|
||||||
|
label.isVisible = isMultipleSourceRoots
|
||||||
|
label.labelFor = myDestinationCB
|
||||||
|
return panel
|
||||||
|
}
|
||||||
|
|
||||||
|
private val packageName: String
|
||||||
|
get() {
|
||||||
|
val name = myPackageComponent.text
|
||||||
|
return name?.trim() ?: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
private class MyTextField : JTextField() {
|
||||||
|
override fun getPreferredSize(): Dimension {
|
||||||
|
val size = super.getPreferredSize()
|
||||||
|
val fontMetrics = getFontMetrics(font)
|
||||||
|
size.width = fontMetrics.charWidth('a') * 40
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun doOKAction() {
|
||||||
|
RecentsManager.getInstance(myProject).registerRecentEntry(RECENTS_KEY, myPackageComponent.text)
|
||||||
|
val packageName = packageName
|
||||||
|
var errorString: String? = null
|
||||||
|
CommandProcessor.getInstance().executeCommand(myProject, {
|
||||||
|
try {
|
||||||
|
val targetPackage = PackageWrapper(PsiManager.getInstance(myProject), packageName)
|
||||||
|
val destination = myDestinationCB.selectDirectory(targetPackage, false) ?: return@executeCommand
|
||||||
|
targetDirectory = WriteAction.compute<PsiDirectory, RuntimeException> {
|
||||||
|
val baseDir = getBaseDir(packageName)
|
||||||
|
if (baseDir == null && destination is MultipleRootsMoveDestination) {
|
||||||
|
errorString = message("destination.not.found.for.package.0", packageName)
|
||||||
|
return@compute null
|
||||||
|
}
|
||||||
|
destination.getTargetDirectory(baseDir)
|
||||||
|
}
|
||||||
|
if (targetDirectory == null) {
|
||||||
|
return@executeCommand
|
||||||
|
}
|
||||||
|
errorString = RefactoringMessageUtil.checkCanCreateClass(targetDirectory, className)
|
||||||
|
} catch (e: IncorrectOperationException) {
|
||||||
|
errorString = e.message
|
||||||
|
}
|
||||||
|
}, CodeInsightBundle.message("create.directory.command"), null)
|
||||||
|
|
||||||
|
errorString?.let {
|
||||||
|
if (it.isNotEmpty())
|
||||||
|
Messages.showMessageDialog(myProject, errorString, CommonBundle.getErrorTitle(), Messages.getErrorIcon())
|
||||||
|
} ?: super.doOKAction()
|
||||||
|
}
|
||||||
|
|
||||||
|
protected open fun getBaseDir(packageName: String?): PsiDirectory? {
|
||||||
|
return if (myModule == null) null else PackageUtil.findPossiblePackageDirectoryInModule(myModule, packageName)
|
||||||
|
}
|
||||||
|
|
||||||
|
val className: String
|
||||||
|
get() = if (myClassNameEditable) {
|
||||||
|
myTfClassName.text
|
||||||
|
} else {
|
||||||
|
myClassName
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@NonNls
|
||||||
|
private val RECENTS_KEY = "CreateKotlinClassDialog.RecentsKey"
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
myPackageComponent.setTextFieldPreferredWidth(40)
|
||||||
|
init()
|
||||||
|
if (!myClassNameEditable) {
|
||||||
|
setTitle(CodeInsightBundle.message("dialog.create.class.name", StringUtil.capitalize(kind.description), myClassName))
|
||||||
|
} else {
|
||||||
|
myInformationLabel.text = CodeInsightBundle.message("dialog.create.class.label", kind.description)
|
||||||
|
setTitle(title)
|
||||||
|
}
|
||||||
|
myTfClassName.text = myClassName
|
||||||
|
myDestinationCB.setData(myProject, getBaseDir(targetPackageName), object : Pass<String?>() {
|
||||||
|
override fun pass(s: String?) {
|
||||||
|
setErrorText(s, myDestinationCB)
|
||||||
|
}
|
||||||
|
}, myPackageComponent.getChildComponent())
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user