/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.directory.editors.checkUpType;
import cli_fmw.utils.CheckComboEditor;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.main.ClipsException;
import cli_fmw.main.PageContainer;
import cli_fmw.utils.ErrorValue;
import cli_fmw.utils.sorted_table.SortedTable;
import cli_fmw.utils.sorted_table.renderer.LabelRenderer;
import cli_fmw.utils.sorted_table.renderer.simple.CollectionRenderer;
import clips.delegate.directory.filtered.DirectoryCheckupType;
import clips.delegate.directory.filtered.DirectoryCheckupTypeItem;
import clips.delegate.directory.simple.speciality.DirectorySpeciality;
import clips.delegate.directory.simple.speciality.DirectorySpecialityItem;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JTable;
/**
*
* @author vip
*/
public class PanelCheckupTypeList extends PanelCheckupTypeListAbstract{
private DirectorySpeciality directorySpeciality;
private static class TableModelCheckupTypesImpl extends TableModelCheckupTypes {
Map<Integer, Column> map = new HashMap<Integer, Column>();
DirectorySpeciality ds;
DirectoryCheckupType dct;
public TableModelCheckupTypesImpl() throws ClipsException {
ds = DirectoryLocator.getDirectory(DirectorySpeciality.class, true);
dct = DirectoryLocator.getDirectory(DirectoryCheckupType.class, true);
map.put(0, new Column("Тип осмотра", DirectoryCheckupTypeItem.class, false));
map.put(1, new Column("Доступен для специальности", List.class, true));
}
@Override
protected Map<Integer, Column> getColumnMap() {
return map;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
DirectoryCheckupTypeItem item = items.get(rowIndex);
if (columnIndex == 0){
return item;
}
if (columnIndex == 1){
ArrayList<DirectorySpecialityItem> list = new ArrayList<DirectorySpecialityItem>();
try{
DirectorySpecialityItem[] specs = ds.toArray(new DirectorySpecialityItem[ds.getItems().size()]);
for (DirectorySpecialityItem speciality : specs) {
if (dct.getFilteredItems(speciality).contains(item)){
list.add(speciality);
}
}
}catch(ClipsException ce){
return new ErrorValue(ce);
}
// System.out.println("getValueAt: " + list);
return list;
}
return null;
}
private Set<DirectorySpecialityItem> getAvailbleSpecialitys(DirectoryCheckupTypeItem checkupType) throws ClipsException{
Set<DirectorySpecialityItem> res = new HashSet<DirectorySpecialityItem>();
DirectorySpecialityItem[] specialitys = ds.toArray(new DirectorySpecialityItem[ds.getItems().size()]);
for (DirectorySpecialityItem dsi : specialitys) {
if (dct.getFilteredItems(dsi).contains(checkupType)){
res.add(dsi);
}
}
return res;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (columnIndex == 1){
Collection<DirectorySpecialityItem> specialitys = (Collection<DirectorySpecialityItem>) aValue;
try {
Set<DirectorySpecialityItem> availbleSpecialitys = getAvailbleSpecialitys(items.get(rowIndex));
availbleSpecialitys.removeAll(specialitys);
for (DirectorySpecialityItem speciality : availbleSpecialitys) {
dct.getFilteredItems(speciality).remove(items.get(rowIndex));
}
for (DirectorySpecialityItem speciality : specialitys) {
dct.getFilteredItems(speciality).append(items.get(rowIndex));
}
} catch (ClipsException ex) {
ex.printStackTrace();
}
}
// fireTableCellUpdated(rowIndex, columnIndex);
}
}
public PanelCheckupTypeList(PageContainer container) throws ClipsException {
super(container, false);
directorySpeciality = DirectoryLocator.getDirectory(DirectorySpeciality.class);
}
@Override
public String getPageTitle() {
return "Справочник типов осмотров";
}
@Override
public DelegateLine2 getDelegate() {
return null;
}
@Override
protected TableModelCheckupTypes createModel() throws ClipsException {
return new TableModelCheckupTypesImpl();
}
@Override
protected void addRenderAndEditor(final SortedTable tblTypes) throws ClipsException {
tblTypes.getColumnModel().getColumn(1).setCellRenderer(new CollectionRenderer() {
@Override
protected void modifyErrorTableCellRendererComponent(JTable table, Object value, int row, int col) throws ClipsException {
List<DirectorySpecialityItem> items = (List<DirectorySpecialityItem>) value;
items.add(directorySpeciality.getNullItem());
if (items.size() == 1){
render().setText("Не определено");
}else if (directorySpeciality.getItemsList().containsAll(items)
&& items.containsAll(directorySpeciality.getItemsList())){
render().setText("Доступно всем");
}else{
items.remove(directorySpeciality.getNullItem());
super.modifyErrorTableCellRendererComponent(table, value, row, col);
}
}
});
DefaultComboBoxModel model = new DefaultComboBoxModel(DirectoryLocator.getDirectory(DirectorySpeciality.class).toArray(false));
CheckComboEditor editor = new CheckComboEditor(model);
tblTypes.getColumnModel().getColumn(1).setCellEditor(editor);
}
}