Skip to content
This repository was archived by the owner on Apr 23, 2025. It is now read-only.

Commit 32f4cd8

Browse files
committed
feat: validate new project name (#237)
Signed-off-by: Andre Dietisheim <[email protected]>
1 parent 6948ad4 commit 32f4cd8

File tree

5 files changed

+95
-92
lines changed

5 files changed

+95
-92
lines changed

src/main/java/org/jboss/tools/intellij/openshift/actions/project/ChangeActiveProjectAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ private void doActionPerformed(final ApplicationsRootNode rootNode, final Point
7373
throw new RuntimeException(e);
7474
}
7575
}, SwingUtils.EXECUTOR_BACKGROUND)
76-
.handleAsync((ClusterProjects, error) -> {
76+
.handleAsync((clusterProjects, error) -> {
7777
if (error != null) {
7878
return null;
7979
}
80-
ChangeActiveProjectDialog dialog = openActiveProjectDialog(ClusterProjects.isOpenShift, ClusterProjects.current, ClusterProjects.all, location, project);
80+
ChangeActiveProjectDialog dialog = openActiveProjectDialog(clusterProjects.isOpenShift, clusterProjects.current, clusterProjects.all, location, project);
8181
if (dialog.isOK()) {
8282
return new ChangeActiveProjectOperation(dialog.getActiveProject(), odo);
8383
} else if (dialog.isCreateNewProject()) {

src/main/java/org/jboss/tools/intellij/openshift/actions/project/CreateProjectAction.java

Lines changed: 56 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,17 @@
1919
import org.jboss.tools.intellij.openshift.actions.ActionUtils;
2020
import org.jboss.tools.intellij.openshift.actions.NotificationUtils;
2121
import org.jboss.tools.intellij.openshift.actions.cluster.LoggedInClusterAction;
22+
import org.jboss.tools.intellij.openshift.telemetry.TelemetryService;
2223
import org.jboss.tools.intellij.openshift.tree.application.ApplicationsRootNode;
24+
import org.jboss.tools.intellij.openshift.ui.SwingUtils;
25+
import org.jboss.tools.intellij.openshift.ui.project.CreateNewProjectDialog;
2326
import org.jboss.tools.intellij.openshift.utils.odo.Odo;
2427
import org.jetbrains.annotations.NotNull;
2528

29+
import java.awt.Point;
2630
import java.io.IOException;
31+
import java.util.List;
32+
import java.util.concurrent.CompletableFuture;
2733
import java.util.concurrent.CompletionException;
2834

2935
import static org.jboss.tools.intellij.openshift.actions.ActionUtils.runWithProgress;
@@ -40,35 +46,69 @@ public static void execute(ApplicationsRootNode rootNode) {
4046
return;
4147
}
4248
CreateProjectAction action = ActionUtils.createAction(CreateProjectAction.class.getName());
43-
action.doActionPerformed(rootNode, odo, rootNode.getProject());
49+
action.doActionPerformed(rootNode, null, odo, rootNode.getProject());
4450
}
4551

4652
@Override
4753
public void actionPerformedOnSelectedObject(AnActionEvent anActionEvent, Object selected, @NotNull Odo odo) {
4854
ApplicationsRootNode clusterNode = (ApplicationsRootNode) selected;
49-
doActionPerformed(clusterNode, odo, getEventProject(anActionEvent));
55+
Point location = ActionUtils.getLocation(anActionEvent);
56+
doActionPerformed(clusterNode, location, odo, getEventProject(anActionEvent));
5057
}
5158

52-
private void doActionPerformed(ApplicationsRootNode clusterNode, Odo odo, Project project) {
53-
String projectName = Messages.showInputDialog("Project name", "New Project", Messages.getQuestionIcon());
54-
if ((projectName == null) || projectName.trim().isEmpty()) {
55-
sendTelemetryResults(TelemetryResult.ABORTED);
56-
return;
57-
}
58-
runWithProgress((ProgressIndicator progress) -> {
59+
private void doActionPerformed(final ApplicationsRootNode clusterNode, final Point location, final Odo odo, Project project) {
60+
runWithProgress((ProgressIndicator progress) ->
61+
CompletableFuture
62+
.supplyAsync(() -> {
63+
try {
64+
return odo.getNamespaces();
65+
} catch (IOException e) {
66+
NotificationUtils.notifyError("Create New Project", "Could not get projects: " + e.getMessage());
67+
sendTelemetryError(e.getMessage());
68+
throw new RuntimeException(e);
69+
}
70+
}, SwingUtils.EXECUTOR_BACKGROUND)
71+
.handleAsync((allProjects, error) -> {
72+
if (error != null) {
73+
return null;
74+
}
75+
CreateNewProjectDialog dialog = openCreateProjectDialog(allProjects, location, project);
76+
if (dialog.isOK()) {
77+
return dialog.getNewProject();
78+
} else {
79+
sendTelemetryResults(TelemetryService.TelemetryResult.ABORTED);
80+
return null;
81+
}
82+
}
83+
, SwingUtils.EXECUTOR_UI)
84+
.whenCompleteAsync((newProject, error) -> {
85+
if (error != null
86+
|| newProject == null) {
87+
return;
88+
}
89+
createProject(newProject, odo);
90+
}, SwingUtils.EXECUTOR_BACKGROUND),
91+
"Create Active Project...",
92+
project);
93+
}
94+
95+
private void createProject(String newProject, Odo odo) {
5996
try {
60-
Notification notif = NotificationUtils.notifyInformation("Create Project", "Creating project " + projectName);
61-
odo.createProject(projectName);
97+
Notification notif = NotificationUtils.notifyInformation("Create Project", "Creating project " + newProject);
98+
odo.createProject(newProject);
6299
notif.expire();
63-
NotificationUtils.notifyInformation("Create Project", "Project " + projectName + " successfully created");
64-
clusterNode.getStructure().fireModified(clusterNode);
100+
NotificationUtils.notifyInformation("Create Project", "Project " + newProject + " successfully created");
65101
sendTelemetryResults(TelemetryResult.SUCCESS);
66102
} catch (IOException | CompletionException e) {
67103
sendTelemetryError(e);
68104
UIHelper.executeInUI(() -> Messages.showErrorDialog("Error: " + e.getLocalizedMessage(), "Create Project"));
69105
}
70-
},
71-
"Create Project...",
72-
project);
73106
}
107+
108+
private CreateNewProjectDialog openCreateProjectDialog(List<String> allProjects, Point location, Project project) {
109+
CreateNewProjectDialog dialog = new CreateNewProjectDialog(project, allProjects, location);
110+
dialog.show();
111+
return dialog;
112+
}
113+
74114
}

src/main/java/org/jboss/tools/intellij/openshift/ui/SwingUtils.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import java.awt.Component;
3939
import java.awt.Dimension;
4040
import java.awt.Font;
41+
import java.awt.MouseInfo;
42+
import java.awt.Point;
4143
import java.util.concurrent.Executor;
4244
import java.util.regex.Matcher;
4345
import java.util.regex.Pattern;
@@ -140,4 +142,11 @@ public static void setMovable(JRootPane rootPane, JComponent... movableComponent
140142
component -> component.addMouseListener(windowMoveListener));
141143
}
142144

145+
public static Point locationOrMouseLocation(Point location) {
146+
if (location == null) {
147+
location = MouseInfo.getPointerInfo().getLocation();
148+
}
149+
return location;
150+
}
151+
143152
}

src/main/java/org/jboss/tools/intellij/openshift/ui/project/ChangeActiveProjectDialog.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import javax.swing.JRootPane;
3838
import javax.swing.RootPaneContainer;
3939
import javax.swing.SwingConstants;
40-
import java.awt.MouseInfo;
4140
import java.awt.Point;
4241
import java.awt.Window;
4342
import java.awt.event.MouseAdapter;
@@ -46,6 +45,8 @@
4645
import java.util.Collection;
4746
import java.util.function.Supplier;
4847

48+
import static org.jboss.tools.intellij.openshift.ui.SwingUtils.locationOrMouseLocation;
49+
4950
public class ChangeActiveProjectDialog extends DialogWrapper {
5051

5152
private static final String WIDTH = "300";
@@ -89,10 +90,7 @@ protected void init() {
8990

9091
@Override
9192
public void setLocation(Point location) {
92-
if (location == null) {
93-
location = MouseInfo.getPointerInfo().getLocation();
94-
}
95-
super.setLocation(location);
93+
super.setLocation(locationOrMouseLocation(location));
9694
}
9795

9896
private void registerShortcuts(JRootPane rootPane) {

src/main/java/org/jboss/tools/intellij/openshift/ui/project/CreateActiveProjectDialog.java renamed to src/main/java/org/jboss/tools/intellij/openshift/ui/project/CreateNewProjectDialog.java

Lines changed: 25 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,10 @@
2121
import com.intellij.openapi.ui.ValidationInfo;
2222
import com.intellij.openapi.util.text.StringUtil;
2323
import com.intellij.ui.PopupBorder;
24-
import com.intellij.ui.TextFieldWithAutoCompletion;
25-
import com.intellij.ui.TextFieldWithAutoCompletionListProvider;
2624
import com.intellij.ui.components.JBLabel;
27-
import com.intellij.util.textCompletion.TextFieldWithCompletion;
25+
import com.intellij.ui.components.JBTextField;
2826
import com.intellij.util.ui.JBUI;
2927
import net.miginfocom.swing.MigLayout;
30-
import org.jetbrains.annotations.NotNull;
3128
import org.jetbrains.annotations.Nullable;
3229

3330
import javax.swing.JComponent;
@@ -36,39 +33,29 @@
3633
import javax.swing.JRootPane;
3734
import javax.swing.RootPaneContainer;
3835
import javax.swing.SwingConstants;
39-
import java.awt.MouseInfo;
4036
import java.awt.Point;
4137
import java.awt.Window;
42-
import java.awt.event.MouseAdapter;
43-
import java.awt.event.MouseEvent;
44-
import java.awt.event.MouseListener;
4538
import java.util.Collection;
4639
import java.util.function.Supplier;
4740

48-
public class CreateActiveProjectDialog extends DialogWrapper {
41+
import static org.jboss.tools.intellij.openshift.ui.SwingUtils.locationOrMouseLocation;
42+
43+
public class CreateNewProjectDialog extends DialogWrapper {
4944

5045
private static final String WIDTH = "300";
51-
private final Project project;
52-
private final String kind;
53-
private final String currentProject;
5446
private final Collection<String> allProjects;
5547
private final Point location;
56-
private TextFieldWithCompletion activeProjectTextField;
57-
58-
private String activeProject;
48+
private final Project project;
49+
private JBTextField newProjectTextField;
5950

60-
private boolean createNewProject;
51+
private String newProject;
6152

62-
public CreateActiveProjectDialog(
53+
public CreateNewProjectDialog(
6354
@Nullable Project project,
64-
String kind,
65-
String currentProject,
6655
Collection<String> allProjects,
6756
Point location) {
6857
super(project, false);
6958
this.project = project;
70-
this.kind = kind;
71-
this.currentProject = currentProject;
7259
this.allProjects = allProjects;
7360
this.location = location;
7461
init();
@@ -83,15 +70,12 @@ protected void init() {
8370
setOKButtonText("Create");
8471
setBorders(rootPane);
8572
setLocation(location);
86-
setTitle("Create Active " + kind);
73+
setTitle("Create New Project");
8774
}
8875

8976
@Override
9077
public void setLocation(Point location) {
91-
if (location == null) {
92-
location = MouseInfo.getPointerInfo().getLocation();
93-
}
94-
super.setLocation(location);
78+
super.setLocation(locationOrMouseLocation(location));
9579
}
9680

9781
private void registerShortcuts(JRootPane rootPane) {
@@ -113,44 +97,20 @@ private void setBorders(JRootPane rootPane) {
11397
JComponent panel = new JPanel(new MigLayout(
11498
"flowx, ins 0, gap 0, fillx, filly, hidemode 3",
11599
"[left]10[" + WIDTH +",fill]"));
116-
JLabel newActiveProjectLabel = new JBLabel("Create Active " + kind + ":", SwingConstants.LEFT);
100+
JLabel newActiveProjectLabel = new JBLabel("New project:", SwingConstants.LEFT);
117101
newActiveProjectLabel.setBorder(JBUI.Borders.empty(10, 0));
118102
panel.add(newActiveProjectLabel, "left, bottom");
119-
this.activeProjectTextField = new TextFieldWithAutoCompletion<>(
120-
project, onLookup(allProjects), false, true, null);
121-
activeProjectTextField.selectAll();
122-
panel.add(activeProjectTextField, "pushx, growx, wrap");
103+
this.newProjectTextField = new JBTextField();
104+
newProjectTextField.selectAll();
105+
panel.add(newProjectTextField, "pushx, growx, wrap");
123106
ComponentValidator activeProjectValidator = new ComponentValidator(myDisposable)
124107
.withValidator(new ActiveProjectValidator())
125-
.installOn(activeProjectTextField)
126-
.andRegisterOnDocumentListener(activeProjectTextField);
108+
.installOn(newProjectTextField)
109+
.andRegisterOnDocumentListener(newProjectTextField);
127110
activeProjectValidator.revalidate();
128-
JLabel createProjectLabel = new JBLabel("<html>You can <a href=\"\">create a new project</a> instead.</html>");
129-
createProjectLabel.setBorder(JBUI.Borders.emptyTop(20));
130-
createProjectLabel.addMouseListener(onClicked());
131-
panel.add(createProjectLabel, "spanx");
132111
return panel;
133112
}
134113

135-
private MouseListener onClicked() {
136-
return new MouseAdapter() {
137-
138-
@Override
139-
public void mouseReleased(MouseEvent e) {
140-
CreateActiveProjectDialog.this.createNewProject = true;
141-
closeImmediately();
142-
}
143-
};
144-
}
145-
146-
private TextFieldWithAutoCompletionListProvider<String> onLookup(Collection<String> projects) {
147-
return new TextFieldWithAutoCompletionListProvider<>(projects) {
148-
public @NotNull String getLookupString(@NotNull String item) {
149-
return item;
150-
}
151-
};
152-
}
153-
154114
private void closeImmediately() {
155115
if (isVisible()) {
156116
doCancelAction();
@@ -160,34 +120,30 @@ private void closeImmediately() {
160120
@Override
161121
protected void doOKAction() {
162122
super.doOKAction();
163-
this.activeProject = activeProjectTextField.getText();
164-
}
165-
166-
public String getActiveProject() {
167-
return activeProject;
123+
this.newProject = newProjectTextField.getText();
168124
}
169125

170-
public boolean isCreateNewProject() {
171-
return createNewProject;
126+
public String getNewProject() {
127+
return newProject;
172128
}
173129

174130
private class ActiveProjectValidator implements Supplier<ValidationInfo> {
175131

176132
@Override
177133
public ValidationInfo get() {
178-
String activeProject = activeProjectTextField.getText();
134+
String activeProject = newProjectTextField.getText();
179135
ValidationInfo validation = getValidationInfo(activeProject);
180136
// update OK button
181137
setOKActionEnabled(validation.okEnabled);
182138
return validation;
183139
}
184140

185-
private ValidationInfo getValidationInfo(String project) {
141+
private ValidationInfo getValidationInfo(String newProject) {
186142
ValidationInfo validation = new ValidationInfo("").withOKEnabled();
187-
if (StringUtil.isEmptyOrSpaces(project)) {
188-
validation = new ValidationInfo("Provide active Project").forComponent(activeProjectTextField).asWarning();
189-
} else if (project.equals(currentProject)) {
190-
validation = new ValidationInfo("Choose different Project").forComponent(activeProjectTextField).asWarning();
143+
if (StringUtil.isEmptyOrSpaces(newProject)) {
144+
validation = new ValidationInfo("Provide project name").forComponent(newProjectTextField).asWarning();
145+
} else if (allProjects.contains(newProject)) {
146+
validation = new ValidationInfo("Already exists, choose new name").forComponent(newProjectTextField).asWarning();
191147
}
192148
return validation;
193149
}

0 commit comments

Comments
 (0)