package com.github.setial.intellijjavadocs.ui.component; import com.intellij.ui.table.JBTable; import com.intellij.util.ui.EditableModel; import com.intellij.util.ui.UIUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import java.awt.Component; import java.awt.event.MouseEvent; import java.util.Enumeration; import java.util.EventObject; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; /** * The type Templates table. * * @author Sergey Timofiychuk */ public class TemplatesTable extends JBTable { private List<Entry<String, String>> settings; /** * Instantiates a new Templates table. * * @param model the model */ @SuppressWarnings("unchecked") public TemplatesTable(Map<String, String> model) { setStriped(true); setAutoResizeMode(AUTO_RESIZE_ALL_COLUMNS); settings = new LinkedList<Entry<String, String>>(); CollectionUtils.addAll(settings, model.entrySet().toArray(new Entry[model.entrySet().size()])); setModel(new TableModel()); Enumeration<TableColumn> columns = getColumnModel().getColumns(); while (columns.hasMoreElements()) { columns.nextElement().setCellRenderer(new FieldRenderer()); } } /** * Gets settings model. * * @return clone of the original settings model */ @SuppressWarnings("unchecked") public Map<String, String> getSettings() { return MapUtils.putAll(new LinkedHashMap(), settings.toArray()); } /** * Sets settings model. * * @param model the model */ @SuppressWarnings("unchecked") public void setSettingsModel(Map<String, String> model) { settings.clear(); CollectionUtils.addAll(settings, model.entrySet().toArray(new Entry[model.entrySet().size()])); ((TableModel) getModel()).fireTableDataChanged(); } @Override public boolean editCellAt(int row, int column, EventObject e) { if (e == null) { return false; } if (e instanceof MouseEvent) { MouseEvent event = (MouseEvent) e; if (event.getClickCount() == 1) { return false; } } TemplateConfigDialog dialog = new TemplateConfigDialog(settings.get(row)); dialog.show(); if (dialog.isOK()) { settings.set(row, dialog.getModel()); } return false; } private class TableModel extends AbstractTableModel implements EditableModel { private List<String> columnNames; /** * Instantiates a new Table model. */ public TableModel() { columnNames = new LinkedList<String>(); columnNames.add("Regular expression"); columnNames.add("Preview"); } @Override public String getColumnName(int column) { return columnNames.get(column); } @Override public void addRow() { TemplateConfigDialog dialog = new TemplateConfigDialog(); dialog.show(); if (dialog.isOK()) { settings.add(dialog.getModel()); } } @Override public void removeRow(int index) { settings.remove(index); } @Override public void exchangeRows(int oldIndex, int newIndex) { Entry<String, String> oldItem = settings.get(oldIndex); settings.set(oldIndex, settings.get(newIndex)); settings.set(newIndex, oldItem); } @Override public boolean canExchangeRows(int oldIndex, int newIndex) { return true; } @Override public int getRowCount() { return settings.size(); } @Override public int getColumnCount() { return columnNames.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { return columnIndex == 0 ? settings.get(rowIndex).getKey() : settings.get(rowIndex).getValue(); } } private static class FieldRenderer extends JLabel implements TableCellRenderer { /** * Instantiates a new Field renderer. */ public FieldRenderer() { setOpaque(true); } @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); setForeground(isSelected ? table.getSelectionForeground() : table.getForeground()); setBorder(hasFocus ? UIUtil.getTableFocusCellHighlightBorder() : BorderFactory.createEmptyBorder(1, 1, 1, 1)); setText(value == null ? "" : value.toString()); return this; } } }