PY-19960 PY-14096 Merge right-click menu creation for toggle output and split/merge...
authorValentina Kiryushkina <valentina.kiryushkina@jetbrains.com>
Thu, 20 Oct 2016 14:56:30 +0000 (17:56 +0300)
committerValentina Kiryushkina <valentina.kiryushkina@jetbrains.com>
Mon, 24 Oct 2016 17:09:50 +0000 (20:09 +0300)
python/ipnb/src/org/jetbrains/plugins/ipnb/editor/actions/IpnbHideOutputAction.java [new file with mode: 0644]
python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/IpnbEditablePanel.java
python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/IpnbPanel.java
python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbCodeOutputPanel.java
python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbCodePanel.java
python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbCodeSourcePanel.java
python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbErrorPanel.java
python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbHtmlPanel.java
python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbImagePanel.java
python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbLatexPanel.java
python/ipnb/src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbStreamPanel.java

diff --git a/python/ipnb/src/org/jetbrains/plugins/ipnb/editor/actions/IpnbHideOutputAction.java b/python/ipnb/src/org/jetbrains/plugins/ipnb/editor/actions/IpnbHideOutputAction.java
new file mode 100644 (file)
index 0000000..3875c5e
--- /dev/null
@@ -0,0 +1,20 @@
+package org.jetbrains.plugins.ipnb.editor.actions;
+
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.plugins.ipnb.editor.panels.code.IpnbCodePanel;
+
+public class IpnbHideOutputAction extends AnAction {
+  private IpnbCodePanel myParent;
+
+  public IpnbHideOutputAction(@NotNull IpnbCodePanel parent) {
+    super("Toggle Output Button (Double-Click)");
+    myParent = parent;
+  }
+
+  @Override
+  public void actionPerformed(AnActionEvent e) {
+    myParent.hideOutputPanel();
+  }
+}
index 8944b50387772c0939cf8e80b2915884ddecf885..01fd4092e342f1b44ddfedf8610aaadae1e0cf33 100644 (file)
@@ -1,10 +1,7 @@
 package org.jetbrains.plugins.ipnb.editor.panels;
 
-import com.intellij.ide.DataManager;
-import com.intellij.openapi.actionSystem.DataContext;
 import com.intellij.openapi.actionSystem.DefaultActionGroup;
 import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.ui.popup.JBPopupFactory;
 import com.intellij.openapi.ui.popup.ListPopup;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.ui.JBColor;
@@ -216,13 +213,14 @@ public abstract class IpnbEditablePanel<T extends JComponent, K extends IpnbEdit
     return (myEditing && myEditablePanel != null) ? myEditablePanel.getCaretPosition() : -1;
   }
 
-  public void addRightClickMenu() {
+  @Override
+  protected void addRightClickMenu() {
     myViewPanel.addMouseListener(new MouseAdapter() {
       @Override
       public void mousePressed(MouseEvent e) {
         if (SwingUtilities.isRightMouseButton(e) && e.getClickCount() == 1) {
           final DefaultActionGroup group = new DefaultActionGroup(new IpnbMergeCellAboveAction(), new IpnbMergeCellBelowAction());
-          final ListPopup menu = createClickMenu(group);
+          final ListPopup menu = createPopupMenu(group);
           menu.show(RelativePoint.fromScreen(e.getLocationOnScreen()));
         }
       }
@@ -232,18 +230,14 @@ public abstract class IpnbEditablePanel<T extends JComponent, K extends IpnbEdit
       public void mousePressed(MouseEvent e) {
         if (SwingUtilities.isRightMouseButton(e) && e.getClickCount() == 1) {
           final DefaultActionGroup group = new DefaultActionGroup(new IpnbSplitCellAction());
-          final ListPopup menu = createClickMenu(group);
+          final ListPopup menu = createPopupMenu(group);
           menu.show(RelativePoint.fromScreen(e.getLocationOnScreen()));
         }
       }
     });
   }
 
-  protected ListPopup createClickMenu(@NotNull DefaultActionGroup group) {
-    final DataContext context = DataManager.getInstance().getDataContext(this);
-    return JBPopupFactory.getInstance().createActionGroupPopup(null, group, context, JBPopupFactory.ActionSelectionAid.MNEMONICS,
-                                                               false);
-  }
+  
 
   @Nullable
   public String getText(int from, int to) {
index 06dd4b5e07bb33467be7139accaf26d599ba49e1..e6c569bf3a4f3de4f29f9f20963627c06187aa09 100644 (file)
@@ -1,5 +1,10 @@
 package org.jetbrains.plugins.ipnb.editor.panels;
 
+import com.intellij.ide.DataManager;
+import com.intellij.openapi.actionSystem.DataContext;
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
+import com.intellij.openapi.ui.popup.JBPopupFactory;
+import com.intellij.openapi.ui.popup.ListPopup;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.plugins.ipnb.format.cells.IpnbCell;
 
@@ -24,5 +29,13 @@ public abstract class IpnbPanel<T extends JComponent, K extends IpnbCell> extend
     return myCell;
   }
 
+  public ListPopup createPopupMenu(@NotNull DefaultActionGroup group) {
+    final DataContext context = DataManager.getInstance().getDataContext(this);
+    return JBPopupFactory.getInstance().createActionGroupPopup(null, group, context, JBPopupFactory.ActionSelectionAid.MNEMONICS,
+                                                               false);
+  }
+
   protected abstract T createViewPanel();
+  
+  protected abstract void addRightClickMenu();
 }
