package com.igormaznitsa.ideamindmap.utils; import static com.intellij.openapi.ui.playback.PlaybackRunner.StatusCallback.Type.message; import com.igormaznitsa.commons.version.Version; import com.igormaznitsa.mindmap.model.logger.Logger; import com.igormaznitsa.mindmap.model.logger.LoggerFactory; import com.igormaznitsa.mindmap.swing.ide.IDEBridge; import com.igormaznitsa.mindmap.swing.ide.NotificationType; import com.intellij.notification.Notification; import com.intellij.notification.NotificationDisplayType; import com.intellij.notification.NotificationGroup; import com.intellij.notification.Notifications; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationInfo; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.IconLoader; import org.apache.commons.lang.StringEscapeUtils; import org.jetbrains.annotations.Nullable; import javax.annotation.Nonnull; import javax.swing.Icon; public class IdeaIDEBridge implements IDEBridge { private final Version ideVersion; private static final Logger LOGGER = LoggerFactory.getLogger(IdeaIDEBridge.class); private static final NotificationGroup MMD_GROUP = new NotificationGroup("IDEA MindMap",NotificationDisplayType.BALLOON,true); public IdeaIDEBridge() { final ApplicationInfo info = ApplicationInfo.getInstance(); final long major = safeNumberExtraction(info.getMajorVersion()); final long minor = safeNumberExtraction(info.getMinorVersion()); final long micro = safeNumberExtraction(IdeaUtils.safeInvokeMethodForResult(info, "0","getMicroVersion",new Class<?>[0],new Object[0])); this.ideVersion = new Version("intellij", new long[] { major, minor, micro }, info.getVersionName()); } private static long safeNumberExtraction(final String data) { if (data == null) return 0L; final StringBuilder buffer = new StringBuilder(); for (final char c : data.toCharArray()) { if (Character.isDigit(c)) buffer.append(c); } try { return Long.parseLong(buffer.toString()); } catch (NumberFormatException ex) { return 0L; } } @Nonnull @Override public Version getIDEVersion() { return this.ideVersion; } @Override public void showIDENotification(@Nonnull final String title, @Nonnull final String text, @Nonnull final NotificationType type) { final com.intellij.notification.NotificationType ideType; switch (type) { case INFO: { ideType = com.intellij.notification.NotificationType.INFORMATION; LOGGER.info("{INFO}IDENotification : (" + title + ") " + message); } break; case WARNING: { ideType = com.intellij.notification.NotificationType.WARNING; LOGGER.warn("{WARN}IDENotification : (" + title + ") " + message); } break; case ERROR: { ideType = com.intellij.notification.NotificationType.ERROR; LOGGER.warn("{ERROR}IDENotification : (" + title + ") " + message); } break; default: { ideType = com.intellij.notification.NotificationType.WARNING; LOGGER.warn("{*****}IDENotification : (" + title + ") " + message); } break; } ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { final long timestamp = System.currentTimeMillis(); final Notification notification = new Notification(MMD_GROUP.getDisplayId(),StringEscapeUtils.escapeHtml(title), StringEscapeUtils.escapeHtml(text), ideType){ @Nullable @Override public Icon getIcon() { return AllIcons.Logo.MINDMAP; } public long getTimestamp() { return timestamp; } }; Notifications.Bus.notify(notification); } }); } @Override public void notifyRestart() { LOGGER.info("Request to restart IDE"); final Application application = ApplicationManager.getApplication(); application.restart(); } @Nonnull @Override public Icon loadIcon(@Nonnull final String path, @Nonnull final Class<?> klazz) { return IconLoader.getIcon(path,klazz); } }