mirror of
https://github.com/JetBrains/intellij-sdk-code-samples.git
synced 2025-07-27 16:57:49 +08:00
Inc Feedback
This commit is contained in:
parent
c9f5a3f92c
commit
081823f5e8
@ -17,7 +17,6 @@ repositories {
|
|||||||
// See https://github.com/JetBrains/gradle-intellij-plugin/
|
// See https://github.com/JetBrains/gradle-intellij-plugin/
|
||||||
intellij {
|
intellij {
|
||||||
version '2019.3.3'
|
version '2019.3.3'
|
||||||
sameSinceUntilBuild = true
|
|
||||||
}
|
}
|
||||||
patchPluginXml {
|
patchPluginXml {
|
||||||
version = project.version
|
version = project.version
|
||||||
|
@ -12,10 +12,25 @@ import com.intellij.openapi.project.ProjectManager;
|
|||||||
public class ProjectCountingService {
|
public class ProjectCountingService {
|
||||||
// Sets the maximum allowed number of opened projects.
|
// Sets the maximum allowed number of opened projects.
|
||||||
private final int MAX_OPEN_PRJ_LIMIT = 3;
|
private final int MAX_OPEN_PRJ_LIMIT = 3;
|
||||||
|
// The count of open projects must always be >= 0
|
||||||
|
private int openProjectCount = 0;
|
||||||
|
|
||||||
public boolean projLimitExceeded() {
|
public void incrProjectCount() {
|
||||||
ProjectManager prjMgr = ProjectManager.getInstance();
|
if (openProjectCount < 0) {
|
||||||
return prjMgr.getOpenProjects().length > MAX_OPEN_PRJ_LIMIT;
|
openProjectCount = 0;
|
||||||
|
}
|
||||||
|
openProjectCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void decrProjectCount() {
|
||||||
|
openProjectCount--;
|
||||||
|
if (openProjectCount < 0) {
|
||||||
|
openProjectCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean projectLimitExceeded() {
|
||||||
|
return openProjectCount > MAX_OPEN_PRJ_LIMIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
@ -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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
<!-- The version of this plugin is set by build.gradle -->
|
<!-- The version of this plugin is set by build.gradle -->
|
||||||
|
|
||||||
<!-- The idea-version of this plugin is set by build.gradle -->
|
<!-- The idea-version of this plugin is overwritten by build.gradle -->
|
||||||
<idea-version since-build="193"/>
|
<idea-version since-build="193"/>
|
||||||
|
|
||||||
<!-- Product and plugin compatibility requirements -->
|
<!-- Product and plugin compatibility requirements -->
|
||||||
@ -25,7 +25,7 @@
|
|||||||
<change-notes>
|
<change-notes>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
<ul>
|
<ul>
|
||||||
<li><b>2.1.0</b> Remove project component and use listener instead.</li>
|
<li><b>2.1.0</b> Remove project component and use listener instead. No longer denies opening additional projets. Just notifies the user.</li>
|
||||||
<li><b>2.0.0</b> Convert to Gradle-based plugin.</li>
|
<li><b>2.0.0</b> Convert to Gradle-based plugin.</li>
|
||||||
<li><b>1.0.0</b> Release 2018.3 and earlier.</li>
|
<li><b>1.0.0</b> Release 2018.3 and earlier.</li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -36,7 +36,7 @@
|
|||||||
<vendor url="https://plugins.jetbrains.com">IntelliJ Platform SDK</vendor>
|
<vendor url="https://plugins.jetbrains.com">IntelliJ Platform SDK</vendor>
|
||||||
|
|
||||||
<applicationListeners>
|
<applicationListeners>
|
||||||
<listener class="org.intellij.sdk.maxOpenPrj.ProjectOpenListener" topic="com.intellij.openapi.project.ProjectManagerListener"/>
|
<listener class="org.intellij.sdk.maxOpenPrj.ProjectOpenCloseListener" topic="com.intellij.openapi.project.ProjectManagerListener"/>
|
||||||
</applicationListeners>
|
</applicationListeners>
|
||||||
|
|
||||||
<extensions defaultExtensionNs="com.intellij">
|
<extensions defaultExtensionNs="com.intellij">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user