index c67b9e36c701d2beb46338f6a4a43d1d28063492..f0c1ec421860367183f00780486bdc57e35a2a2e 100644 (file)
@@ -1,26 +1,34 @@
 package org.jetbrains.plugins.ipnb.editor.panels.code;
 
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
 import com.intellij.openapi.editor.colors.EditorColorsManager;
+import com.intellij.openapi.ui.popup.ListPopup;
+import com.intellij.ui.awt.RelativePoint;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.plugins.ipnb.editor.IpnbEditorUtil;
+import org.jetbrains.plugins.ipnb.editor.actions.IpnbHideOutputAction;
 import org.jetbrains.plugins.ipnb.editor.panels.IpnbFilePanel;
 import org.jetbrains.plugins.ipnb.editor.panels.IpnbPanel;
 import org.jetbrains.plugins.ipnb.format.cells.output.IpnbOutputCell;
 
 import javax.swing.*;
 import java.awt.*;
-import java.awt.event.MouseListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 
 public class IpnbCodeOutputPanel<K extends IpnbOutputCell> extends IpnbPanel<JComponent, K> {
   protected final IpnbFilePanel myParent;
+  private final IpnbCodePanel myCodePanel;
 
-  public IpnbCodeOutputPanel(@NotNull final K cell, @Nullable final IpnbFilePanel parent, @Nullable final MouseListener hideOutputAdapter) {
+  public IpnbCodeOutputPanel(@NotNull final K cell, @Nullable final IpnbFilePanel parent, @Nullable final IpnbCodePanel codePanel) {
     super(cell, new BorderLayout());
     myParent = parent;
     myViewPanel = createViewPanel();
     add(myViewPanel);
-    addHideOutputListener(hideOutputAdapter);
+    myCodePanel = codePanel;
+    myViewPanel.addMouseListener(createHideOutputListener());
+    addRightClickMenu();
   }
 
   protected JComponent createViewPanel() {
@@ -33,8 +41,30 @@ public class IpnbCodeOutputPanel<K extends IpnbOutputCell> extends IpnbPanel<JCo
     textArea.setBackground(IpnbEditorUtil.getBackground());
     return textArea;
   }
+  
+  @Override
+  public void addRightClickMenu() {
+    myViewPanel.addMouseListener(new MouseAdapter() {
+      @Override
+      public void mousePressed(MouseEvent e) {
+        if (SwingUtilities.isRightMouseButton(e) && e.getClickCount() == 1) {
+          final ListPopup menu = createPopupMenu(new DefaultActionGroup(new IpnbHideOutputAction(myCodePanel)));
+          menu.show(RelativePoint.fromScreen(e.getLocationOnScreen()));
+        }
+      }
+    });
+  }
+
+  @NotNull
+  private MouseAdapter createHideOutputListener() {
+    return new MouseAdapter() {
 
-  public void addHideOutputListener(@Nullable final MouseListener mouseAdapter) {
-    myViewPanel.addMouseListener(mouseAdapter);
+      @Override
+      public void mouseClicked(MouseEvent e) {
+        if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
+          myCodePanel.hideOutputPanel();
+        }
+      }
+    };
   }
 }
index 30df4bab3ed93abd0d9678e75a26a9e43643bc6b..17e51accea07cca90c5b05df206d94d98b984242 100644 (file)
@@ -8,8 +8,6 @@ import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.application.ModalityState;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.editor.Editor;
-import com.intellij.openapi.editor.event.EditorMouseAdapter;
-import com.intellij.openapi.editor.event.EditorMouseEvent;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.VerticalFlowLayout;
 import com.intellij.openapi.ui.popup.ListPopup;
@@ -23,9 +21,7 @@ import org.jetbrains.annotations.Nullable;
 import org.jetbrains.plugins.ipnb.configuration.IpnbConnectionManager;
 import org.jetbrains.plugins.ipnb.editor.IpnbEditorUtil;
 import org.jetbrains.plugins.ipnb.editor.IpnbFileEditor;
-import org.jetbrains.plugins.ipnb.editor.actions.IpnbMergeCellAboveAction;
-import org.jetbrains.plugins.ipnb.editor.actions.IpnbMergeCellBelowAction;
-import org.jetbrains.plugins.ipnb.editor.actions.IpnbSplitCellAction;
+import org.jetbrains.plugins.ipnb.editor.actions.IpnbHideOutputAction;
 import org.jetbrains.plugins.ipnb.editor.panels.IpnbEditablePanel;
 import org.jetbrains.plugins.ipnb.editor.panels.IpnbFilePanel;
 import org.jetbrains.plugins.ipnb.editor.panels.IpnbPanel;
@@ -34,8 +30,6 @@ import org.jetbrains.plugins.ipnb.format.cells.output.*;
 
 import javax.swing.*;
 import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.util.Arrays;
@@ -48,6 +42,7 @@ public class IpnbCodePanel extends IpnbEditablePanel<JComponent, IpnbCodeCell> {
   private final static String COLLAPSED_METADATA = "collapsed";
   private IpnbCodeSourcePanel myCodeSourcePanel;
   private final List<IpnbPanel> myOutputPanels = Lists.newArrayList();
+  private HideableOutputPanel myHideableOutputPanel;
   private boolean mySelectNext;
 
   public IpnbCodePanel(@NotNull final Project project, @NotNull final IpnbFileEditor parent, @NotNull final IpnbCodeCell cell) {
@@ -83,26 +78,52 @@ public class IpnbCodePanel extends IpnbEditablePanel<JComponent, IpnbCodeCell> {
     final JPanel panel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP));
     panel.setBackground(IpnbEditorUtil.getBackground());
     panel.add(createCodeComponent());
-    panel.add(createHideableOutputPanel());
+    myHideableOutputPanel = new HideableOutputPanel();
+    panel.add(myHideableOutputPanel);
 
     return panel;
   }
 
   @Override
-  public void addRightClickMenu() {
-    myCodeSourcePanel.addMouseListener(new EditorMouseAdapter() {
+  protected void addRightClickMenu() {
+    myHideableOutputPanel.addMouseListener(new MouseAdapter() {
       @Override
-      public void mousePressed(EditorMouseEvent e) {
-        final MouseEvent mouseEvent = e.getMouseEvent();
-        if (SwingUtilities.isRightMouseButton(mouseEvent) && mouseEvent.getClickCount() == 1) {
-          final ListPopup menu = createClickMenu(new DefaultActionGroup(new IpnbMergeCellAboveAction(), new IpnbMergeCellBelowAction(),
-                                                                        new IpnbSplitCellAction()));
-          menu.show(RelativePoint.fromScreen(e.getMouseEvent().getLocationOnScreen()));
+      public void mousePressed(MouseEvent e) {
+        if (SwingUtilities.isRightMouseButton(e) && e.getClickCount() == 1) {
+          final ListPopup menu = createPopupMenu(new DefaultActionGroup(new IpnbHideOutputAction(IpnbCodePanel.this)));
+          menu.show(RelativePoint.fromScreen(e.getLocationOnScreen()));
         }
       }
     });
   }
 
+  class HideableOutputPanel extends OnePixelSplitter{
+    final JPanel myToggleBar;
+    final JPanel myOutputComponent;
+
+    public HideableOutputPanel() {
+      super(true);
+      myToggleBar = createToggleBar(this);
+      myOutputComponent = createOutputPanel();
+
+      final Map<String, Object> metadata = myCell.getMetadata();
+      if (metadata.containsKey(COLLAPSED_METADATA)) {
+        final boolean isCollapsed = (Boolean)metadata.get(COLLAPSED_METADATA);
+        if (isCollapsed && !myCell.getCellOutputs().isEmpty()) {
+          setFirstComponent(myToggleBar);
+          return;
+        }
+      }
+      setSecondComponent(myOutputComponent);
+    }
+    
+    public void hideOutputPanel() {
+      setOutputStateInCell(true);
+      setFirstComponent(myToggleBar);
+      setSecondComponent(null);
+    }
+  }
+  
   @NotNull
   private JPanel createCodeComponent() {
     myCodeSourcePanel = new IpnbCodeSourcePanel(myProject, this, myCell);
@@ -116,76 +137,22 @@ public class IpnbCodePanel extends IpnbEditablePanel<JComponent, IpnbCodeCell> {
     return topComponent;
   }
 
-  public JPanel createHideableOutputPanel() {
-    final OnePixelSplitter splitter = new OnePixelSplitter(true);
-    final JPanel toggleBar = createToggleBar(splitter);
-    final JPanel outputComponent = createOutputPanel(createHideOutputListener(splitter, toggleBar));
-
-    final Map<String, Object> metadata = myCell.getMetadata();
-    if (metadata.containsKey(COLLAPSED_METADATA)) {
-      final boolean isCollapsed = (Boolean)metadata.get(COLLAPSED_METADATA);
-      if (isCollapsed && !myCell.getCellOutputs().isEmpty()) {
-        splitter.setFirstComponent(toggleBar);
-        return splitter;
-      }
-    }
-    splitter.setSecondComponent(outputComponent);
-
-    return splitter;
-  }
-
   @NotNull
-  private JPanel createOutputPanel(MouseAdapter hideOutputListener) {
+  private JPanel createOutputPanel() {
     final JPanel outputPanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, true, false));
     outputPanel.setBackground(IpnbEditorUtil.getBackground());
 
     for (IpnbOutputCell outputCell : myCell.getCellOutputs()) {
-      addOutputPanel(outputPanel, outputCell, hideOutputListener, true);
-    }
-
-    if (!myCell.getCellOutputs().isEmpty()) {
-      outputPanel.addMouseListener(hideOutputListener);
+      addOutputPanel(outputPanel, outputCell, this, true);
     }
 
     return outputPanel;
   }
 
-  @NotNull
-  private MouseAdapter createHideOutputListener(final OnePixelSplitter splitter, final JPanel toggleBar) {
-    return new MouseAdapter() {
-      private static final String TOGGLE_OUTPUT_TEXT = " Toggle output                                                (Double-Click)";
-
-      @Override
-      public void mouseClicked(MouseEvent e) {
-        if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
-          hideOutputPanel();
-        }
-      }
+  
 
-      @Override
-      public void mousePressed(MouseEvent e) {
-        if (SwingUtilities.isRightMouseButton(e) && e.getClickCount() == 1) {
-          final JPopupMenu menu = new JPopupMenu("");
-
-          final JMenuItem item = new JMenuItem(TOGGLE_OUTPUT_TEXT);
-          item.addActionListener(new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-              hideOutputPanel();
-            }
-          });
-
-          menu.add(item);
-          menu.show(e.getComponent(), e.getX(), e.getY());
-        }
-      }
-
-      private void hideOutputPanel() {
-        setOutputStateInCell(true);
-        splitter.setFirstComponent(toggleBar);
-        splitter.setSecondComponent(null);
-      }
-    };
+  public void hideOutputPanel() {
+    myHideableOutputPanel.hideOutputPanel();
   }
 
   @NotNull
@@ -217,7 +184,7 @@ public class IpnbCodePanel extends IpnbEditablePanel<JComponent, IpnbCodeCell> {
         setOutputStateInCell(false);
         updateBackground(IpnbEditorUtil.getBackground());
         splitter.setFirstComponent(null);
-        final JPanel outputPanel = createOutputPanel(createHideOutputListener(splitter, IpnbCodePanel.this.createToggleBar(splitter)));
+        final JPanel outputPanel = createOutputPanel();
         splitter.setSecondComponent(outputPanel);
       }
     };
@@ -241,33 +208,33 @@ public class IpnbCodePanel extends IpnbEditablePanel<JComponent, IpnbCodeCell> {
   }
 
   private void addOutputPanel(@NotNull final JComponent mainPanel,
-                              @NotNull final IpnbOutputCell outputCell, MouseAdapter hideOutputListener, boolean addPrompt) {
+                              @NotNull final IpnbOutputCell outputCell, IpnbCodePanel ipnbCodePanel, boolean addPrompt) {
     final IpnbEditorUtil.PromptType promptType = addPrompt ? IpnbEditorUtil.PromptType.Out : IpnbEditorUtil.PromptType.None;
     final JPanel panel = new JPanel(new GridBagLayout());
     panel.setBackground(IpnbEditorUtil.getBackground());
     if (outputCell instanceof IpnbImageOutputCell) {
       addPromptPanel(panel, myCell.getPromptNumber(), promptType,
-                     new IpnbImagePanel((IpnbImageOutputCell)outputCell, hideOutputListener));
+                     new IpnbImagePanel((IpnbImageOutputCell)outputCell, ipnbCodePanel));
     }
     else if (outputCell instanceof IpnbHtmlOutputCell) {
       addPromptPanel(panel, myCell.getPromptNumber(), promptType,
-                     new IpnbHtmlPanel((IpnbHtmlOutputCell)outputCell, myParent.getIpnbFilePanel(), hideOutputListener));
+                     new IpnbHtmlPanel((IpnbHtmlOutputCell)outputCell, myParent.getIpnbFilePanel(), ipnbCodePanel));
     }
     else if (outputCell instanceof IpnbLatexOutputCell) {
       addPromptPanel(panel, myCell.getPromptNumber(), promptType,
-                     new IpnbLatexPanel((IpnbLatexOutputCell)outputCell, myParent.getIpnbFilePanel(), hideOutputListener));
+                     new IpnbLatexPanel((IpnbLatexOutputCell)outputCell, myParent.getIpnbFilePanel(), ipnbCodePanel));
     }
     else if (outputCell instanceof IpnbErrorOutputCell) {
       addPromptPanel(panel, myCell.getPromptNumber(), promptType,
-                     new IpnbErrorPanel((IpnbErrorOutputCell)outputCell, hideOutputListener));
+                     new IpnbErrorPanel((IpnbErrorOutputCell)outputCell, ipnbCodePanel));
     }
     else if (outputCell instanceof IpnbStreamOutputCell) {
       addPromptPanel(panel, myCell.getPromptNumber(), IpnbEditorUtil.PromptType.None,
-                     new IpnbStreamPanel((IpnbStreamOutputCell)outputCell, hideOutputListener));
+                     new IpnbStreamPanel((IpnbStreamOutputCell)outputCell, ipnbCodePanel));
     }
     else if (outputCell.getSourceAsString() != null) {
       addPromptPanel(panel, myCell.getPromptNumber(), promptType,
-                     new IpnbCodeOutputPanel<>(outputCell, myParent.getIpnbFilePanel(), hideOutputListener));
+                     new IpnbCodeOutputPanel<>(outputCell, myParent.getIpnbFilePanel(), ipnbCodePanel));
     }
     mainPanel.add(panel);
   }
