summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/table/CheckListTable.java
blob: 67b2f77c67696972b4769dcd4f883f86a44f402a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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;

public abstract class CheckListTable<T> extends ListTable<CheckListTable.Wrapper<T>> {

	/**
	 * Version for serialization.
	 */
	private static final long serialVersionUID = 5667297891670398732L;
	
	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(itemComparator == null ? null : 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));
	}

	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) {
			if (obj == null)
				return false;
			if (obj instanceof Wrapper<?>)
				return item.equals(((Wrapper<?>)obj).item);
			return false;
		}
	
		@Override
		public int hashCode() {
			return item.hashCode();
		}
		
		@Override
		public String toString() {
			return "(" + item.hashCode() + "=" + isChecked + ")";
		}
		
		public boolean isChecked() {
			return isChecked;
		}
	
	}
	
}