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();
}
}
}