/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.doctor.profcheckup.dialogs;
import clips.doctor.profcheckup.*;
import clips.delegate.contract.PolisData;
import clips.delegate.directory.complex.DirectoryDangerItem;
import clips.delegate.job.DangerExamChunk;
import cli_fmw.delegate.utils.TimeLocal;
import cli_fmw.main.ClipsException;
import cli_fmw.utils.ErrorValue;
import cli_fmw.utils.Log;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import framework.utils.DateTimeUtils;
/**
* Класс для сопоставлени клиента и параметра отмечен/неотмечен
* @author petr
*/
class ChoosenClient {
public ChoosenClient(PolisData polis, DangerExamChunk danger) {
this.polisData = polis;
this.danger = danger;
this.select = false;
// this.blocked = false;
}
PolisData polisData;
DangerExamChunk danger;
boolean select;//выбран (тока что)
// boolean blocked;//уже есть в списке
}
/**
* дуплет
* @author petr
*/
class doublet{
public int first;
public int last;
}
/**
*
* @author petr
*/
public class TableModelClientsChoose extends AbstractTableModel {
public static final int CL_ADDED = 0;//отмечен/неотмечен
public static final int CL_CLIENT = 1;//клиент
public static final int CL_DANGER = 2;//опасный фактор
public static final int CL_LAST_EXAM = 3;//дата последнего осмотра
public static final int COLUMN_COUNT = 4;
private ArrayList<ChoosenClient> checkList;//список
/**
* Create table model with data about members and dangers
* @param selectedMembers already selected contmem and danger can`t be null
* @param dangerContmemMap
*/
public TableModelClientsChoose(Map<PolisData, Set<DangerExamChunk>> contmemDangerMap) throws ClipsException {
checkList = new ArrayList<ChoosenClient>();
Set<PolisData> it = contmemDangerMap.keySet();
for (PolisData cmd : it) {
Set<DangerExamChunk> it1 = contmemDangerMap.get(cmd);
for (DangerExamChunk dec : it1) {
ChoosenClient cc = new ChoosenClient(cmd, dec);
checkList.add(cc);
}
}
}
@Override
public Class<?> getColumnClass(int col) {
if (col == CL_ADDED) {
return Boolean.class;
}
return super.getColumnClass(col);
}
@Override
public String getColumnName(int col) {
switch(col){
case CL_ADDED: return "Добавить";
case CL_CLIENT: return "Сотрудник";
case CL_DANGER: return "Опасный фактор";
case CL_LAST_EXAM: return "Последний осмотр";
default: Log.printlnAnsPos("не сработал switch-case: TableModelClientsChoose, getColumnName(), column: " + col);
}
return null;
}
@Override
public boolean isCellEditable(int row, int col) {
if (col == CL_ADDED) {
return true;
} else {
return false;
}
}
@Override
public void setValueAt(Object obj, int row, int col) {
if (col == CL_ADDED) {//ставим-снимаем галочку в первой колонке
checkList.get(row).select = !checkList.get(row).select;
}
}
@Override
public int getRowCount() {
int count = checkList.size();
return count;
}
@Override
public int getColumnCount() {
return COLUMN_COUNT;
}
@Override
public Object getValueAt(int row, int col) {
try {
switch (col) {
case CL_ADDED:
return checkList.get(row).select;
case CL_CLIENT:
return checkList.get(row).polisData.getClient().toString();
case CL_DANGER:
return checkList.get(row).danger.getDanger();
case CL_LAST_EXAM:
return framework.utils.Converter.dateToString(checkList.get(row).danger.getLastExam());
default:
Log.printlnAnsPos("не сработал switch-case: TableModelClientsChoose, getValueAt(), row: " +
row + " col: " + col);
}
return null;
} catch (ClipsException ex) {
return new ErrorValue(ex);
}
}
/**
* Вернет отношение числа дней прошедших с последнего осмотра к длине
* периода осмотров по данному фактору
* Если даты нет - 1
* Еслт период 0 - 1
* @param row строка
* @return отношение
* @throws cli_fmw.main.ClipsException
*/
public double coeffFromLastExam(int row) throws ClipsException{
ChoosenClient cc = checkList.get(row);
Date lastExam = cc.danger.getLastExam();
if (lastExam == null){
return 1;
}
double frequency = cc.danger.getDanger().getFrequency();
if (frequency == 0){
return 1;
}
double daysBetween = DateTimeUtils.daysBetween(lastExam, TimeLocal.getCurrentTime().getTime());
return daysBetween/frequency;
}
/**
* Возвращает отмеченных клиентов
* @return
*/
public Map<PolisData, Set<DirectoryDangerItem>> getSelectedValues() throws ClipsException{
Map<PolisData, Set<DirectoryDangerItem>> res =
new HashMap<PolisData, Set<DirectoryDangerItem>>();
for (ChoosenClient cc : checkList) {
if (cc.select){
PolisData cmd = cc.polisData;
if (res.get(cmd) == null){
res.put(cmd, new HashSet<DirectoryDangerItem>());
}
res.get(cmd).add(cc.danger.getDanger());
}
}
return res;
}
public void Invert(){
System.out.println("SELECTION INVERT");
for (ChoosenClient cc : checkList) {
cc.select = !cc.select;
}
fireTableChanged(new TableModelEvent(this));
}
}