package jetbrains.mps.ide.dataFlow.presentation;
/*Generated by MPS */
import com.intellij.openapi.ui.DialogWrapper;
import javax.swing.JScrollPane;
import jetbrains.mps.project.MPSProject;
import org.jetbrains.annotations.NotNull;
import com.intellij.ui.ScrollPaneFactory;
import java.awt.event.MouseEvent;
import org.jetbrains.mps.openapi.model.SNodeReference;
import javax.swing.SwingUtilities;
import javax.swing.JPopupMenu;
import javax.swing.JMenuItem;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import jetbrains.mps.openapi.navigation.EditorNavigator;
import java.awt.Color;
import org.jetbrains.annotations.Nullable;
import javax.swing.JComponent;
import javax.swing.Action;
import javax.swing.Scrollable;
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.Rectangle;
public class ShowCFGDialog extends DialogWrapper {
private JScrollPane myScrollPane;
private ShowCFGDialog.MyComponent myComponent;
private ControlFlowGraph<InstructionWrapper> myControlFlowGraph;
private final MPSProject myProject;
public ShowCFGDialog(@NotNull ControlFlowGraph<InstructionWrapper> graph, @NotNull MPSProject project, @NotNull String title) {
super(project.getProject());
myProject = project;
this.myComponent = new ShowCFGDialog.MyComponent();
this.myScrollPane = ScrollPaneFactory.createScrollPane(myComponent);
this.myScrollPane.setBackground(this.getBackground());
this.myComponent.setFont(this.myComponent.getFont().deriveFont(10.0f));
this.myControlFlowGraph = graph;
graph.setComponent(myComponent);
graph.relayout();
this.myControlFlowGraph.addBlockListener(new IBlockListener() {
@Override
public void mousePressed(MouseEvent event, IBlock block) {
final SNodeReference sourceRef = block.getSourceNode();
if (SwingUtilities.isRightMouseButton(event)) {
JPopupMenu menu = new JPopupMenu();
JMenuItem ruleItem = new JMenuItem("Go To Data Flow Rule");
JMenuItem nodeItem = new JMenuItem("Go To Node");
menu.add(ruleItem);
menu.add(nodeItem);
final SNodeReference ruleNodeReference = block.getRuleNodeReference();
ruleItem.setEnabled(ruleNodeReference != null);
nodeItem.setEnabled(sourceRef != null);
menu.show(event.getComponent(), event.getX(), event.getY());
ruleItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent p0) {
openNode(ruleNodeReference);
}
});
nodeItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent p0) {
openNode(sourceRef);
}
});
} else {
openNode(sourceRef);
}
}
});
setModal(false);
setTitle(title);
init();
}
private void openNode(SNodeReference nodeReference) {
new EditorNavigator(myProject).shallFocus(true).shallSelect(true).open(nodeReference);
}
public Color getBackground() {
return Color.LIGHT_GRAY;
}
@Nullable
@Override
protected JComponent createCenterPanel() {
return myScrollPane;
}
@Override
@NotNull
protected Action[] createActions() {
return new Action[0];
}
private class MyComponent extends JComponent implements Scrollable {
public MyComponent() {
this.setLayout(new BorderLayout());
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
ShowCFGDialog.this.myControlFlowGraph.processMousePressed(e);
}
});
}
@Override
public Color getBackground() {
return ShowCFGDialog.this.getBackground();
}
@Override
public void paint(Graphics g) {
g.setColor(this.getBackground());
g.fillRect(0, 0, this.getWidth(), this.getHeight());
ShowCFGDialog.this.myControlFlowGraph.paint(g);
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return this.getPreferredSize();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(ShowCFGDialog.this.myControlFlowGraph.getWidth(), ShowCFGDialog.this.myControlFlowGraph.getHeight());
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
return 20;
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
return visibleRect.height;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return false;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
}
}