diff options
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/CheckListTable.java')
-rw-r--r-- | dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/CheckListTable.java | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/CheckListTable.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/CheckListTable.java new file mode 100644 index 00000000..d9527612 --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/CheckListTable.java @@ -0,0 +1,157 @@ +package org.openslx.dozmod.gui.control.table; + +import java.awt.Component; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Set; + +import javax.swing.Box; + +import org.apache.log4j.Logger; + +public abstract class CheckListTable<T> extends ListTable<CheckListTable.Wrapper<T>> { + + private static final long serialVersionUID = 5667297891670398732L; + + private static final Logger LOGGER = Logger.getLogger(CheckListTable.class); + + public static final ListTableColumn COL_CHECKBOX = new ListTableColumn("", Boolean.class, null, true); + + private static final Component LBL_EMPTY_CELL = Box.createHorizontalGlue(); + + public CheckListTable(ListTableColumn... columns) { + this(null, columns); + } + + public CheckListTable(final Comparator<T> itemComparator, ListTableColumn... columns) { + super(new Comparator<Wrapper<T>>() { + @Override + public int compare(Wrapper<T> o1, Wrapper<T> o2) { + if (o1 == null && o2 == null) + return 0; + if (o1 == null) + return -1; + if (o2 == null) + return 1; + return itemComparator.compare(o1.item, o2.item); + } + + }, copyColumns(columns)); + /* + this.setDefaultEditor(Boolean.class, new DefaultCellEditor { + public DefaultCellEditor(new JCheckBox()) { + JCheckBox checkBox = (JCheckBox)getComponent(); + checkBox.setHorizontalAlignment(JCheckBox.CENTER); + } + }); + /* + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + int column = getSelectedColumn(); + if (column != 0) + return; + int row = getSelectedRow(); + if (row < 0 || row >= getRowCount()) + return; + getce + } + }); + */ + } + + private static ListTableColumn[] copyColumns(ListTableColumn[] columns) { + final ListTableColumn ncolumns[] = new ListTableColumn[columns.length + 1]; + ncolumns[0] = COL_CHECKBOX; + System.arraycopy(columns, 0, ncolumns, 1, columns.length); + return ncolumns; + } + + @Override + public void setValueAt(Object newValue, Wrapper<T> row, ListTableColumn column) { + if (column == COL_CHECKBOX && newValue != null && newValue.getClass() == Boolean.class) { + row.isChecked = (Boolean)newValue; + } + } + + @Override + protected final Object getValueAtInternal(Wrapper<T> row, ListTableColumn columnIndex) { + if (row.item == null) + return null; + if (columnIndex == COL_CHECKBOX) { + return row.isChecked; + } + return getValueAtInternal2(row.item, columnIndex); + } + + protected abstract Object getValueAtInternal2(T row, ListTableColumn columnIndex); + + @Override + public final Component prepareRenderHook(Component component, Wrapper<T> row, + ListTableColumn listTableColumn, boolean isSelected) { + if (listTableColumn == COL_CHECKBOX) { + if (row == null || row.item == null || !isItemCheckable(row.item)) { + return LBL_EMPTY_CELL; + } + } else if (row.item != null) { + component = prepareRenderHook2(component, row.item, listTableColumn, isSelected); + } + return component; + } + + public Component prepareRenderHook2(Component component, T row, + ListTableColumn listTableColumn, boolean isSelected) { + // Nothing + return component; + } + + public void setData(List<T> data, Set<T> preChecked, boolean sort) { + List<Wrapper<T>> list = new ArrayList<>(data.size()); + for (T item : data) { + list.add(new Wrapper<T>(item, preChecked != null && preChecked.contains(item))); + } + super.setData(list, sort); + } + + protected abstract boolean isItemCheckable(T item); + + public T getSelectedItem2() { + Wrapper<T> ret = getSelectedItem(); + if (ret == null) + return null; + return ret.item; + } + + public static class Wrapper<S> { + + protected boolean isChecked; + public final S item; + + public Wrapper(S item, boolean checked) { + this.item = item; + this.isChecked = checked; + } + + @Override + public boolean equals(Object obj) { + return item.equals(obj); + } + + @Override + public int hashCode() { + return item.hashCode(); + } + + @Override + public String toString() { + return "(" + item.hashCode() + "=" + isChecked + ")"; + } + + public boolean isChecked() { + return isChecked; + } + + } + +} |