index c881d7f142bb07581a4f1256f1e046b6d6f2faee..e9d73afddc85ad5c7268a5272ef0d9790b700e23 100644 (file)
  */
 package org.jetbrains.plugins.ipnb.editor.panels.code;
 
+import com.intellij.ide.DataManager;
 import com.intellij.openapi.Disposable;
 import com.intellij.openapi.actionSystem.CustomShortcutSet;
+import com.intellij.openapi.actionSystem.DataContext;
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.editor.EditorFactory;
+import com.intellij.openapi.editor.event.EditorMouseAdapter;
+import com.intellij.openapi.editor.event.EditorMouseEvent;
 import com.intellij.openapi.editor.event.EditorMouseListener;
 import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.popup.JBPopupFactory;
+import com.intellij.openapi.ui.popup.ListPopup;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.ui.Gray;
+import com.intellij.ui.awt.RelativePoint;
 import com.intellij.ui.components.panels.HorizontalLayout;
 import com.intellij.util.ui.UIUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.plugins.ipnb.editor.IpnbEditorUtil;
 import org.jetbrains.plugins.ipnb.editor.IpnbFileEditor;
-import org.jetbrains.plugins.ipnb.editor.actions.IpnbRunCellAction;
-import org.jetbrains.plugins.ipnb.editor.actions.IpnbRunCellBaseAction;
-import org.jetbrains.plugins.ipnb.editor.actions.IpnbRunCellInplaceAction;
+import org.jetbrains.plugins.ipnb.editor.actions.*;
 import org.jetbrains.plugins.ipnb.editor.panels.IpnbEditorPanel;
 import org.jetbrains.plugins.ipnb.editor.panels.IpnbFilePanel;
 import org.jetbrains.plugins.ipnb.editor.panels.IpnbPanel;
