diff --git a/build.gradle b/build.gradle index 31b5436..a716148 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'io.zhile.research.intellij' -version '2.1.6' +version '2.1.7' sourceCompatibility = 1.7 targetCompatibility = 1.7 @@ -23,12 +23,14 @@ buildPlugin { // See https://github.com/JetBrains/gradle-intellij-plugin/ intellij { - version "2020.2.3" + version "2020.2.4" type "IU" } patchPluginXml { changeNotes """
+Release v2.1.7 + 1. add help page link Release v2.1.6 1. fix the pop-up of license window Release v2.1.5 diff --git a/src/main/java/io/zhile/research/intellij/ier/action/ResetAction.java b/src/main/java/io/zhile/research/intellij/ier/action/ResetAction.java index 8cfa8b0..542a264 100644 --- a/src/main/java/io/zhile/research/intellij/ier/action/ResetAction.java +++ b/src/main/java/io/zhile/research/intellij/ier/action/ResetAction.java @@ -1,10 +1,8 @@ package io.zhile.research.intellij.ier.action; import com.intellij.icons.AllIcons; -import com.intellij.notification.Notification; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.DataKey; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; @@ -12,34 +10,32 @@ import com.intellij.openapi.wm.ToolWindowAnchor; import com.intellij.openapi.wm.ToolWindowEP; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.openapi.wm.ex.ToolWindowManagerEx; -import io.zhile.research.intellij.ier.component.ResetTimer; import io.zhile.research.intellij.ier.helper.Constants; import io.zhile.research.intellij.ier.helper.CustomRepository; +import io.zhile.research.intellij.ier.helper.NotificationHelper; import io.zhile.research.intellij.ier.helper.PluginHelper; +import io.zhile.research.intellij.ier.listener.AppActivationListener; +import io.zhile.research.intellij.ier.listener.AppEventListener; import io.zhile.research.intellij.ier.tw.MainToolWindowFactory; import io.zhile.research.intellij.ier.ui.dialog.MainDialog; import org.jetbrains.annotations.NotNull; -import java.lang.ref.WeakReference; - public class ResetAction extends AnAction implements DumbAware { - private static final DataKeyNOTIFICATION_KEY = DataKey.create("Notification"); + static { + AppEventListener.getInstance().listen(); + AppActivationListener.getInstance().listen(); + CustomRepository.checkAndAdd(CustomRepository.DEFAULT_HOST); + } public ResetAction() { super(Constants.ACTION_NAME, "Reset my IDE eval information", AllIcons.General.Reset); - ResetTimer.start(new WeakReference<>(this)); - - CustomRepository.checkAndAdd(CustomRepository.DEFAULT_HOST); } @Override public void actionPerformed(@NotNull AnActionEvent e) { Project project = e.getProject(); - Notification notification = NOTIFICATION_KEY.getData(e.getDataContext()); - if (null != notification) { - notification.expire(); - } + NotificationHelper.checkAndExpire(e); if (project == null) { MainDialog mainDialog = new MainDialog(Constants.ACTION_NAME); diff --git a/src/main/java/io/zhile/research/intellij/ier/action/RestartAction.java b/src/main/java/io/zhile/research/intellij/ier/action/RestartAction.java index 77433da..534b3ee 100644 --- a/src/main/java/io/zhile/research/intellij/ier/action/RestartAction.java +++ b/src/main/java/io/zhile/research/intellij/ier/action/RestartAction.java @@ -3,8 +3,9 @@ package io.zhile.research.intellij.ier.action; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.DumbAware; +import io.zhile.research.intellij.ier.helper.AppHelper; +import io.zhile.research.intellij.ier.helper.NotificationHelper; import org.jetbrains.annotations.NotNull; public class RestartAction extends AnAction implements DumbAware { @@ -14,11 +15,8 @@ public class RestartAction extends AnAction implements DumbAware { @Override public void actionPerformed(@NotNull AnActionEvent e) { - ApplicationManager.getApplication().invokeLater(new Runnable() { - @Override - public void run() { - ApplicationManager.getApplication().restart(); - } - }); + NotificationHelper.checkAndExpire(e); + + AppHelper.restart(); } } diff --git a/src/main/java/io/zhile/research/intellij/ier/common/PropertyRecord.java b/src/main/java/io/zhile/research/intellij/ier/common/PropertyRecord.java index 1479dd1..226693a 100644 --- a/src/main/java/io/zhile/research/intellij/ier/common/PropertyRecord.java +++ b/src/main/java/io/zhile/research/intellij/ier/common/PropertyRecord.java @@ -1,18 +1,15 @@ package io.zhile.research.intellij.ier.common; import com.intellij.ide.util.PropertiesComponent; -import com.intellij.ide.util.PropertiesComponentImpl; public class PropertyRecord implements EvalRecord { - public static final PropertiesComponentImpl PROPS = (PropertiesComponentImpl) PropertiesComponent.getInstance(); - private final String type = "PROPERTY"; private final String key; private final String value; public PropertyRecord(String key) { this.key = key; - this.value = PROPS.getValue(key); + this.value = PropertiesComponent.getInstance().getValue(key); } public String getKey() { @@ -25,7 +22,7 @@ public class PropertyRecord implements EvalRecord { @Override public void reset() throws Exception { - PROPS.unsetValue(key); + PropertiesComponent.getInstance().unsetValue(key); } @Override diff --git a/src/main/java/io/zhile/research/intellij/ier/common/Resetter.java b/src/main/java/io/zhile/research/intellij/ier/common/Resetter.java index 845959b..67833db 100644 --- a/src/main/java/io/zhile/research/intellij/ier/common/Resetter.java +++ b/src/main/java/io/zhile/research/intellij/ier/common/Resetter.java @@ -3,6 +3,8 @@ package io.zhile.research.intellij.ier.common; import com.intellij.ide.Prefs; import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.plugins.PluginManager; +import com.intellij.ide.util.PropertiesComponent; +import com.intellij.ide.util.PropertiesComponentImpl; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.util.SystemInfo; import io.zhile.research.intellij.ier.helper.Constants; @@ -63,7 +65,7 @@ public class Resetter { } } - Element state = PropertyRecord.PROPS.getState(); + Element state = ((PropertiesComponentImpl) PropertiesComponent.getInstance()).getState(); if (state != null) { Attribute attrName, attrValue; for (Element element : state.getChildren()) { diff --git a/src/main/java/io/zhile/research/intellij/ier/component/ResetTimer.java b/src/main/java/io/zhile/research/intellij/ier/component/ResetTimer.java deleted file mode 100644 index b299f5f..0000000 --- a/src/main/java/io/zhile/research/intellij/ier/component/ResetTimer.java +++ /dev/null @@ -1,96 +0,0 @@ -package io.zhile.research.intellij.ier.component; - -import com.intellij.ide.AppLifecycleListener; -import com.intellij.ide.Prefs; -import com.intellij.notification.Notification; -import com.intellij.notification.NotificationType; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.application.ApplicationActivationListener; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.wm.IdeFrame; -import com.intellij.util.messages.MessageBusConnection; -import io.zhile.research.intellij.ier.action.ResetAction; -import io.zhile.research.intellij.ier.action.RestartAction; -import io.zhile.research.intellij.ier.common.Resetter; -import io.zhile.research.intellij.ier.helper.Constants; -import io.zhile.research.intellij.ier.helper.DateTime; -import io.zhile.research.intellij.ier.helper.NotificationHelper; -import io.zhile.research.intellij.ier.helper.PluginHelper; -import io.zhile.research.intellij.ier.listener.AppEventListener; - -import java.lang.ref.WeakReference; - -public class ResetTimer { - private static final long RESET_PERIOD = 2160000000L; // 25 days - private static final String RESET_KEY = Constants.PLUGIN_PREFS_PREFIX + "." + Constants.IDE_NAME_LOWER + "." + Constants.IDE_HASH; - - private static MessageBusConnection connection; - - public static long getLastResetTime() { - return Prefs.getLong(RESET_KEY, 0L); - } - - public static void resetLastResetTime() { - Prefs.putLong(RESET_KEY, System.currentTimeMillis()); - Resetter.syncPrefs(); - } - - public static String getLastResetTimeStr() { - long lastResetTime = getLastResetTime(); - - return lastResetTime > 0 ? DateTime.getStringFromTimestamp(lastResetTime) : "Not yet"; - } - - public synchronized static void start(final WeakReference weakResetAction) { - if (connection != null) { - return; - } - - ApplicationManager.getApplication().getMessageBus().connect().subscribe(AppLifecycleListener.TOPIC, new AppEventListener()); - - connection = ApplicationManager.getApplication().getMessageBus().connect(); - connection.subscribe(ApplicationActivationListener.TOPIC, new ApplicationActivationListener() { - public void applicationActivated(IdeFrame ideFrame) { - if (System.currentTimeMillis() - getLastResetTime() <= RESET_PERIOD) { - return; - } - - stop(); - - AnAction resetAction = weakResetAction.get(); - if (resetAction == null) { - return; - } - - AnAction action = resetAction; - NotificationType type = NotificationType.INFORMATION; - String message = "It has been a long time since the last reset!\nWould you like to reset it again?"; - if (Resetter.isAutoReset()) { - action = new RestartAction(); - type = NotificationType.WARNING; - } - - Notification notification = NotificationHelper.NOTIFICATION_GROUP.createNotification(PluginHelper.getPluginName(), null, message, type); - notification.addAction(action); - notification.notify(null); - } - - public void applicationDeactivated(IdeFrame ideFrame) { - applicationActivated(ideFrame); - } - - public void delayedApplicationDeactivated(IdeFrame ideFrame) { - - } - }); - } - - public synchronized static void stop() { - if (connection == null) { - return; - } - - connection.disconnect(); - connection = null; - } -} diff --git a/src/main/java/io/zhile/research/intellij/ier/helper/AppHelper.java b/src/main/java/io/zhile/research/intellij/ier/helper/AppHelper.java new file mode 100644 index 0000000..b96568f --- /dev/null +++ b/src/main/java/io/zhile/research/intellij/ier/helper/AppHelper.java @@ -0,0 +1,20 @@ +package io.zhile.research.intellij.ier.helper; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.Disposer; +import io.zhile.research.intellij.ier.listener.AppActivationListener; +import io.zhile.research.intellij.ier.listener.AppEventListener; + +public class AppHelper { + public static void restart() { + Disposer.dispose(AppActivationListener.getInstance()); + Disposer.dispose(AppEventListener.getInstance()); + + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + ApplicationManager.getApplication().restart(); + } + }); + } +} diff --git a/src/main/java/io/zhile/research/intellij/ier/helper/Constants.java b/src/main/java/io/zhile/research/intellij/ier/helper/Constants.java index 31f2358..1c4119d 100644 --- a/src/main/java/io/zhile/research/intellij/ier/helper/Constants.java +++ b/src/main/java/io/zhile/research/intellij/ier/helper/Constants.java @@ -11,4 +11,6 @@ public class Constants { public static final String IDE_NAME_LOWER = IDE_NAME.toLowerCase(); public static final String IDE_HASH = Integer.toHexString(FileUtil.pathHashCode(PathManager.getHomePath())); public static final String PLUGIN_PREFS_PREFIX = "Ide-Eval-Reset"; + public static final String RESET_ACTION_ID = "io.zhile.research.intellij.ier.action.ResetAction"; + public static final String RESTART_ACTION_ID = "io.zhile.research.intellij.ier.action.RestartAction"; } diff --git a/src/main/java/io/zhile/research/intellij/ier/helper/NotificationHelper.java b/src/main/java/io/zhile/research/intellij/ier/helper/NotificationHelper.java index 20e30ca..4a0595b 100644 --- a/src/main/java/io/zhile/research/intellij/ier/helper/NotificationHelper.java +++ b/src/main/java/io/zhile/research/intellij/ier/helper/NotificationHelper.java @@ -1,22 +1,40 @@ package io.zhile.research.intellij.ier.helper; import com.intellij.icons.AllIcons; -import com.intellij.notification.Notification; -import com.intellij.notification.NotificationDisplayType; -import com.intellij.notification.NotificationGroup; -import com.intellij.notification.NotificationType; +import com.intellij.notification.*; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.DataKey; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.Nullable; public class NotificationHelper { - public static final NotificationGroup NOTIFICATION_GROUP = new NotificationGroup(Constants.PLUGIN_ID_STR, NotificationDisplayType.BALLOON, true, null, AllIcons.General.Reset); + public static void checkAndExpire(AnActionEvent e) { + DataKey notificationKey = DataKey.create("Notification"); + Notification notification = notificationKey.getData(e.getDataContext()); + if (null != notification) { + notification.expire(); + } + } public static Notification show(@Nullable Project project, String title, String subtitle, String content, NotificationType type) { + return show(project, title, subtitle, content, type, new AnAction[0]); + } + + public static Notification show(@Nullable Project project, String title, String subtitle, String content, NotificationType type, AnAction action) { + return show(project, title, subtitle, content, type, new AnAction[]{action}); + } + + public static Notification show(@Nullable Project project, String title, String subtitle, String content, NotificationType type, AnAction[] actions) { if (title == null) { title = PluginHelper.getPluginName(); } - Notification notification = NOTIFICATION_GROUP.createNotification(title, subtitle, content, type); + NotificationGroup group = new NotificationGroup(Constants.PLUGIN_ID_STR, NotificationDisplayType.BALLOON, true, null, AllIcons.General.Reset); + Notification notification = group.createNotification(title, subtitle, content, type, NotificationListener.URL_OPENING_LISTENER); + for (AnAction action : actions) { + notification.addAction(action); + } notification.notify(project); return notification; diff --git a/src/main/java/io/zhile/research/intellij/ier/helper/PluginHelper.java b/src/main/java/io/zhile/research/intellij/ier/helper/PluginHelper.java index 1eccec5..5e2d139 100644 --- a/src/main/java/io/zhile/research/intellij/ier/helper/PluginHelper.java +++ b/src/main/java/io/zhile/research/intellij/ier/helper/PluginHelper.java @@ -5,21 +5,25 @@ import com.intellij.ide.plugins.PluginManager; import com.intellij.openapi.extensions.PluginId; public class PluginHelper { - private static final IdeaPluginDescriptor PLUGIN_DESCRIPTOR = PluginManager.getPlugin(getPluginId()); - public static PluginId getPluginId() { return PluginId.getId(Constants.PLUGIN_ID_STR); } public static IdeaPluginDescriptor getPluginDescriptor() { - return PLUGIN_DESCRIPTOR; + return PluginManager.getPlugin(getPluginId()); } public static String getPluginName() { - return PLUGIN_DESCRIPTOR == null ? "UNKNOWN" : PLUGIN_DESCRIPTOR.getName(); + IdeaPluginDescriptor pluginDescriptor = getPluginDescriptor(); + return pluginDescriptor == null ? "UNKNOWN" : pluginDescriptor.getName(); } public static String getPluginVersion() { - return PLUGIN_DESCRIPTOR == null ? "UNKNOWN" : PLUGIN_DESCRIPTOR.getVersion(); + IdeaPluginDescriptor pluginDescriptor = getPluginDescriptor(); + return pluginDescriptor == null ? "UNKNOWN" : pluginDescriptor.getVersion(); + } + + public static boolean myself(IdeaPluginDescriptor pluginDescriptor) { + return Constants.PLUGIN_ID_STR.equals(pluginDescriptor.getPluginId().getIdString()); } } diff --git a/src/main/java/io/zhile/research/intellij/ier/helper/ResetTimeHelper.java b/src/main/java/io/zhile/research/intellij/ier/helper/ResetTimeHelper.java new file mode 100644 index 0000000..0b2245c --- /dev/null +++ b/src/main/java/io/zhile/research/intellij/ier/helper/ResetTimeHelper.java @@ -0,0 +1,28 @@ +package io.zhile.research.intellij.ier.helper; + +import com.intellij.ide.Prefs; +import io.zhile.research.intellij.ier.common.Resetter; + +public class ResetTimeHelper { + public static final long RESET_PERIOD = 2160000000L; // 25 days + private static final String RESET_KEY = Constants.PLUGIN_PREFS_PREFIX + "." + Constants.IDE_NAME_LOWER + "." + Constants.IDE_HASH; + + public static long getLastResetTime() { + return Prefs.getLong(RESET_KEY, 0L); + } + + public static void resetLastResetTime() { + Prefs.putLong(RESET_KEY, System.currentTimeMillis()); + Resetter.syncPrefs(); + } + + public static boolean overResetPeriod() { + return System.currentTimeMillis() - ResetTimeHelper.getLastResetTime() > RESET_PERIOD; + } + + public static String getLastResetTimeStr() { + long lastResetTime = getLastResetTime(); + + return lastResetTime > 0 ? DateTime.getStringFromTimestamp(lastResetTime) : "Not yet"; + } +} diff --git a/src/main/java/io/zhile/research/intellij/ier/listener/AppActivationListener.java b/src/main/java/io/zhile/research/intellij/ier/listener/AppActivationListener.java new file mode 100644 index 0000000..fda6d0b --- /dev/null +++ b/src/main/java/io/zhile/research/intellij/ier/listener/AppActivationListener.java @@ -0,0 +1,78 @@ +package io.zhile.research.intellij.ier.listener; + +import com.intellij.notification.NotificationType; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.application.ApplicationActivationListener; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.wm.IdeFrame; +import com.intellij.util.messages.MessageBusConnection; +import io.zhile.research.intellij.ier.common.Resetter; +import io.zhile.research.intellij.ier.helper.Constants; +import io.zhile.research.intellij.ier.helper.NotificationHelper; +import io.zhile.research.intellij.ier.helper.ResetTimeHelper; +import org.jetbrains.annotations.NotNull; + +public class AppActivationListener implements ApplicationActivationListener, Disposable { + private static AppActivationListener instance = new AppActivationListener(); + private static MessageBusConnection connection; + + protected AppActivationListener() { + + } + + public static AppActivationListener getInstance() { + return instance; + } + + public synchronized void listen() { + if (connection != null) { + return; + } + + connection = ApplicationManager.getApplication().getMessageBus().connect(); + connection.subscribe(ApplicationActivationListener.TOPIC, this); + } + + public synchronized void stop() { + if (connection == null) { + return; + } + + connection.disconnect(); + connection = null; + } + + public void applicationActivated(@NotNull IdeFrame ideFrame) { + if (!ResetTimeHelper.overResetPeriod()) { + return; + } + + stop(); + + AnAction action = ActionManager.getInstance().getAction(Constants.RESET_ACTION_ID); + NotificationType type = NotificationType.INFORMATION; + String message = "It has been a long time since the last reset!\nWould you like to reset it again?"; + if (Resetter.isAutoReset()) { + action = ActionManager.getInstance().getAction(Constants.RESTART_ACTION_ID); + type = NotificationType.WARNING; + } + + NotificationHelper.show(null, null, null, message, type, action); + } + + public void applicationDeactivated(@NotNull IdeFrame ideFrame) { + applicationActivated(ideFrame); + } + + public void delayedApplicationDeactivated(@NotNull IdeFrame ideFrame) { + + } + + @Override + public void dispose() { + stop(); + instance = null; + } +} diff --git a/src/main/java/io/zhile/research/intellij/ier/listener/AppEventListener.java b/src/main/java/io/zhile/research/intellij/ier/listener/AppEventListener.java index 48c2bb8..b2a68d1 100644 --- a/src/main/java/io/zhile/research/intellij/ier/listener/AppEventListener.java +++ b/src/main/java/io/zhile/research/intellij/ier/listener/AppEventListener.java @@ -1,51 +1,78 @@ package io.zhile.research.intellij.ier.listener; import com.intellij.ide.AppLifecycleListener; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; +import com.intellij.util.messages.MessageBusConnection; import io.zhile.research.intellij.ier.common.Resetter; -import io.zhile.research.intellij.ier.component.ResetTimer; +import io.zhile.research.intellij.ier.helper.ResetTimeHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class AppEventListener implements AppLifecycleListener { - private static boolean enabled = true; +public class AppEventListener implements AppLifecycleListener, Disposable { + private static AppEventListener instance = new AppEventListener(); + private static MessageBusConnection connection; - public synchronized static void disable() { - enabled = false; + protected AppEventListener() { + + } + + public static AppEventListener getInstance() { + return instance; + } + + public synchronized void listen() { + if (connection != null) { + return; + } + + connection = ApplicationManager.getApplication().getMessageBus().connect(); + connection.subscribe(AppLifecycleListener.TOPIC, this); + } + + public synchronized void stop() { + if (connection == null) { + return; + } + + connection.disconnect(); + connection = null; } public void appFrameCreated(String[] commandLineArgs, @NotNull Ref willOpenProject) { } - @Override public void appStarting(@Nullable Project projectFromCommandLine) { } - @Override public void projectFrameClosed() { } - @Override public void projectOpenFailed() { } - @Override public void welcomeScreenDisplayed() { } - @Override public void appClosing() { - if (!enabled || !Resetter.isAutoReset()) { + if (!Resetter.isAutoReset()) { return; } Resetter.reset(Resetter.getEvalRecords()); - ResetTimer.resetLastResetTime(); + ResetTimeHelper.resetLastResetTime(); + } + + @Override + public void dispose() { + stop(); + instance = null; } } diff --git a/src/main/java/io/zhile/research/intellij/ier/listener/PluginListener.java b/src/main/java/io/zhile/research/intellij/ier/listener/PluginListener.java index 4178fc3..811d9f6 100644 --- a/src/main/java/io/zhile/research/intellij/ier/listener/PluginListener.java +++ b/src/main/java/io/zhile/research/intellij/ier/listener/PluginListener.java @@ -3,20 +3,32 @@ package io.zhile.research.intellij.ier.listener; import com.intellij.ide.plugins.DynamicPluginListener; import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.util.Disposer; +import io.zhile.research.intellij.ier.helper.Constants; import io.zhile.research.intellij.ier.helper.NotificationHelper; +import io.zhile.research.intellij.ier.helper.PluginHelper; import io.zhile.research.intellij.ier.tw.MainToolWindowFactory; import org.jetbrains.annotations.NotNull; public class PluginListener implements DynamicPluginListener { @Override public void pluginLoaded(@NotNull IdeaPluginDescriptor pluginDescriptor) { - ActionManager.getInstance().getAction("io.zhile.research.intellij.ier.action.ResetAction"); + if (!PluginHelper.myself(pluginDescriptor)) { + return; + } - NotificationHelper.showInfo(null, "Plugin installed successfully! Now enjoy it~"); + ActionManager.getInstance().getAction(Constants.RESET_ACTION_ID); + NotificationHelper.showInfo(null, "Plugin installed successfully! Now enjoy it~
For more information, visit here."); } @Override public void beforePluginUnload(@NotNull IdeaPluginDescriptor pluginDescriptor, boolean isUpdate) { + if (!PluginHelper.myself(pluginDescriptor)) { + return; + } + + Disposer.dispose(AppActivationListener.getInstance()); + Disposer.dispose(AppEventListener.getInstance()); MainToolWindowFactory.unregisterAll(); } } diff --git a/src/main/java/io/zhile/research/intellij/ier/tw/MainToolWindowFactory.java b/src/main/java/io/zhile/research/intellij/ier/tw/MainToolWindowFactory.java index ad0ca04..38387c4 100644 --- a/src/main/java/io/zhile/research/intellij/ier/tw/MainToolWindowFactory.java +++ b/src/main/java/io/zhile/research/intellij/ier/tw/MainToolWindowFactory.java @@ -17,6 +17,7 @@ public class MainToolWindowFactory implements ToolWindowFactory, DumbAware { public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { MainForm mainForm = new MainForm(null); Content content = ContentFactory.SERVICE.getInstance().createContent(mainForm.getContent(), "", true); + content.setDisposer(mainForm); toolWindow.getContentManager().addContent(content); } diff --git a/src/main/java/io/zhile/research/intellij/ier/ui/dialog/MainDialog.java b/src/main/java/io/zhile/research/intellij/ier/ui/dialog/MainDialog.java index 8a87e7f..f79db5f 100644 --- a/src/main/java/io/zhile/research/intellij/ier/ui/dialog/MainDialog.java +++ b/src/main/java/io/zhile/research/intellij/ier/ui/dialog/MainDialog.java @@ -12,7 +12,6 @@ public class MainDialog extends DialogWrapper { setTitle(title); } - @Override protected JComponent createCenterPanel() { MainForm mainForm = new MainForm(this); diff --git a/src/main/java/io/zhile/research/intellij/ier/ui/form/MainForm.java b/src/main/java/io/zhile/research/intellij/ier/ui/form/MainForm.java index 0eb30cf..c3fd24f 100644 --- a/src/main/java/io/zhile/research/intellij/ier/ui/form/MainForm.java +++ b/src/main/java/io/zhile/research/intellij/ier/ui/form/MainForm.java @@ -1,21 +1,23 @@ package io.zhile.research.intellij.ier.ui.form; import com.intellij.icons.AllIcons; -import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.Disposable; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Disposer; import io.zhile.research.intellij.ier.common.EvalRecord; import io.zhile.research.intellij.ier.common.Resetter; -import io.zhile.research.intellij.ier.component.ResetTimer; +import io.zhile.research.intellij.ier.helper.AppHelper; import io.zhile.research.intellij.ier.helper.PluginHelper; -import io.zhile.research.intellij.ier.listener.AppEventListener; +import io.zhile.research.intellij.ier.helper.ResetTimeHelper; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.List; -public class MainForm { +public class MainForm implements Disposable { private JPanel rootPanel; private JButton btnReset; private JList lstMain; @@ -31,6 +33,9 @@ public class MainForm { public MainForm(DialogWrapper dialogWrapper) { this.dialogWrapper = dialogWrapper; + if (dialogWrapper != null) { + Disposer.register(dialogWrapper.getDisposable(), this); + } } public JPanel getContent() { @@ -77,7 +82,7 @@ public class MainForm { } private void reloadLastResetTime() { - lblLastResetTime.setText(ResetTimer.getLastResetTimeStr()); + lblLastResetTime.setText(ResetTimeHelper.getLastResetTimeStr()); } private void reloadRecordItems() { @@ -95,24 +100,29 @@ public class MainForm { } Resetter.reset(Resetter.getEvalRecords()); - ResetTimer.resetLastResetTime(); + ResetTimeHelper.resetLastResetTime(); listModel.clear(); if (null != dialogWrapper) { dialogWrapper.close(0); } - AppEventListener.disable(); - ApplicationManager.getApplication().invokeLater(new Runnable() { - @Override - public void run() { - ApplicationManager.getApplication().restart(); - } - }); + AppHelper.restart(); } private static void boldFont(Component component) { Font font = component.getFont(); component.setFont(font.deriveFont(font.getStyle() | Font.BOLD)); } + + @Override + public void dispose() { + for (AbstractButton button : new AbstractButton[]{chkResetAuto, btnReload, btnReset}) { + for (ActionListener listener : button.getActionListeners()) { + button.removeActionListener(listener); + } + } + + rootPanel.removeAll(); + } } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 0a7bfd3..0f685ca 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -5,7 +5,10 @@- Click "Help" menu and select "Eval Reset" + Click "Help" menu and select "Eval Reset"
++ Need Help? +
]]>com.intellij.modules.ultimate @@ -16,6 +19,8 @@+