package jetbrains.mps.ide.script.plugin;
/*Generated by MPS */
import javax.swing.JDialog;
import java.util.List;
import org.jetbrains.mps.openapi.model.SNodeReference;
import java.util.Set;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.HashSet;
import javax.swing.JTable;
import javax.swing.JButton;
import jetbrains.mps.project.MPSProject;
import java.awt.Frame;
import java.awt.HeadlessException;
import javax.swing.WindowConstants;
import javax.swing.JComponent;
import java.awt.BorderLayout;
import javax.swing.BorderFactory;
import javax.swing.AbstractAction;
import java.awt.event.ActionEvent;
import javax.swing.KeyStroke;
import javax.swing.JPanel;
import com.intellij.ui.table.JBTable;
import javax.swing.table.TableColumnModel;
import com.intellij.ui.ScrollPaneFactory;
import java.awt.event.ActionListener;
import javax.swing.event.TableModelListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import javax.swing.table.DefaultTableModel;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import org.jetbrains.mps.openapi.module.SRepository;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import javax.swing.table.TableCellRenderer;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.table.JTableHeader;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import jetbrains.mps.util.Pair;
import java.util.Collections;
import java.util.Comparator;
import javax.swing.Icon;
import java.awt.Graphics;
import javax.swing.UIManager;
public class RunMigrationScriptsDialog extends JDialog {
private List<SNodeReference> myScripts;
private Set<SNodeReference> mySelectedScriptIds = SetSequence.fromSet(new HashSet<SNodeReference>());
private JTable myTable;
private JButton myCheckButton;
private JButton myUnCheckButton;
private JButton myRunCheckedButton;
private JButton myOpenSelectedButton;
private boolean myRunChecked;
private boolean myOpenSelected;
private MPSProject myProject;
public RunMigrationScriptsDialog(MPSProject p, Frame owner, List<SNodeReference> scripts) throws HeadlessException {
super(owner, "Migration Scripts", true);
myProject = p;
myScripts = scripts;
init();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setSize(750, 600);
}
private void init() {
JComponent contentPane = ((JComponent) getContentPane());
contentPane.setLayout(new BorderLayout());
contentPane.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
contentPane.registerKeyboardAction(new AbstractAction("Dispose dialog") {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
}, KeyStroke.getKeyStroke("ESCAPE"), JComponent.WHEN_IN_FOCUSED_WINDOW);
JPanel panel = new JPanel(new BorderLayout());
contentPane.add(panel, BorderLayout.CENTER);
RunMigrationScriptsDialog.MySortingTableModel tm = new RunMigrationScriptsDialog.MySortingTableModel();
myTable = new JBTable(tm);
tm.install(myTable);
TableColumnModel columnModel = myTable.getColumnModel();
columnModel.getColumn(0).setMaxWidth(20);
columnModel.getColumn(0).setResizable(false);
columnModel.getColumn(1).setMinWidth(300);
columnModel.getColumn(2).setMinWidth(120);
panel.add(ScrollPaneFactory.createScrollPane(myTable), BorderLayout.CENTER);
JPanel buttonsFlow = new JPanel();
myCheckButton = new JButton("Check");
myUnCheckButton = new JButton("UnCheck");
myRunCheckedButton = new JButton("Run Checked");
myOpenSelectedButton = new JButton("Open Selected");
JButton closeButton = new JButton("Close");
buttonsFlow.add(myCheckButton);
buttonsFlow.add(myUnCheckButton);
buttonsFlow.add(myRunCheckedButton);
buttonsFlow.add(myOpenSelectedButton);
buttonsFlow.add(closeButton);
myCheckButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int[] ints = myTable.getSelectedRows();
for (int i : ints) {
myTable.setValueAt(true, i, 0);
}
}
});
myUnCheckButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int[] ints = myTable.getSelectedRows();
for (int i : ints) {
myTable.setValueAt(false, i, 0);
}
}
});
myRunCheckedButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myRunChecked = true;
RunMigrationScriptsDialog.this.setVisible(false);
}
});
myOpenSelectedButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myOpenSelected = true;
RunMigrationScriptsDialog.this.setVisible(false);
}
});
closeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
RunMigrationScriptsDialog.this.setVisible(false);
}
});
JPanel buttons = new JPanel(new BorderLayout());
buttons.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0));
buttons.add(buttonsFlow, BorderLayout.EAST);
panel.add(buttons, BorderLayout.SOUTH);
myTable.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
RunMigrationScriptsDialog.this.updateButtons();
}
});
myTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
RunMigrationScriptsDialog.this.updateButtons();
}
});
updateButtons();
}
private void updateButtons() {
int[] ints = myTable.getSelectedRows();
boolean enableCheck = false;
boolean enableUnCheck = false;
for (int i : ints) {
if (!((Boolean) myTable.getModel().getValueAt(i, 0))) {
enableCheck = true;
} else {
enableUnCheck = true;
}
}
myCheckButton.setEnabled(enableCheck);
myUnCheckButton.setEnabled(enableUnCheck);
myOpenSelectedButton.setEnabled(ListSequence.fromList(getSelectedScripts()).count() == 1);
myRunCheckedButton.setEnabled(ListSequence.fromList(getCheckedScripts()).count() >= 1);
}
public List<SNodeReference> getSelectedScripts() {
List<SNodeReference> list = ListSequence.fromList(new ArrayList<SNodeReference>());
int[] ints = myTable.getSelectedRows();
for (int anInt : ints) {
int modelIndex = ((RunMigrationScriptsDialog.MySortingTableModel) myTable.getModel()).convertRowIndexToModel(anInt);
ListSequence.fromList(list).addElement(ListSequence.fromList(myScripts).getElement(modelIndex));
}
return list;
}
public List<SNodeReference> getCheckedScripts() {
List<SNodeReference> list = ListSequence.fromList(new ArrayList<SNodeReference>());
int count = myTable.getModel().getRowCount();
for (int i = 0; i < count; i++) {
if (((RunMigrationScriptsDialog.MySortingTableModel) myTable.getModel()).isChecked(i)) {
ListSequence.fromList(list).addElement(ListSequence.fromList(myScripts).getElement(i));
}
}
return list;
}
public boolean isRunChecked() {
return myRunChecked;
}
public boolean isOpenSelected() {
return myOpenSelected;
}
private class MyTableModel extends DefaultTableModel {
public MyTableModel() {
super(new String[]{"", "script", "category", "language"}, ListSequence.fromList(myScripts).count());
}
@Override
public boolean isCellEditable(int row, int column) {
return column == 0;
}
@Override
public Class<?> getColumnClass(int column) {
if (column == 0) {
return Boolean.class;
}
return super.getColumnClass(column);
}
@Override
public Object getValueAt(final int row, final int column) {
final Wrappers._T<Object> result = new Wrappers._T<Object>(null);
final SRepository repo = myProject.getRepository();
repo.getModelAccess().runReadAction(new Runnable() {
public void run() {
SNode sn = SNodeOperations.cast(ListSequence.fromList(myScripts).getElement(row).resolve(repo), MetaAdapterFactory.getConcept(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, "jetbrains.mps.lang.script.structure.MigrationScript"));
if (column == 0) {
result.value = mySelectedScriptIds.contains(sn.getReference());
} else if (column == 1) {
result.value = " " + SPropertyOperations.getString(sn, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x11225f2354aL, "title"));
} else if (column == 2) {
if (SPropertyOperations.hasValue(sn, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x498b4f71ee081153L, "type"), "migration", "enhancement")) {
result.value = SPropertyOperations.getString_def(sn, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x498b4f71ee081153L, "type"), "enhancement") + " (" + SPropertyOperations.getString(sn, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x498b4f71ee081155L, "toBuild")) + ")";
} else {
result.value = SPropertyOperations.getString_def(sn, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x498b4f71ee081153L, "type"), "enhancement");
}
} else if (column == 3) {
result.value = SNodeOperations.getModel(sn).getModule().getModuleName();
}
}
});
return result.value;
}
@Override
public void setValueAt(Object aValue, int row, int column) {
SNodeReference id = ListSequence.fromList(myScripts).getElement(row);
if ((Boolean) aValue) {
mySelectedScriptIds.add(id);
} else {
mySelectedScriptIds.remove(id);
}
super.setValueAt(aValue, row, column);
}
}
private class MySortingTableModel extends RunMigrationScriptsDialog.MyTableModel {
private static final int NONE = 0;
private static final int ASC = 1;
private static final int DESC = 2;
private int mySortedColumn = -1;
private int mySortingOrder = NONE;
private int[] myViewToModelMap;
private MySortingTableModel() {
}
@Override
public boolean isCellEditable(int row, int column) {
return super.isCellEditable(convertRowIndexToModel(row), column);
}
@Override
public Class<?> getColumnClass(int column) {
return super.getColumnClass(column);
}
@Override
public Object getValueAt(int row, int column) {
return super.getValueAt(convertRowIndexToModel(row), column);
}
@Override
public void setValueAt(Object aValue, int row, int column) {
super.setValueAt(aValue, convertRowIndexToModel(row), column);
fireTableCellUpdated(row, column);
}
public boolean isChecked(int row) {
return (Boolean) super.getValueAt(row, 0);
}
public int convertRowIndexToModel(int viewIndex) {
if (mySortingOrder == NONE) {
return viewIndex;
}
return myViewToModelMap[viewIndex];
}
public int convertRowIndexToView(int modelIndex) {
if (mySortingOrder == NONE) {
return modelIndex;
}
for (int i = 0; i < myViewToModelMap.length; i++) {
if (myViewToModelMap[i] == modelIndex) {
return i;
}
}
return -1;
}
public void install(final JTable table) {
TableColumnModel columnModel = table.getColumnModel();
for (int i = 0; i < columnModel.getColumnCount(); i++) {
columnModel.getColumn(i).setHeaderRenderer(new TableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = table.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
column = table.convertColumnIndexToModel(column);
if (mySortedColumn == column) {
if (mySortingOrder == RunMigrationScriptsDialog.MySortingTableModel.ASC) {
((JLabel) c).setIcon(new RunMigrationScriptsDialog.MyDownIcon(7));
} else
if (mySortingOrder == RunMigrationScriptsDialog.MySortingTableModel.DESC) {
((JLabel) c).setIcon(new RunMigrationScriptsDialog.MyUpIcon(8));
} else
((JLabel) c).setIcon(null);
} else {
((JLabel) c).setIcon(null);
}
return c;
}
});
}
final JTableHeader header = table.getTableHeader();
header.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int col = header.columnAtPoint(e.getPoint());
col = header.getTable().convertColumnIndexToModel(col);
if (col == 0) {
return;
}
int sortingOrder = RunMigrationScriptsDialog.MySortingTableModel.ASC;
if (mySortedColumn == col) {
if (mySortingOrder == RunMigrationScriptsDialog.MySortingTableModel.NONE) {
sortingOrder = RunMigrationScriptsDialog.MySortingTableModel.ASC;
}
if (mySortingOrder == RunMigrationScriptsDialog.MySortingTableModel.ASC) {
sortingOrder = RunMigrationScriptsDialog.MySortingTableModel.DESC;
}
if (mySortingOrder == RunMigrationScriptsDialog.MySortingTableModel.DESC) {
sortingOrder = RunMigrationScriptsDialog.MySortingTableModel.NONE;
}
} else {
if (mySortingOrder == RunMigrationScriptsDialog.MySortingTableModel.NONE) {
sortingOrder = RunMigrationScriptsDialog.MySortingTableModel.ASC;
} else
sortingOrder = mySortingOrder;
}
int[] selectedRows = table.getSelectedRows();
for (int i = 0; i < selectedRows.length; i++) {
selectedRows[i] = convertRowIndexToModel(selectedRows[i]);
}
MySortingTableModel.this.sort(col, sortingOrder);
for (int selectedRow : selectedRows) {
selectedRow = convertRowIndexToView(selectedRow);
table.addRowSelectionInterval(selectedRow, selectedRow);
}
}
});
}
private void sort(final int column, int order) {
mySortingOrder = order;
mySortedColumn = column;
if (order == NONE) {
} else {
List<Pair<Integer, String>> values = new ArrayList<Pair<Integer, String>>();
for (int i = 0; i < getRowCount(); i++) {
values.add(new Pair<Integer, String>(i, String.valueOf(super.getValueAt(i, column))));
}
List<Pair<Integer, String>> valuesSorted = new ArrayList<Pair<Integer, String>>(values);
Collections.sort(valuesSorted, new Comparator<Pair<Integer, String>>() {
@Override
public int compare(Pair<Integer, String> o1, Pair<Integer, String> o2) {
return o1.o2.compareTo(o2.o2);
}
});
if (order == DESC) {
Collections.reverse(valuesSorted);
}
myViewToModelMap = new int[values.size()];
for (int i = 0; i < values.size(); i++) {
myViewToModelMap[i] = values.indexOf(valuesSorted.get(i));
}
}
fireTableDataChanged();
}
}
private class MyDownIcon implements Icon {
private int mySize;
private int myXoff = 4;
private int myYoff = 4;
private MyDownIcon(int size) {
mySize = size;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(UIManager.getColor("controlDkShadow"));
g.fillPolygon(new int[]{myXoff + 0, myXoff + mySize, myXoff + mySize / 2}, new int[]{myYoff + 0, myYoff + 0, myYoff + (int) (mySize * 0.87)}, 3);
}
@Override
public int getIconWidth() {
return mySize + myXoff;
}
@Override
public int getIconHeight() {
return mySize + myYoff;
}
}
private class MyUpIcon implements Icon {
private int mySize;
private int myXoff = 4;
private int myYoff = 4;
private MyUpIcon(int size) {
mySize = size;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(UIManager.getColor("controlDkShadow"));
g.fillPolygon(new int[]{myXoff + 0, myXoff + mySize / 2, myXoff + mySize}, new int[]{myYoff + (int) (mySize * 0.87), myYoff + 0, myYoff + (int) (mySize * 0.87)}, 3);
}
@Override
public int getIconWidth() {
return mySize + myXoff;
}
@Override
public int getIconHeight() {
return mySize + myYoff;
}
}
}