@@ -56,6 +62,7 @@ public class IpnbCodeSourcePanel extends IpnbPanel<JComponent, IpnbCodeCell> imp
     mySource = cell.getSourceAsString();
     final JComponent panel = createViewPanel();
     add(panel);
+    addRightClickMenu();
   }
 
   public void addMouseListener(@NotNull final EditorMouseListener listener) {
@@ -194,4 +201,25 @@ public class IpnbCodeSourcePanel extends IpnbPanel<JComponent, IpnbCodeCell> imp
     });
     return panel;
   }
+
+  @Override
+  protected void addRightClickMenu() {
+    addMouseListener(new EditorMouseAdapter() {
+      @Override
+      public void mousePressed(EditorMouseEvent e) {
+        final MouseEvent mouseEvent = e.getMouseEvent();
+        if (SwingUtilities.isRightMouseButton(mouseEvent) && mouseEvent.getClickCount() == 1) {
+          final ListPopup menu = createPopupMenu(new DefaultActionGroup(new IpnbMergeCellAboveAction(), new IpnbMergeCellBelowAction(),
+                                                                        new IpnbSplitCellAction()));
+          menu.show(RelativePoint.fromScreen(e.getMouseEvent().getLocationOnScreen()));
+        }
+      }
+    });
+  }
+
+  public ListPopup createPopupMenu(@NotNull DefaultActionGroup group) {
+    final DataContext context = DataManager.getInstance().getDataContext(this);
+    return JBPopupFactory.getInstance().createActionGroupPopup(null, group, context, JBPopupFactory.ActionSelectionAid.MNEMONICS,
+                                                               false);
+  }
 }
