Author: sbavencoff Date: 2013-12-31 16:06:05 +0100 (Tue, 31 Dec 2013) New Revision: 3723 Url: http://chorem.org/projects/lima/repository/revisions/3723 Log: Factoring code of table and model table. Added: trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/AbstractLimaTable.java trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/AbstractLimaTableModel.java trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/LineRenderer.java Modified: trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/Column.java trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/TableModelWithGroup.java Added: trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/AbstractLimaTable.java =================================================================== --- trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/AbstractLimaTable.java (rev 0) +++ trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/AbstractLimaTable.java 2013-12-31 15:06:05 UTC (rev 3723) @@ -0,0 +1,108 @@ +package org.chorem.lima.ui.common; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.lima.ui.celleditor.DefaultLimaTableCellRenderer; +import org.jdesktop.swingx.JXTable; + +import javax.swing.*; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * @author Sylvain Bavencoff <bavencoff@codelutin.com> + */ +public abstract class AbstractLimaTable<H> extends JXTable { + + private static final Log log = LogFactory.getLog(AbstractLimaTable.class); + + protected H handler; + + protected LineRenderer lineRenderer; + + public AbstractLimaTable(H handler) { + this.handler = handler; + + setShowHorizontalLines(true); + setShowVerticalLines(true); + setGridColor(new Color(232, 232, 246)); + + initNavigation(); + + addMouseListener(new MyMouseAdapter()); + + setDefaultRenderer(Object.class, new DefaultLimaTableCellRenderer()); + + } + + protected void initNavigation() { + + InputMap inputMap= getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + ActionMap actionMap = getActionMap(); + + // action on Tab + Object binding = inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)); + actionMap.put(binding, new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + clearSelection(); + } + }); + + + } + + public H getHandler() { + return handler; + } + + @Override + public TableCellRenderer getCellRenderer(int row, int column) { + TableCellRenderer renderer; + + if (lineRenderer != null) { + renderer = lineRenderer; + } else { + renderer = super.getCellRenderer(row, column); + } + + return renderer; + } + + @Override + public TableCellEditor getCellEditor(int row, int column) { + TableCellEditor editor; + AbstractLimaTableModel tableModel = (AbstractLimaTableModel) getModel(); + Column columnTable = tableModel.getColumn(column); + editor = columnTable.getCellEditor(row); + if (editor == null) { + editor = super.getCellEditor(row, column); + } + return editor; + } + + public void exit() { + if (isEditing()) { + TableCellEditor editor = getCellEditor(); + editor.stopCellEditing(); + } + } + + + private class MyMouseAdapter extends MouseAdapter { + + @Override + public void mousePressed(MouseEvent e) { + if (rowAtPoint(e.getPoint()) == -1) { + clearSelection(); + } + } + } + + +} Added: trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/AbstractLimaTableModel.java =================================================================== --- trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/AbstractLimaTableModel.java (rev 0) +++ trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/AbstractLimaTableModel.java 2013-12-31 15:06:05 UTC (rev 3723) @@ -0,0 +1,171 @@ +package org.chorem.lima.ui.common; + +import com.google.common.collect.Lists; + +import javax.swing.table.AbstractTableModel; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static org.nuiton.i18n.I18n._; + +/** + * @author Sylvain Bavencoff <bavencoff@codelutin.com> + */ +public abstract class AbstractLimaTableModel<E> extends AbstractTableModel { + + protected List<E> values; + + protected List<Column<AbstractLimaTableModel<E>>> columns; + + protected Comparator<E> comparator; + + public AbstractLimaTableModel() { + + values = Lists.newArrayList(); + + columns = Lists.newArrayList(); + + initColumn(); + + } + + protected abstract void initColumn(); + + public void setComparator(Comparator<E> comparator) { + this.comparator = comparator; + } + + public void sort() { + if (comparator != null) { + Collections.sort(values, comparator); + fireTableDataChanged(); + } + } + + public void setValues(Collection<E> values) { + this.values.clear(); + this.values.addAll(values); + sort(); + fireTableDataChanged(); + } + + public void addValue(E value) { + int row = values.size(); + values.add(value); + fireTableRowsInserted(row, row); + sort(); + } + + public void addAll(Collection<E> values) { + int row = this.values.size(); + this.values.addAll(values); + fireTableRowsInserted(row, row + values.size() -1); + sort(); + } + + public void clear() { + values.clear(); + } + + public void remove(E value) { + int row = indexOf(value); + values.remove(value); + fireTableRowsDeleted(row, row); + } + + public void removeAll(Collection<E> values) { + for (E value : values) { + remove(value); + } + } + + public void remove(int row) { + values.remove(row); + fireTableRowsDeleted(row, row); + } + + public E get(int row) { + return values.get(row); + } + + public int indexOf(E value) { + return values.indexOf(value); + } + + public boolean contains(E value) { + return values.contains(value); + } + + public void addColumn(Column column) { + column.setTableModel(this); + columns.add(column); + fireTableStructureChanged(); + } + + public Column getColumn(int column) { + return columns.get(column); + } + + @Override + public int getColumnCount() { + return columns.size(); + } + + @Override + public int getRowCount() { + return size(); + } + + public int size() { + return values.size(); + } + + @Override + public Class<?> getColumnClass(int column) { + Class result = null; + if (column >= 0 && column < columns.size()) { + result = columns.get(column).getColumnClass(); + } + return result; + } + + @Override + public String getColumnName(int column) { + String result = _("lima.ui.nonaffect"); + if (column >= 0 && column < columns.size()) { + result = columns.get(column).getColumnName(); + } + return result; + } + + @Override + public Object getValueAt(int row, int column) { + + Object result = columns.get(column).getValueAt(row); + + return result; + } + + /** + * To set cells editable or not + * + */ + @Override + public boolean isCellEditable(int row, int column) { + boolean result = columns.get(column).isCellEditable(row); + return result; + } + + @Override + public void setValueAt(Object value, int row, int column) { + boolean update = columns.get(column).setValueAt(value, row); + // some modification must update all other + // first row modification update following rows + if (update) { + fireTableCellUpdated(row, column); + } + } + +} Modified: trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/Column.java =================================================================== --- trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/Column.java 2013-12-31 15:05:26 UTC (rev 3722) +++ trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/Column.java 2013-12-31 15:06:05 UTC (rev 3723) @@ -30,7 +30,7 @@ /** * @author Sylvain Bavencoff <bavencoff@codelutin.com> */ -public interface Column { +public interface Column<T extends AbstractLimaTableModel> { public Class<?> getColumnClass(); @@ -45,4 +45,6 @@ public TableCellRenderer getCellRenderer(int row); public TableCellEditor getCellEditor(int row); + + public void setTableModel(T tableModel); } Added: trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/LineRenderer.java =================================================================== --- trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/LineRenderer.java (rev 0) +++ trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/LineRenderer.java 2013-12-31 15:06:05 UTC (rev 3723) @@ -0,0 +1,38 @@ +package org.chorem.lima.ui.common; + +import org.chorem.lima.ui.celleditor.DefaultLimaTableCellRenderer; + +import javax.swing.*; +import javax.swing.table.TableCellRenderer; +import java.awt.*; + +/** + * @author Sylvain Bavencoff <bavencoff@codelutin.com> + */ +public abstract class LineRenderer extends DefaultLimaTableCellRenderer { + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + + AbstractLimaTableModel tableModel = (AbstractLimaTableModel) table.getModel(); + Column columnTable = tableModel.getColumn(column); + TableCellRenderer renderer = columnTable.getCellRenderer(row); + + Component component; + + if (renderer != null) { + + component = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + + } else { + + component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + + } + + + return component; + + } + +} Modified: trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/TableModelWithGroup.java =================================================================== --- trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/TableModelWithGroup.java 2013-12-31 15:05:26 UTC (rev 3722) +++ trunk/lima-swing/src/main/java/org/chorem/lima/ui/common/TableModelWithGroup.java 2013-12-31 15:06:05 UTC (rev 3723) @@ -27,7 +27,21 @@ /** * @author Sylvain Bavencoff <bavencoff@codelutin.com> */ -public interface TableModelWithGroup { +public abstract class TableModelWithGroup<E> extends AbstractLimaTableModel<E> { - public int indexGroupAt(int row); + public int indexGroupAt(int row) { + int countGroup = 0; + E precedingValue = get(0); + for (int precedingRow = 1; precedingRow <= row; precedingRow++) { + E value = get(precedingRow); + if ( ! sameGroup(precedingValue, value)) { + countGroup++; + } + precedingValue = value; + } + return countGroup; + + } + + public abstract boolean sameGroup(E e1, E e2); }
participants (1)
-
sbavencoffļ¼ users.chorem.org