Package clips.analysis.shedule

Source Code of clips.analysis.shedule.PanelAnalyseShedule

/*
* 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;
    }
   
   
   
}
TOP

Related Classes of clips.analysis.shedule.PanelAnalyseShedule

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.