index 4b5be5b887b1cac1eda6585074293ce88f78370b..b27a55d9d225c164e5df18b23b8b22d6ddd5812b 100644 (file)
@@ -14,12 +14,11 @@ import javax.swing.text.SimpleAttributeSet;
 import javax.swing.text.StyleConstants;
 import javax.swing.text.StyleContext;
 import java.awt.*;
-import java.awt.event.MouseAdapter;
 import java.util.List;
 
 public class IpnbErrorPanel extends IpnbCodeOutputPanel<IpnbErrorOutputCell> {
-  public IpnbErrorPanel(@NotNull final IpnbErrorOutputCell cell, @Nullable MouseAdapter hideOutputListener) {
-    super(cell, null, hideOutputListener);
+  public IpnbErrorPanel(@NotNull final IpnbErrorOutputCell cell, @Nullable IpnbCodePanel ipnbCodePanel) {
+    super(cell, null, ipnbCodePanel);
   }
 
   @Override
index 7d9265cffa532537819deb9b8acfca599b534093..35807f78f7b9c3600adf717c0fe28a8ecefa5e54 100644 (file)
@@ -8,13 +8,12 @@ import org.jetbrains.plugins.ipnb.editor.panels.IpnbFilePanel;
 import org.jetbrains.plugins.ipnb.format.cells.output.IpnbHtmlOutputCell;
 
 import javax.swing.*;
-import java.awt.event.MouseAdapter;
 
 public class IpnbHtmlPanel extends IpnbCodeOutputPanel<IpnbHtmlOutputCell> {
 
   public IpnbHtmlPanel(@NotNull final IpnbHtmlOutputCell cell, @NotNull final IpnbFilePanel parent,
-                       @Nullable MouseAdapter hideOutputListener) {
-    super(cell, parent, hideOutputListener);
+                       @Nullable IpnbCodePanel ipnbCodePanel) {
+    super(cell, parent, ipnbCodePanel);
   }
 
   @Override
index b9e72f2ff756ab4ef7715d5ac13a05f3fda13e02..49485892b34ab5576bbbbb728a22ffea6072034c 100644 (file)
@@ -11,15 +11,14 @@ import sun.misc.BASE64Decoder;
 
 import javax.imageio.ImageIO;
 import javax.swing.*;
-import java.awt.event.MouseAdapter;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
 
 public class IpnbImagePanel extends IpnbCodeOutputPanel<IpnbImageOutputCell> {
   private static final Logger LOG = Logger.getInstance(IpnbImagePanel.class);
 
-  public IpnbImagePanel(@NotNull final IpnbImageOutputCell cell, @Nullable MouseAdapter hideOutputListener) {
-    super(cell, null, hideOutputListener);
+  public IpnbImagePanel(@NotNull final IpnbImageOutputCell cell, @Nullable IpnbCodePanel ipnbCodePanel) {
+    super(cell, null, ipnbCodePanel);
   }
 
   @Override
index a5958cba9d826cf187a3e71457acf594870531ae..ddecc70018c2051c440a200e2cb0c9e1670dcbfd 100644 (file)
@@ -10,13 +10,12 @@ import org.jetbrains.plugins.ipnb.editor.panels.IpnbFilePanel;
 import org.jetbrains.plugins.ipnb.format.cells.output.IpnbLatexOutputCell;
 
 import javax.swing.*;
-import java.awt.event.MouseAdapter;
 
 public class IpnbLatexPanel extends IpnbCodeOutputPanel<IpnbLatexOutputCell> {
 
   public IpnbLatexPanel(@NotNull final IpnbLatexOutputCell cell, @NotNull final IpnbFilePanel parent,
-                        @Nullable MouseAdapter hideOutputListener) {
-    super(cell, parent, hideOutputListener);
+                        @Nullable IpnbCodePanel ipnbCodePanel) {
+    super(cell, parent, ipnbCodePanel);
     setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP));
     setBackground(IpnbEditorUtil.getBackground());
   }
index 07d57061c21b063a29b23829b05b195a8b7b4902..799d67295a3e4c99571a441836ff7f8de9f96a76 100644 (file)
@@ -6,11 +6,10 @@ import org.jetbrains.annotations.Nullable;
 import org.jetbrains.plugins.ipnb.format.cells.output.IpnbStreamOutputCell;
 
 import javax.swing.*;
-import java.awt.event.MouseAdapter;
 
 public class IpnbStreamPanel extends IpnbCodeOutputPanel<IpnbStreamOutputCell> {
-  public IpnbStreamPanel(@NotNull final IpnbStreamOutputCell cell, @Nullable MouseAdapter hideOutputListener) {
-    super(cell, null, hideOutputListener);
+  public IpnbStreamPanel(@NotNull final IpnbStreamOutputCell cell, @Nullable IpnbCodePanel ipnbCodePanel) {
+    super(cell, null, ipnbCodePanel);
   }
 
   @Override