Update label text for Memory View when classes are not loaded
authorVitaliy.Bibaev <vitaliy.bibaev@jetbrains.com>
Mon, 26 Mar 2018 16:15:45 +0000 (19:15 +0300)
committerVitaliy.Bibaev <vitaliy.bibaev@jetbrains.com>
Tue, 27 Mar 2018 09:11:27 +0000 (12:11 +0300)
java/debugger/impl/src/com/intellij/debugger/memory/ui/ClassesFilteredView.java
java/debugger/impl/src/com/intellij/debugger/memory/ui/ClassesTable.java

index 9d891f6cd060125947789b0d2b5ff3a7dcc08ab1..d147d3356f78974a50f6e30534a6effd9244d2b8 100644 (file)
@@ -66,7 +66,6 @@ public class ClassesFilteredView extends BorderLayoutPanel implements Disposable
   private static final int DEFAULT_BATCH_SIZE = Integer.MAX_VALUE;
   private static final String EMPTY_TABLE_CONTENT_WHEN_RUNNING = "The application is running";
   private static final String EMPTY_TABLE_CONTENT_WHEN_STOPPED = "Classes are not available";
-  private static final String CLICKABLE_TABLE_CONTENT = "Click to load the classes list";
 
   private final Project myProject;
   private final SingleAlarmWithMutableDelay mySingleAlarm;
@@ -405,7 +404,7 @@ public class ClassesFilteredView extends BorderLayoutPanel implements Disposable
 
   private void makeTableClickable() {
     ApplicationManager.getApplication().invokeLater(
-      () -> myTable.makeClickable(CLICKABLE_TABLE_CONTENT, () -> updateClassesAndCounts(true)));
+      () -> myTable.makeClickable(() -> updateClassesAndCounts(true)));
   }
 
   private void doPause() {
index a723fa10c3cc85b370b06b98914a5d1246a7c4bc..19fa8594782a06c86eea937501acdd04fd9b03f1 100644 (file)
@@ -9,8 +9,7 @@ import com.intellij.debugger.memory.utils.AbstractTableModelWithColumns;
 import com.intellij.debugger.memory.utils.InstancesProvider;
 import com.intellij.icons.AllIcons;
 import com.intellij.openapi.Disposable;
-import com.intellij.openapi.actionSystem.DataKey;
-import com.intellij.openapi.actionSystem.DataProvider;
+import com.intellij.openapi.actionSystem.*;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.util.TextRange;
 import com.intellij.psi.codeStyle.MinusculeMatcher;
@@ -35,6 +34,7 @@ import javax.swing.table.TableColumn;
 import javax.swing.table.TableColumnModel;
 import javax.swing.table.TableRowSorter;
 import java.awt.*;
+import java.awt.event.InputEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
@@ -53,6 +53,12 @@ public class ClassesTable extends JBTable implements DataProvider, Disposable {
   private static final JBColor CLICKABLE_COLOR = new JBColor(new Color(250, 251, 252), new Color(62, 66, 69));
   private static final String DEFAULT_EMPTY_TEXT = "Nothing to show";
 
+  private static final SimpleTextAttributes LINK_ATTRIBUTES =
+    new SimpleTextAttributes(SimpleTextAttributes.STYLE_PLAIN, SimpleTextAttributes.LINK_ATTRIBUTES.getFgColor());
+  private static final SimpleTextAttributes UNDERLINE_LINK_ATTRIBUTES = SimpleTextAttributes.LINK_ATTRIBUTES;
+  private static final String NO_LOADED_CLASSES_MESSAGE = "No classes loaded.";
+  private static final String LOAD_CLASS_LINK = "Load classes";
+
   private static final int CLASSES_COLUMN_PREFERRED_WIDTH = 250;
   private static final int COUNT_COLUMN_MIN_WIDTH = 80;
   private static final int DIFF_COLUMN_MIN_WIDTH = 80;
@@ -182,15 +188,21 @@ public class ClassesTable extends JBTable implements DataProvider, Disposable {
     return myMouseListener != null;
   }
 
-  void makeClickable(@NotNull String text, @NotNull Runnable onClick) {
+  void makeClickable(@NotNull Runnable onClick) {
     releaseMouseListener();
-    getEmptyText().setText(text);
 
-    if (!ApplicationManager.getApplication().isUnitTestMode() && getMousePosition() != null) {
-      setBackground(CLICKABLE_COLOR);
-    }
+    AnAction action = new AnAction() {
+      @Override
+      public void actionPerformed(AnActionEvent e) {
+        onClick.run();
+        releaseMouseListener();
+      }
+    };
 
-    myMouseListener = new MouseAdapter() {
+    KeyboardShortcut shortcut = new KeyboardShortcut(KeyStroke.getKeyStroke('l', InputEvent.SHIFT_DOWN_MASK), null);
+    action.registerCustomShortcutSet(new CustomShortcutSet(shortcut), null);
+
+    MyMouseAdapter listener = new MyMouseAdapter() {
       @Override
       public void mouseClicked(MouseEvent e) {
         onClick.run();
@@ -199,19 +211,36 @@ public class ClassesTable extends JBTable implements DataProvider, Disposable {
 
       @Override
       public void mouseEntered(MouseEvent e) {
-        setBackground(CLICKABLE_COLOR);
+        updateTable(true);
       }
 
       @Override
       public void mouseExited(MouseEvent e) {
-        setBackground(JBColor.background());
+        updateTable(false);
+      }
+
+      @Override
+      void updateTable(boolean mouseOnTable) {
+        setBackground(mouseOnTable ? CLICKABLE_COLOR : JBColor.background());
+        SimpleTextAttributes linkAttributes = mouseOnTable ? UNDERLINE_LINK_ATTRIBUTES : LINK_ATTRIBUTES;
+        getEmptyText().clear()
+                      .appendText(NO_LOADED_CLASSES_MESSAGE).appendText(" ")
+                      .appendText(LOAD_CLASS_LINK, linkAttributes).appendText(" ");
       }
     };
 
+    boolean mouseOnTable = !ApplicationManager.getApplication().isUnitTestMode() && getMousePosition() != null;
+    listener.updateTable(mouseOnTable);
+
+    myMouseListener = listener;
     addMouseListener(myMouseListener);
     setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
   }
 
+  private abstract static class MyMouseAdapter extends MouseAdapter {
+    abstract void updateTable(boolean mouseOnTable);
+  }
+
   void exitClickableMode() {
     releaseMouseListener();
     getEmptyText().setText(DEFAULT_EMPTY_TEXT);