From 081823f5e8d95cd8547ac7185ae5d1c1fb24a8af Mon Sep 17 00:00:00 2001 From: JohnHake Date: Thu, 27 Feb 2020 17:25:22 -0800 Subject: [PATCH] Inc Feedback --- max_opened_projects/build.gradle | 1 - .../maxOpenPrj/ProjectCountingService.java | 21 +++- .../maxOpenPrj/ProjectOpenCloseListener.java | 112 ++++++++++++++++++ .../sdk/maxOpenPrj/ProjectOpenListener.java | 38 ------ .../src/main/resources/META-INF/plugin.xml | 6 +- 5 files changed, 133 insertions(+), 45 deletions(-) create mode 100644 max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectOpenCloseListener.java delete mode 100644 max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectOpenListener.java diff --git a/max_opened_projects/build.gradle b/max_opened_projects/build.gradle index f01cc9d93..0dd7a4d4f 100644 --- a/max_opened_projects/build.gradle +++ b/max_opened_projects/build.gradle @@ -17,7 +17,6 @@ repositories { // See https://github.com/JetBrains/gradle-intellij-plugin/ intellij { version '2019.3.3' - sameSinceUntilBuild = true } patchPluginXml { version = project.version diff --git a/max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectCountingService.java b/max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectCountingService.java index afce843f6..4af162d2a 100644 --- a/max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectCountingService.java +++ b/max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectCountingService.java @@ -12,10 +12,25 @@ import com.intellij.openapi.project.ProjectManager; public class ProjectCountingService { // Sets the maximum allowed number of opened projects. private final int MAX_OPEN_PRJ_LIMIT = 3; + // The count of open projects must always be >= 0 + private int openProjectCount = 0; - public boolean projLimitExceeded() { - ProjectManager prjMgr = ProjectManager.getInstance(); - return prjMgr.getOpenProjects().length > MAX_OPEN_PRJ_LIMIT; + public void incrProjectCount() { + if (openProjectCount < 0) { + openProjectCount = 0; + } + openProjectCount++; + } + + public void decrProjectCount() { + openProjectCount--; + if (openProjectCount < 0) { + openProjectCount = 0; + } + } + + public boolean projectLimitExceeded() { + return openProjectCount > MAX_OPEN_PRJ_LIMIT; } } diff --git a/max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectOpenCloseListener.java b/max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectOpenCloseListener.java new file mode 100644 index 000000000..1e8fee368 --- /dev/null +++ b/max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectOpenCloseListener.java @@ -0,0 +1,112 @@ +// Copyright 2000-2020 JetBrains s.r.o. and other contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + +package org.intellij.sdk.maxOpenPrj; + +import com.intellij.openapi.Disposable; +import com.intellij.openapi.actionSystem.CommonShortcuts; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.project.ProjectManagerListener; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.ui.popup.Balloon; +import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.wm.WindowManager; +import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +/** + * Listener to detect project open and close. + * Depends on the org.intellij.sdk.maxOpenPrj.ProjectCountingService + */ +public class ProjectOpenCloseListener implements ProjectManagerListener, Disposable { + + /** + * Invoked on project open. + * + * @param project opening project + */ + @Override + public void projectOpened(@NotNull Project project) { + // Get the counting service + ProjectCountingService projectCountingService = ServiceManager.getService(ProjectCountingService.class); + // Increment the project count + projectCountingService.incrProjectCount(); + // See if the total # of projects violates the limit. + if (projectCountingService.projectLimitExceeded()) { + // Transitioned to outside the limit +// Messages.showMessageDialog( +// "The number of open projects exceeds the SDK plugin max_opened_projects limit.", +// "Opening Project \"" + project.getName() + "\"", +// Messages.getErrorIcon()); + showBalloon(project, "Opening Project \"" + project.getName() + "\"", "The number of open projects exceeds the SDK plugin max_opened_projects limit."); + } + } + + /** + * Invoked on project close. + * + * @param project closing project + */ + @Override + public void projectClosed(@NotNull Project project) { + // Get the counting service + ProjectCountingService projectCountingService = ServiceManager.getService(ProjectCountingService.class); + // Was the count above the limit? + boolean previouslyOverCount = projectCountingService.projectLimitExceeded(); + // Decrement the count because a project just closed + projectCountingService.decrProjectCount(); + // See if the total # of projects no longer violates the limit. + if (!projectCountingService.projectLimitExceeded() && previouslyOverCount) { + // Transitioned from above the limit to within the limit. +// Messages.showMessageDialog( +// "The number of open projects does not exceed the SDK plugin max_opened_projects limit.", +// "\"" + project.getName() + "\" Has Been Closed", +// Messages.getErrorIcon()); + showBalloon(project, "\"" + project.getName() + "\" Has Been Closed", "The number of open projects is below the SDK plugin max_opened_projects limit."); + } + } + + + private void showBalloon(Project project, String title, String message) { + JLabel component = new JLabel(message); + final Balloon balloon = JBPopupFactory.getInstance().createBalloonBuilder(component) + .setShadow(true) + .setAnimationCycle(200) // Was 0 + .setHideOnClickOutside(true) +// .setHideOnKeyOutside(true) + .setHideOnAction(true) // was false + .setFillColor(UIUtil.getControlColor()) + .setTitle(title) // Added + .setFadeoutTime(5000) // Added + .createBalloon(); +// DumbAwareAction.create(e -> balloon.hide()) +// .registerCustomShortcutSet(CommonShortcuts.ESCAPE, component); + Disposer.register(project, balloon); +// final Balloon.Position position = QuickEditAction.getBalloonPosition(editor); +// RelativePoint point = JBPopupFactory.getInstance().guessBestPopupLocation(editor); +// if (position == Balloon.Position.above) { +// final Point p = point.getPoint(); +// point = new RelativePoint(point.getComponent(), new Point(p.x, p.y - editor.getLineHeight())); +// } + ProjectManager PM = ProjectManager.getInstance(); + Project[] AllProjects = PM.getOpenProjects(); + Project prevProject = AllProjects[AllProjects.length - 1]; + final WindowManager manager = WindowManager.getInstance(); + final JFrame frame = prevProject != null ? manager.getFrame(prevProject) : manager.findVisibleFrame(); + JRootPane pane = frame.getRootPane(); + balloon.showInCenterOf(pane); + } + + /** + * Usually not invoked directly, see Disposable class javadoc. + */ + @Override + public void dispose() { + // noop + } +} diff --git a/max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectOpenListener.java b/max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectOpenListener.java deleted file mode 100644 index 62d49c6fb..000000000 --- a/max_opened_projects/src/main/java/org/intellij/sdk/maxOpenPrj/ProjectOpenListener.java +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2000-2020 JetBrains s.r.o. and other contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - -package org.intellij.sdk.maxOpenPrj; - -import com.intellij.openapi.components.ServiceManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManager; -import com.intellij.openapi.project.ProjectManagerListener; -import com.intellij.openapi.ui.Messages; -import org.jetbrains.annotations.NotNull; - -/** - * Listener to detect opening of projects. - */ -public class ProjectOpenListener implements ProjectManagerListener { - - /** - * Invoked on project open. - * - * @param project opening project - */ - @Override - public void projectOpened(@NotNull Project project) { - // Get the counting service - ProjectCountingService prjCountingSrvc = ServiceManager.getService(ProjectCountingService.class); - // See if the total # of projects violates the limit. - if (prjCountingSrvc.projLimitExceeded()) { - Messages.showMessageDialog( - "The number of open projects exceeds the SDK plugin max_opened_projects limit. Close at least one open project and try again.", - "Cannot open project \"" + project.getName() + "\"", - Messages.getErrorIcon()); - ProjectManager prjMgr = ProjectManager.getInstance(); - boolean closedSuccessfully = prjMgr.closeProject(project); - System.out.println(String.format("Project closing was %s", closedSuccessfully)); - } - } - -} diff --git a/max_opened_projects/src/main/resources/META-INF/plugin.xml b/max_opened_projects/src/main/resources/META-INF/plugin.xml index b767d8652..417b3b94a 100644 --- a/max_opened_projects/src/main/resources/META-INF/plugin.xml +++ b/max_opened_projects/src/main/resources/META-INF/plugin.xml @@ -10,7 +10,7 @@ - + @@ -25,7 +25,7 @@ -
  • 2.1.0 Remove project component and use listener instead.
  • +
  • 2.1.0 Remove project component and use listener instead. No longer denies opening additional projets. Just notifies the user.
  • 2.0.0 Convert to Gradle-based plugin.
  • 1.0.0 Release 2018.3 and earlier.
  • @@ -36,7 +36,7 @@ IntelliJ Platform SDK - +