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