protected JComponent createViewPanel()

in src/org/jetbrains/plugins/ipnb/editor/panels/code/IpnbCodeSourcePanel.java [73:179]


  protected JComponent createViewPanel() {
    final JPanel panel = new JPanel(new BorderLayout());
    panel.setBackground(UIUtil.isUnderDarcula() ? IpnbEditorUtil.getBackground() : Gray._247);

    myEditor = IpnbEditorUtil.createPythonCodeEditor(myProject, this);
    final IpnbCodePanel codePanel = getIpnbCodePanel();
    final JComponent component = myEditor.getComponent();
    final JComponent contentComponent = myEditor.getContentComponent();

    new IpnbRunCellAction(codePanel.getFileEditor()).registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke("shift ENTER")), contentComponent);
    new IpnbRunCellInplaceAction(codePanel.getFileEditor()).registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke("ctrl ENTER")), contentComponent);

    contentComponent.addKeyListener(new KeyAdapter() {
      @Override
      public void keyPressed(KeyEvent e) {
        final int keyCode = e.getKeyCode();
        final Container parent = codePanel.getParent();
        if (keyCode == KeyEvent.VK_ESCAPE && parent instanceof IpnbFilePanel) {
          getIpnbCodePanel().setEditing(false);
          IdeFocusManager.getGlobalInstance().requestFocus(getIpnbCodePanel().getFileEditor().getIpnbFilePanel(), true);
        }
      }

      private void updateVisibleArea(boolean up) {
        final IpnbFileEditor fileEditor = codePanel.getFileEditor();
        final IpnbFilePanel ipnbPanel = fileEditor.getIpnbFilePanel();
        final Rectangle rect = ipnbPanel.getVisibleRect();

        final Rectangle cellBounds = IpnbCodeSourcePanel.this.getIpnbCodePanel().getBounds();
        final JScrollPane scrollPane = fileEditor.getScrollPane();

        final int y = cellBounds.y + myEditor.visualPositionToXY(myEditor.getCaretModel().getVisualPosition()).y;
        int delta = myEditor.getLineHeight() * 2;
        if (y <= rect.getY() && up) {
          scrollPane.getVerticalScrollBar().setValue(y);
        }
        if (y + delta > rect.getY() + rect.getHeight() && !up) {
          scrollPane.getVerticalScrollBar().setValue(y - rect.height + delta);
        }
      }

      @Override
      public void keyReleased(KeyEvent e) {
        final int keyCode = e.getKeyCode();
        final Container parent = codePanel.getParent();

        final int height = myEditor.getLineHeight() * Math.max(myEditor.getDocument().getLineCount(), 1) + 10;
        contentComponent.setPreferredSize(new Dimension(parent.getWidth() - 300, height));
        panel.setPreferredSize(new Dimension(parent.getWidth() - 300, height));

        if (parent instanceof IpnbFilePanel) {
          IpnbFilePanel ipnbFilePanel = (IpnbFilePanel)parent;
          if (keyCode == KeyEvent.VK_ENTER && InputEvent.CTRL_MASK == e.getModifiers()) {
            IpnbRunCellBaseAction.runCell(ipnbFilePanel, false);
          }
          else if (keyCode == KeyEvent.VK_ENTER && InputEvent.SHIFT_DOWN_MASK == e.getModifiersEx()) {
            IpnbRunCellBaseAction.runCell(ipnbFilePanel, true);
          }
          else if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_PAGE_DOWN ||
                   keyCode == KeyEvent.VK_PAGE_UP) {
            updateVisibleArea(keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_PAGE_UP);
          }
        }
      }
    });

    contentComponent.addMouseListener(new MouseAdapter() {
      @Override
      public void mousePressed(MouseEvent e) {
        if (InputEvent.CTRL_DOWN_MASK == e.getModifiersEx()) return;
        final Container ipnbFilePanel = codePanel.getParent();
        if (ipnbFilePanel instanceof IpnbFilePanel) {
          ((IpnbFilePanel)ipnbFilePanel).setSelectedCell(codePanel, true);
          codePanel.switchToEditing();
        }
        UIUtil.requestFocus(contentComponent);
      }
    });

    panel.add(component);
    contentComponent.addHierarchyListener(new HierarchyListener() {
      @Override
      public void hierarchyChanged(HierarchyEvent e) {
        final Container parent = codePanel.getParent();
        if (parent != null && myEditor != null) {
          final int height = myEditor.getLineHeight() * Math.max(myEditor.getDocument().getLineCount(), 1) + 10;
          contentComponent.setPreferredSize(new Dimension(parent.getWidth() - 300, height));
          panel.setPreferredSize(new Dimension(parent.getWidth() - 300, height));
        }
      }
    });
    contentComponent.addHierarchyBoundsListener(new HierarchyBoundsAdapter() {
      @Override
      public void ancestorResized(HierarchyEvent e) {
        final Container parent = codePanel.getParent();
        final Component component = e.getChanged();
        if (parent != null && component instanceof IpnbFilePanel && myEditor != null) {
          final int height = myEditor.getLineHeight() * Math.max(myEditor.getDocument().getLineCount(), 1) + 10;
          contentComponent.setPreferredSize(new Dimension(parent.getWidth() - 300, height));
          panel.setPreferredSize(new Dimension(parent.getWidth() - 300, height));
          panel.revalidate();
          panel.repaint();
        }
      }
    });
    return panel;
  }