/*
* PanelAnalyseShedule.java
*
* Created on 12 Май 2008 г., 16:11
*/
package clips.analysis.shedule;
import clips.analysis.individual.DialogRenderAnalyseIndividual;
import clips.analysis.laboratory.PanelAnalyse;
import clips.analysis.shedule.SheduleEdit.DialogSheduleEditM1;
import clips.delegate.directory.filtered.DirectoryCheckupTypeItem;
import clips.delegate.doctor.checkup.CheckupFactoryLocal;
import clips.delegate.doctor.checkup.CheckupLocal;
import clips.delegate.doctor.checkup.shedule.CheckupSheduleFactory;
import clips.delegate.doctor.checkup.shedule.CheckupSheduleLocal;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.main.ActivateSensitive;
import cli_fmw.main.ClipsException;
import cli_fmw.main.ContentStateListener;
import cli_fmw.main.MainWindow;
import cli_fmw.main.PageContainer;
import cli_fmw.main.PageGeneric;
import cli_fmw.main.PageGeneric;
import framework.utils.CollectionUtils;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.ModalDialog;
import cli_fmw.utils.sorted_table.renderer.simple.DefaultRenderer;
import cli_fmw.utils.table_config_states.StateSaver;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
/**
* Панель расписания анализов
* @author vip
*/
public class PanelAnalyseShedule extends PageGeneric
implements PropertyChangeListener, ActivateSensitive{
CheckupSheduleFactory csf;
boolean errorMode = false;
/** Свободные анализы (не в расписании) */
private Map<DirectoryCheckupTypeItem, ArrayList<CheckupLocal>> freeCheckupMap
= new HashMap<DirectoryCheckupTypeItem, ArrayList<CheckupLocal>>();
/** Элементы расписания анализов, содержащие списки анализов */
private ArrayList<CheckupSheduleLocal> checkupSheduleLocalList;
private CheckupFactoryLocal cfl;
private ContentStateListener emptyListener = new ContentStateListener() {
@Override
public void contentStateChanged() {
//DO NOTHING
}
};
/** Creates new form PanelAnalyseShedule
* @param container
* @throws ClipsException
*/
public PanelAnalyseShedule(PageContainer container) throws ClipsException {
super(container);
initComponents();
csf = new CheckupSheduleFactory();
cfl = new CheckupFactoryLocal(getAuditManager());
refreshData();
StateSaver.attachTo(this);
}
/**
* Загружает данные из делегата
* @throws generic.ClipsException
*/
private void refreshData() throws ClipsException {
if (checkupSheduleLocalList!= null){
for (CheckupSheduleLocal csl : checkupSheduleLocalList) {
csl.removeEmpty();
}
}
Map<DirectoryCheckupTypeItem, ArrayList<CheckupLocal>> tempMap
= new HashMap<DirectoryCheckupTypeItem, ArrayList<CheckupLocal>>();
checkupSheduleLocalList = csf.getCheckUpSheduleLocalList();
ArrayList<CheckupLocal> cls = cfl.getFreeCheckupList();
for (int i = 0; i < cls.size(); i++) {
if (tempMap.get(cls.get(i).getType()) == null) {
tempMap.put(cls.get(i).getType(), new ArrayList<CheckupLocal>());
}
tempMap.get(cls.get(i).getType()).add(cls.get(i));
}
freeCheckupMap = tempMap;
for (CheckupSheduleLocal csl : checkupSheduleLocalList){
if (freeCheckupMap.get(csl.getType()) == null){
freeCheckupMap.put(csl.getType(), new ArrayList<CheckupLocal>());
}
}
updateTable();
}
/**
* Обновляет таблицу расписания
*/
private void updateTable() {
try {
jTable1.setModel(new TableModelAnalyseShedule(freeCheckupMap, checkupSheduleLocalList));
jTable1.setDefaultRenderer(Object.class, new TableCellRendererAnalyseShedule());
jTable1.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
errorMode = false;
resizeColumn();
} catch (ClipsException ex) {
MessageBox.showException(ex);
jTable1.setModel(new DefaultTableModel());
jTable1.setDefaultRenderer(Object.class, new DefaultRenderer());
errorMode = true;
}
}
/**
* Запускает проведение индивидуального анализа
* @param checkup анализ
* @param shedule шедуля в которой находится анализ
* @throws generic.ClipsException
*/
private void individualAnalyse(CheckupLocal checkup, CheckupSheduleLocal shedule) throws ClipsException {
checkup.addContentStateListener(emptyListener);
checkup.getSerrenLocal().addContentStateListener(emptyListener);
DialogRenderAnalyseIndividual dialogIndividual = new DialogRenderAnalyseIndividual(MainWindow.mainWindow, checkup, getAuditManager());
dialogIndividual.setVisible(true);
ClipsException ex = null;
if (dialogIndividual.getDlgResult() == ModalDialog.DLG_OK) {
//Удаление чекапа из списка
if (CollectionUtils.isContainObject(freeCheckupMap.get(checkup.getType()), checkup)) {
//чекап был свободным
CollectionUtils.removeObectByPtr(freeCheckupMap.get(checkup.getType()), checkup);
} else {
//чекап был в расписании
shedule.getCheckupSet().remove(checkup);
trySincShedule(shedule);
CollectionUtils.removeObectByPtr(checkupSheduleLocalList, shedule);
}
updateTable();
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new cli_fmw.utils.sorted_table.SortedTable();
jPanel1 = new javax.swing.JPanel();
btChangeShedule = new javax.swing.JButton();
btRefresh = new javax.swing.JButton();
setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
setLayout(new java.awt.BorderLayout(5, 5));
jScrollPane1.addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentResized(java.awt.event.ComponentEvent evt) {
jScrollPane1ComponentResized(evt);
}
});
jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jTable1MouseClicked(evt);
}
});
jScrollPane1.setViewportView(jTable1);
add(jScrollPane1, java.awt.BorderLayout.CENTER);
jPanel1.setLayout(new java.awt.BorderLayout());
btChangeShedule.setText("Изменить запланированные анализы");
btChangeShedule.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btChangeSheduleActionPerformed(evt);
}
});
jPanel1.add(btChangeShedule, java.awt.BorderLayout.EAST);
btRefresh.setText("Обновить");
btRefresh.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btRefreshActionPerformed(evt);
}
});
jPanel1.add(btRefresh, java.awt.BorderLayout.WEST);
add(jPanel1, java.awt.BorderLayout.SOUTH);
}// </editor-fold>//GEN-END:initComponents
/**
* Открывет диалог изменения анализов расписании
* @param position позиция левого верхнего угла на экране
*/
private void openDialog() {
try {
int row = jTable1.getSelectedRowSorted(); //выделенная
int col = jTable1.getSelectedColumn(); //ячейка
if (col < TableModelAnalyseShedule.COL_COUNT) {
return;
}
CheckupSheduleLocal shedule = ((TableModelAnalyseShedule) jTable1.getModel()).getSheduleAt(row, col);
//Возможно элемент расписания был null создаем его
if (shedule == null) {
DirectoryCheckupTypeItem checkupType = ((TableModelAnalyseShedule)
jTable1.getModel()).getCheckUpTypeAt(row);
Date sheduleDate = ((TableModelAnalyseShedule) jTable1.getModel()).getDateAt(col);
shedule = new CheckupSheduleLocal(checkupType, sheduleDate, getAuditManager());
//trySincShedule(shedule);
}
//Создание и вызов диалога
shedule.addContentStateListener(getContainer());
CollectionUtils.addObectIfNotExist(checkupSheduleLocalList, shedule);
DialogSheduleEditM1 dialog
= new DialogSheduleEditM1(MainWindow.mainWindow,
freeCheckupMap.get(shedule.getType()),
shedule, getAuditManager());
dialog.addPropertyChangeListener(this);
dialog.setVisible(true);
//посмотрим чего вернул диалог
int res = dialog.getDlgResult();
System.out.println("FREE PANEL: "+freeCheckupMap);
switch (res) {
case ModalDialog.DLG_OK:
//готово или анализ
trySincShedule(shedule);//пробуем сохранить
if (dialog.getIndividualCheckUp() != null) {//проверим, мож индивидуальный анализ
individualAnalyse(dialog.getIndividualCheckUp(), shedule);
}
break;
case ModalDialog.DLG_CANCEL:
//отмена
shedule.restore();//откатим шедулю
break;
case ModalDialog.DLG_NEXTRESULT:
//в лабораторию
trySincShedule(shedule);
if (!shedule.getCheckupSet().isEmpty()){
PanelAnalyse panelAnalyse = new PanelAnalyse(getContainer(), shedule);
PageGeneric page = getContainer().addNewPage(panelAnalyse, null);
getContainer().activatePage(page);
} else{
MessageBox.showWarning("Панель "+PanelAnalyse.class.getSimpleName()+
" не может быть открыта \n т.к. в расписание не включены анализы!");
}
break;
}
refreshData();
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
/**
* Пробует сохранить шедулю, если не удалось - откатит
* @param shedule шедуля на сохранение
* @return эксепшн сгенеренный при сохранении
*/
private void trySincShedule(CheckupSheduleLocal shedule) throws ClipsException {
if (shedule.isDirty()) {
try {
//пытаемся сохранить шедулю
shedule.save1();
} catch (ClipsException ex) {
//Не получилось сохранить
shedule.restore();//восстанавливаем
throw ex;
}
}
}
private void btRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btRefreshActionPerformed
try {
refreshData();
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}//GEN-LAST:event_btRefreshActionPerformed
private void btChangeSheduleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btChangeSheduleActionPerformed
if (jTable1.getSelectedRowCount() > 0) {
openDialog();
}
}//GEN-LAST:event_btChangeSheduleActionPerformed
/**
* Вызов диалога редактирования элемента расписания, обработка результатов
* @param evt
*/
private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTable1MouseClicked
if (errorMode) {
return;
}
if (evt.getClickCount() == 2) {
openDialog();
}
}//GEN-LAST:event_jTable1MouseClicked
private void jScrollPane1ComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jScrollPane1ComponentResized
resizeColumn();
}//GEN-LAST:event_jScrollPane1ComponentResized
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btChangeShedule;
private javax.swing.JButton btRefresh;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private cli_fmw.utils.sorted_table.SortedTable jTable1;
// End of variables declaration//GEN-END:variables
@Override
public String getPageTitle() {
return "Расписание анализов";
}
public String getPageIcon() {
return "";
}
/**
* Оставил старый код, так как таблица может менять число своих колонок
*/
private void resizeColumn() {
if (errorMode) {
return;
}
int r = jScrollPane1.getViewportBorderBounds().width;
int n = 20 + TableModelAnalyseShedule.DAYS * 3;
jTable1.getColumnModel().getColumn(TableModelAnalyseShedule.COL_TYPE).setPreferredWidth(r *
7 / n);
jTable1.getColumnModel().getColumn(TableModelAnalyseShedule.COL_WORK_LIFE).setPreferredWidth(r *
6 / n);
jTable1.getColumnModel().getColumn(TableModelAnalyseShedule.COL_OUT_SHEDULE).setPreferredWidth(r *
4 / n);
jTable1.getColumnModel().getColumn(TableModelAnalyseShedule.COL_IN_SHEDULE).setPreferredWidth(r *
3 / n);
for (int i = 0; i < TableModelAnalyseShedule.DAYS; i++) {
jTable1.getColumnModel().getColumn(TableModelAnalyseShedule.COL_COUNT + i).setPreferredWidth(r *
3 / n);
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("Accept") && (Boolean) evt.getNewValue() == true) {
updateTable();
}
}
@Override
public void beforeActivate() {
}
@Override
public void beforeDeactivate() {
System.out.println("beforeDeactivate");
}
@Override
public boolean canBeActivated() {
try {
refreshData();
} catch (ClipsException ex) {
MessageBox.showException(ex);
return false;
}
System.out.println("canBeActivated");
return true;
}
@Override
public boolean canBeDeactivated() {
System.out.println("canBeDeactivated");
return true;
}
@Override
public DelegateLine2 getDelegate() {
return null;
}
}