package com.constellio.app.modules.rm.ui.components.document.fields;
import static com.constellio.app.ui.i18n.i18n.$;
import java.util.ArrayList;
import java.util.List;
import com.constellio.app.modules.rm.model.CopyRetentionRule;
import com.constellio.app.modules.rm.model.CopyRetentionRuleInRule;
import com.constellio.app.ui.framework.components.display.ReferenceDisplay;
import com.vaadin.data.Property;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomField;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.ColumnGenerator;
public class DocumentCopyRuleFieldImpl extends CustomField<String> implements DocumentCopyRuleField {
private Table table;
private List<CopyRetentionRule> rules;
public DocumentCopyRuleFieldImpl(List<CopyRetentionRuleInRule> rules) {
this.rules = toCopyRetentionRules(rules);
}
@Override
public Class<? extends String> getType() {
return String.class;
}
@Override
public String getFieldValue() {
return getValue();
}
@Override
public void setFieldValue(Object value) {
setValue((String) value);
}
@Override
public void setFieldChoices(List<CopyRetentionRuleInRule> rules) {
this.rules = toCopyRetentionRules(rules);
updateTable();
}
@Override
protected Component initContent() {
table = new Generator().attachedTo(new Table());
table.setWidth("100%");
updateTable();
this.setVisible(rules.size() >= 2);
return table;
}
private List<CopyRetentionRule> toCopyRetentionRules(List<CopyRetentionRuleInRule> rules) {
List<CopyRetentionRule> result = new ArrayList<>();
for (CopyRetentionRuleInRule rule : rules) {
result.add(rule.getCopyRetentionRule());
}
return result;
}
private void updateTable() {
table.removeAllItems();
for (CopyRetentionRule rule : rules) {
table.addItem(rule);
}
table.setPageLength(rules.size());
this.setVisible(rules.size() >= 2);
}
private class Generator implements ColumnGenerator {
public static final String SELECTOR = "selector";
public static final String TITLE = "title";
public static final String NUMBER = "number";
public static final String TYPE = "type";
public static final String RULE = "rule";
public Table attachedTo(Table table) {
table.addGeneratedColumn(SELECTOR, this);
table.setColumnHeader(SELECTOR, "");
table.setColumnWidth(SELECTOR, 50);
table.addGeneratedColumn(TITLE, this);
table.setColumnHeader(TITLE, $("FolderCopyRuleField.title"));
table.addGeneratedColumn(NUMBER, this);
table.setColumnHeader(NUMBER, $("FolderCopyRuleField.number"));
table.addGeneratedColumn(TYPE, this);
table.setColumnHeader(TYPE, $("FolderCopyRuleField.type"));
table.addGeneratedColumn(RULE, this);
table.setColumnHeader(RULE, $("FolderCopyRuleField.rule"));
return table;
}
@Override
public Object generateCell(Table source, Object itemId, Object columnId) {
if (columnId == null) {
return null;
}
CopyRetentionRule rule = (CopyRetentionRule) itemId;
switch ((String) columnId) {
case SELECTOR:
return generateSelectorCell(rule);
case NUMBER:
return generateNumberCell(rule);
case TITLE:
return generateTitleCell(rule);
case TYPE:
return generateTypeCell(rule);
case RULE:
return generateRuleCell(rule);
}
return null;
}
private Object generateSelectorCell(final CopyRetentionRule rule) {
final CheckBox box = new CheckBox();
if (rule.getId().equals(getInternalValue())) {
box.setValue(true);
box.setEnabled(false);
}
box.addValueChangeListener(new ValueChangeListener() {
@Override
public void valueChange(Property.ValueChangeEvent event) {
if (box.getValue()) {
setValue(rule.getId());
}
}
});
return box;
}
private Object generateNumberCell(CopyRetentionRule rule) {
return rule.getCode();
}
private Object generateTitleCell(CopyRetentionRule rule) {
return rule.getTitle();
}
private Object generateTypeCell(CopyRetentionRule rule) {
return new ReferenceDisplay(rule.getTypeId());
}
private Object generateRuleCell(CopyRetentionRule rule) {
return rule.toString();
}
}
}