package jetbrains.mps.vcs.changesmanager.editor; /*Generated by MPS */ import javax.swing.JPanel; import jetbrains.mps.vcs.diff.ui.common.ChangeGroup; import jetbrains.mps.nodeEditor.EditorComponent; import com.intellij.openapi.actionSystem.ActionToolbar; import java.awt.BorderLayout; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.ActionPlaces; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.ui.ColoredSideBorder; import java.awt.Color; import jetbrains.mps.vcs.diff.changes.ChangeType; import javax.swing.JLayeredPane; import javax.swing.SwingUtilities; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; /*package*/ class PopupPanel extends JPanel { private ChangeStripsPainter myPainter; private ChangeGroup myChangeGroup; private PopupPanel.MyMouseListener myMouseListener = new PopupPanel.MyMouseListener(); private PopupPanel.MyFocusListener myFocusListener = new PopupPanel.MyFocusListener(); private EditorComponent myEditor; private BaseVersionEditorComponent myBaseEditor; private ActionToolbar myToolbar; public PopupPanel(ChangeStripsPainter painter, ChangeGroup group) { myChangeGroup = group; myPainter = painter; myEditor = myPainter.getEditorComponent(); setLayout(new BorderLayout()); setOpaque(false); JPanel toolbarPanel = new JPanel(new BorderLayout()); toolbarPanel.setOpaque(false); myToolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, ((ActionGroup) ActionManager.getInstance().getAction("jetbrains.mps.vcs.platform.actions.ChangesStrip_ActionGroup")), true); myToolbar.setTargetComponent(myPainter.getEditorComponent()); toolbarPanel.add(myToolbar.getComponent(), BorderLayout.WEST); add(toolbarPanel, BorderLayout.NORTH); myToolbar.getComponent().setBorder(new ColoredSideBorder(Color.BLACK, Color.BLACK, (myChangeGroup.getChangeType() != ChangeType.ADD ? null : Color.BLACK), Color.BLACK, 1)); if (myChangeGroup.getChangeType() != ChangeType.ADD) { myBaseEditor = new BaseVersionEditorComponent(myEditor.getEditorContext().getRepository(), myChangeGroup); // Do not extend this editor with extensions: the project is tricky to get from this point, // and this editor doesn't seem to be that important to extend. add(myBaseEditor.getScrollPane(), BorderLayout.CENTER); } } /*package*/ ChangeGroup getChangeGroup() { return myChangeGroup; } public void show(int x, int y) { JLayeredPane layeredPane = myEditor.getRootPane().getLayeredPane(); setLocation(SwingUtilities.convertPoint(myEditor, x, y, layeredPane)); setVisible(true); layeredPane.add(this, JLayeredPane.POPUP_LAYER); myPainter.setGroupHighlighted(myChangeGroup, true); myToolbar.updateActionsImmediately(); setSize(getPreferredSize()); int overflow = ((int) getBounds().getMaxX()) - layeredPane.getWidth(); if (overflow > 0) { // panel is too wide, need to move it setLocation(Math.max(0, getX() - overflow), getY()); } layeredPane.validate(); layeredPane.repaint(getBounds()); addListeners(); } private void addListeners() { myEditor.addMouseListener(myMouseListener); myEditor.addFocusListener(myFocusListener); } private void removeListeners() { myEditor.removeFocusListener(myFocusListener); myEditor.removeMouseListener(myMouseListener); } /*package*/ void dispose() { removeListeners(); JLayeredPane layeredPane = myEditor.getRootPane().getLayeredPane(); layeredPane.remove(this); layeredPane.validate(); layeredPane.repaint(getBounds()); myPainter.setGroupHighlighted(myChangeGroup, false); myPainter.popupClosed(); if (myBaseEditor != null) { myBaseEditor.dispose(); myBaseEditor = null; } } private class MyMouseListener extends MouseAdapter { public MyMouseListener() { } @Override public void mousePressed(MouseEvent event) { dispose(); } } private class MyFocusListener extends FocusAdapter { public MyFocusListener() { } @Override public void focusLost(FocusEvent event) { dispose(); } } }