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 index 1e8fee368..0f37660a4 100644 --- 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 @@ -3,13 +3,10 @@ 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; @@ -38,12 +35,9 @@ public class ProjectOpenCloseListener implements ProjectManagerListener, Disposa projectCountingService.incrProjectCount(); // See if the total # of projects violates the limit. if (projectCountingService.projectLimitExceeded()) { + System.out.println("\n\nOpen limit transition called for: " + project.toString()); // 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."); + showBalloon("projectOpened", project, "Opening Project \"" + project.getName() + "\"", "The number of open projects exceeds the SDK plugin max_opened_projects limit."); } } @@ -62,44 +56,57 @@ public class ProjectOpenCloseListener implements ProjectManagerListener, Disposa 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."); + System.out.println("\n\nCLOSED limit transition called for: " + project.toString()); + // Transitioned to within the limit. + showBalloon("projectClosed", project, "\"" + project.getName() + "\" Has Been Closed", "The number of open projects is below the SDK plugin max_opened_projects limit."); } } + /* + CLOSED limit transition called for: Project (name=testKotlin, containerState=DISPOSE_IN_PROGRESS, componentStore=/Users/jhake/Documents/source/scratch/testKotlin) + From: projectClosed - allProjects[2] = Project (name=conditional_operator_test, containerState=ACTIVE, componentStore=/Users/jhake/Documents/source/scratch/conditional_operator_test) , Open = true + From: projectClosed - allProjects[1] = Project (name=foobar, containerState=ACTIVE, componentStore=/Users/jhake/Documents/source/scratch/foobar) , Open = true + From: projectClosed - allProjects[0] = Project (name=SimpleTest, containerState=ACTIVE, componentStore=/Users/jhake/Documents/source/scratch/SimpleTest) , Open = true + */ + private void showBalloon(String caller, Project project, String title, String message) { + // Ensure the project is open. If not, use the next youngest one in the project list + ProjectManager projectManager = ProjectManager.getInstance(); + Project[] allProjects = projectManager.getOpenProjects(); + Project validProject = allProjects[allProjects.length - 1]; + if (validProject == null) { + return; + } + System.out.println(String.format("From: %s - validProject = %s", caller, validProject.toString())); - private void showBalloon(Project project, String title, String message) { + // Verify the place to put the balloon + final WindowManager manager = WindowManager.getInstance(); + final JFrame frame = manager.getFrame(validProject); + JRootPane pane = frame.getRootPane(); + if (pane == null) { + return; + } + + // Construct and show the balloon 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 + .setHideOnAction(false) .setFillColor(UIUtil.getControlColor()) .setTitle(title) // Added .setFadeoutTime(5000) // Added .createBalloon(); -// DumbAwareAction.create(e -> balloon.hide()) -// .registerCustomShortcutSet(CommonShortcuts.ESCAPE, component); - Disposer.register(project, balloon); + Disposer.register(validProject, balloon); + balloon.showInCenterOf(pane); + // 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); + } /**