IDEA-320012 Fix cosmetics of 'New File' popup

GitOrigin-RevId: 317c38f0c90258edca9e7a3941a55d8ceab41416
This commit is contained in:
Pavel Porvatov
2024-01-31 17:53:15 +01:00
committed by intellij-monorepo-bot
parent f44687a1e8
commit 66e92024b5
4 changed files with 53 additions and 13 deletions

View File

@@ -17,11 +17,13 @@ import javax.swing.*;
import java.awt.*;
import java.util.List;
import static com.intellij.ide.actions.newclass.TemplateListCellRendererKt.createTemplateListCellRenderer;
public class CreateWithTemplatesDialogPanel extends NewItemWithTemplatesPopupPanel<CreateWithTemplatesDialogPanel.TemplatePresentation> {
public record TemplatePresentation(@Nls @NotNull String kind, @Nullable Icon icon, @NotNull String templateName) {}
public CreateWithTemplatesDialogPanel(@Nullable String selectedItem, @NotNull List<? extends TemplatePresentation> templates) {
super(templates, new TemplateListCellRenderer());
super(templates, ExperimentalUI.isNewUI() ? createTemplateListCellRenderer() : new TemplateListCellRenderer());
myTemplatesList.addListSelectionListener(e -> {
TemplatePresentation selectedValue = myTemplatesList.getSelectedValue();
if (selectedValue != null) {

View File

@@ -0,0 +1,14 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.actions.newclass
import com.intellij.ui.dsl.listCellRenderer.listCellRenderer
import javax.swing.ListCellRenderer
internal fun createTemplateListCellRenderer(): ListCellRenderer<CreateWithTemplatesDialogPanel.TemplatePresentation> {
return listCellRenderer {
value.icon?.let {
icon(it)
}
text(value.kind)
}
}

View File

@@ -12,6 +12,7 @@ import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.NlsContexts;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.ExperimentalUI;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.components.JBPanel;
import com.intellij.ui.components.JBTextField;
@@ -22,6 +23,7 @@ import com.intellij.util.Consumer;
import com.intellij.util.SlowOperations;
import com.intellij.util.ui.JBInsets;
import com.intellij.util.ui.JBUI;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -50,6 +52,10 @@ public class NewItemSimplePopupPanel extends JBPanel implements Disposable {
myTextField = createTextField(liveValidation);
add(myTextField, BorderLayout.NORTH);
setBottomSpace(true);
if (ExperimentalUI.isNewUI()) {
setBackground(JBUI.CurrentTheme.NewClassDialog.panelBackground());
}
myErrorShowPoint = new RelativePoint(myTextField, new Point(0, myTextField.getHeight()));
}
@@ -70,6 +76,13 @@ public class NewItemSimplePopupPanel extends JBPanel implements Disposable {
setMessage(warning, true);
}
@ApiStatus.Internal
protected void setBottomSpace(boolean spaceNeeded) {
if (ExperimentalUI.isNewUI()) {
setBorder(spaceNeeded ? JBUI.Borders.emptyBottom(JBUI.CurrentTheme.Popup.bodyBottomInsetNoAd()) : null);
}
}
private void setMessage(@NlsContexts.DialogMessage String message, boolean isWarning) {
myTextField.putClientProperty("JComponent.outline", message != null ? (isWarning ? "warning" : "error") : null);
@@ -101,20 +114,25 @@ public class NewItemSimplePopupPanel extends JBPanel implements Disposable {
return myTextField;
}
protected @NotNull ExtendableTextField createTextField(boolean liveErrorValidation) {
private @NotNull ExtendableTextField createTextField(boolean liveErrorValidation) {
ExtendableTextField res = new ExtendableTextField();
int textFieldHeight = ExperimentalUI.isNewUI() ? 32 : 28;
Dimension minSize = res.getMinimumSize();
Dimension prefSize = res.getPreferredSize();
minSize.height = JBUIScale.scale(28);
prefSize.height = JBUIScale.scale(28);
minSize.height = JBUIScale.scale(textFieldHeight);
prefSize.height = JBUIScale.scale(textFieldHeight);
res.setMinimumSize(minSize);
res.setPreferredSize(prefSize);
res.setColumns(30);
Border border = JBUI.Borders.customLine(JBUI.CurrentTheme.NewClassDialog.bordersColor(), 1, 0, 0, 0);
Border errorBorder = new ErrorBorder(res.getBorder());
res.setBorder(JBUI.Borders.merge(border, errorBorder, false));
if (ExperimentalUI.isNewUI()) {
res.setBorder(JBUI.Borders.compound(errorBorder, JBUI.Borders.emptyLeft(13)));
} else {
Border border = JBUI.Borders.customLine(JBUI.CurrentTheme.NewClassDialog.bordersColor(), 1, 0, 0, 0);
res.setBorder(JBUI.Borders.compound(border, errorBorder));
}
res.setBackground(JBUI.CurrentTheme.NewClassDialog.searchFieldBackground());
res.putClientProperty(TextComponentEmptyText.STATUS_VISIBLE_FUNCTION, (Predicate<JBTextField>)field -> field.getText().isEmpty());

View File

@@ -4,11 +4,12 @@ package com.intellij.ide.ui.newItemPopup;
import com.intellij.ide.IdeBundle;
import com.intellij.ui.ExperimentalUI;
import com.intellij.ui.ScrollingUtil;
import com.intellij.ui.SeparatorComponent;
import com.intellij.ui.SeparatorOrientation;
import com.intellij.ui.components.JBBox;
import com.intellij.ui.components.JBList;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.ui.render.RenderingUtil;
import com.intellij.util.ui.JBEmptyBorder;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.accessibility.ScreenReader;
import org.jetbrains.annotations.NotNull;
@@ -16,8 +17,8 @@ import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
@@ -75,16 +76,20 @@ public class NewItemWithTemplatesPopupPanel<T> extends NewItemSimplePopupPanel {
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
templatesListHolder = new JBBox(BoxLayout.Y_AXIS);
Border lineBorder = JBUI.Borders.customLineTop(JBUI.CurrentTheme.NewClassDialog.bordersColor());
JBEmptyBorder topMarginBorder = JBUI.Borders.emptyTop(JBUI.CurrentTheme.NewClassDialog.fieldsSeparatorWidth());
Border outerBorder = JBUI.Borders.merge(topMarginBorder, lineBorder, true);
setBottomSpace(false);
if (ExperimentalUI.isNewUI()) {
scrollPane.setOverlappingScrollBar(true);
SeparatorComponent separator =
new SeparatorComponent(JBUI.CurrentTheme.Popup.separatorColor(), SeparatorOrientation.HORIZONTAL);
separator.setHGap(JBUI.CurrentTheme.Popup.Selection.LEFT_RIGHT_INSET.get());
templatesListHolder.add(separator);
myTemplatesList.setBorder(JBUI.Borders.empty(4, 0, JBUI.CurrentTheme.Popup.bodyBottomInsetNoAd(), 0));
templatesListHolder.setOpaque(true);
templatesListHolder.setBackground(JBUI.CurrentTheme.Popup.BACKGROUND);
myTemplatesList.setBorder(outerBorder);
}
else {
Border lineBorder = JBUI.Borders.customLineTop(JBUI.CurrentTheme.NewClassDialog.bordersColor());
Border outerBorder = JBUI.Borders.compound(lineBorder, JBUI.Borders.emptyTop(JBUI.CurrentTheme.NewClassDialog.fieldsSeparatorWidth()));
templatesListHolder.setBorder(JBUI.Borders.merge(lineBorder, outerBorder, true));
}
templatesListHolder.add(scrollPane);
@@ -102,6 +107,7 @@ public class NewItemWithTemplatesPopupPanel<T> extends NewItemSimplePopupPanel {
protected void setTemplatesListVisible(boolean visible) {
if (templatesListHolder.isVisible() != visible) {
setBottomSpace(!visible);
templatesListHolder.setVisible(visible);
myVisibilityListeners.forEach(l -> l.visibilityChanged(visible));
}