Package clips.shedule.prorumble

Source Code of clips.shedule.prorumble.PanelProrumble

/*
* PanelProrumble.java
*
* Created on 5 июль 2008 г., 11:53
*/
package clips.shedule.prorumble;

import TimeTable.Day;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.delegate.DelegateLine2;
import cli_fmw.utils.SelectorEditableExceptional;
import clips.delegate.directory.simple.prorumble.DirectoryProrumbleItem;
import clips.delegate.shedule.prorumble.SheduleProrumbleData;
import clips.delegate.shedule.prorumble.SheduleProrumbleLocal;
import cli_fmw.main.PageContainer;
import cli_fmw.main.PageGeneric;
import cli_fmw.main.Persistentable;
import cli_fmw.main.Printable;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.SelectorEditable;
import cli_fmw.main.ClipsException;
import cli_fmw.main.ContentStateListener;
import cli_fmw.main.PrintCreators;
import cli_fmw.utils.table_config_states.StateSaver;
import clips.delegate.directory.ro.DirectoryCollaborator;
import clips.delegate.directory.ro.DirectoryCollaboratorItem;
import clips.delegate.directory.simple.prorumble.DirectoryProrumble;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

/**
* Панель просмотра и редактирования и пропусков за месяц
* @author  petr
*/
public class PanelProrumble extends PageGeneric implements Persistentable, Printable {

    private int month; //просматриваемый месяц 1-12
    private int year; //просматриваемый год
    private DirectoryCollaboratorItem collab;//коллаб у которого смотрим пропуски
    private SheduleProrumbleLocal prorumbleLocal;//делегат пропусков
    private SelectorEditable<SheduleProrumbleData> prorumbleSelector;//селектор пропусков за месяц
    private HashMap<Integer, SheduleProrumbleData> prorumbleMap;//пропуски
    private int size;
    private DirectoryCollaborator dirColl;

    /**
     * Конструктор
     * @param container
     * @throws cli_fmw.delegate.exception.ClipsException
     */
    public PanelProrumble(final PageContainer container) throws ClipsException {
        super(container);
        initComponents();

        //подгружаем справочник типов пропусков
        DirectoryProrumble directorySimple = DirectoryLocator.getDirectory(DirectoryProrumble.class);
        SelectorEditableExceptional<DirectoryProrumbleItem> ii = directorySimple.getItems();

        //Заполняем лист типами пропусков
        DefaultListModel listModel = new DefaultListModel();
        for (int i = 0; i < ii.size(); i++) {
            listModel.addElement(ii.get(i));
        }
        lstProrumbleTypes.setModel(listModel);
        lstProrumbleTypes.setSelectionMode(0);//выделять можно только одну строку

        //установка чузпанели коллабов
        panelSelColl.addContentStateListener(new ContentStateListener() {

            @Override
            public void contentStateChanged() {
                if (isDirty()) {
                    MessageBox.showWarning(MessageBox.W_NOT_CLOSE_EDITING);
                    return;
                } else {
                    try {
                        collab = panelSelColl.getSelectedItem();
                        prorumbleLocal = new SheduleProrumbleLocal(collab);
                        prorumbleLocal.addContentStateListener(container);
                       
                        btAddDay.setEnabled(prorumbleLocal.canModify());
                        btRemove.setEnabled(prorumbleLocal.canModify());
                        yearChooser.setEnabled(true);
                        monthChooser.setEnabled(true);
                       
                        update();
                        fireContainerEventStateChanged();
                    } catch (ClipsException ex) {
                        MessageBox.showException(ex);
                    }
                }
            }
        });
    StateSaver.attachTo(this);
    }

    /**
     * Обновление таблицы
     */
    private void update() {
        System.out.print("Update: Viewing period: " + month + "-" + year);
        //сначала определим сколько дней в месяце
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.set(GregorianCalendar.YEAR, year);
        calendar.set(GregorianCalendar.MONTH, month-1);
        size = calendar.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);//узнали сколько дней в месяце       
        prorumbleMap = new HashMap<Integer, SheduleProrumbleData>();//инициализируем мап

        if (collab != null) {//проверим что коллаб задан
            try {
                System.out.println(" Viewing collab: " + collab.toString());
                prorumbleSelector = prorumbleLocal.iterator(year, month);//берём селектор за текущий период

                for (int i = 0; i < prorumbleSelector.size(); i++) {//и переложим данные в мап, где ключ - день
                    SheduleProrumbleData spd = prorumbleSelector.get(i);
                    prorumbleMap.put(spd.getDay().getDay(), spd);
                }

                TableModelProrumble modelProrumble = new TableModelProrumble(prorumbleMap, size);//созлаём модель
                tblProrumble.setModel(modelProrumble);//ставим её в таблицу

            } catch (ClipsException ex) {
                MessageBox.showException(ex);
            }
        }
    }

    /** Creates new form PanelProrumble */
    /** 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.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane2 = new javax.swing.JScrollPane();
        lstProrumbleTypes = new javax.swing.JList();
        jPanel3 = new javax.swing.JPanel();
        panelSelColl = new clips.accountant.PanelCollaboratorSelect();
        jPanel2 = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        monthChooser = new com.toedter.calendar.JMonthChooser();
        yearChooser = new com.toedter.calendar.JYearChooser();
        jScrollPane1 = new javax.swing.JScrollPane();
        tblProrumble = new cli_fmw.utils.sorted_table.SortedTable();
        jPanel4 = new javax.swing.JPanel();
        btAddDay = new javax.swing.JButton();
        btRemove = new javax.swing.JButton();

        lstProrumbleTypes.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jScrollPane2.setViewportView(lstProrumbleTypes);

        setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
        setLayout(new java.awt.BorderLayout());

        jPanel2.setLayout(new java.awt.BorderLayout());

        jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));

        jLabel1.setText("Пропуски за месяц:");
        jPanel1.add(jLabel1);

        monthChooser.setEnabled(false);
        monthChooser.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                monthChooserPropertyChange(evt);
            }
        });
        jPanel1.add(monthChooser);

        yearChooser.setEnabled(false);
        yearChooser.setMaximum(2100);
        yearChooser.setMinimum(1900);
        yearChooser.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                yearChooserPropertyChange(evt);
            }
        });
        jPanel1.add(yearChooser);

        jPanel2.add(jPanel1, java.awt.BorderLayout.NORTH);

        jScrollPane1.setViewportView(tblProrumble);

        jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER);

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panelSelColl, javax.swing.GroupLayout.PREFERRED_SIZE, 287, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, 653, Short.MAX_VALUE)
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addComponent(panelSelColl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, 215, Short.MAX_VALUE))
        );

        add(jPanel3, java.awt.BorderLayout.CENTER);

        jPanel4.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));

        btAddDay.setText("Добавить");
        btAddDay.setEnabled(false);
        btAddDay.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btAddDayActionPerformed(evt);
            }
        });
        jPanel4.add(btAddDay);

        btRemove.setText("Удалить");
        btRemove.setEnabled(false);
        btRemove.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btRemoveActionPerformed(evt);
            }
        });
        jPanel4.add(btRemove);

        add(jPanel4, java.awt.BorderLayout.SOUTH);
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Выбор месяца
     * @param evt
     */
private void monthChooserPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_monthChooserPropertyChange
    if (isDirty() && (Integer)evt.getNewValue() != month-1) {
        MessageBox.showWarning(MessageBox.W_NOT_CLOSE_EDITING);
        monthChooser.setMonth(month-1);
    } else {
        month = monthChooser.getMonth() + 1;
        update();
    }
}//GEN-LAST:event_monthChooserPropertyChange

    /**
     * Выбор года
     * @param evt
     */
private void yearChooserPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_yearChooserPropertyChange
    if (isDirty() && (Integer)evt.getNewValue() != year) {
        MessageBox.showWarning(MessageBox.W_NOT_CLOSE_EDITING);
        System.err.println("Нииззя! Откат на: "+year);
        yearChooser.setYear(year);
        yearChooser.revalidate();       
        yearChooser.repaint();
    } else {
        year = yearChooser.getYear();
        System.err.println("Норма, ставим год: "+year);
        update();
    }
}//GEN-LAST:event_yearChooserPropertyChange

    /**
     * Клик на батоне Удалить
     * @param evt
     */
private void btRemoveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btRemoveActionPerformed
    if (tblProrumble.getSelectedRowCount() == 0) {
        MessageBox.showWarning(MessageBox.W_LIST_ELEMENT_NOT_SELECT);
        return;
    }
    int[] selects = tblProrumble.getSelectedRowsSorted();
    removeProrumbleDays(selects);
    update();
}//GEN-LAST:event_btRemoveActionPerformed

    /**
     * Клик на батоне Добавить
     * @param evt
     */
private void btAddDayActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btAddDayActionPerformed
    if (tblProrumble.getSelectedRowCount() == 0) {
        MessageBox.showWarning(MessageBox.W_LIST_ELEMENT_NOT_SELECT);
        return;
    }
    int[] selects = tblProrumble.getSelectedRowsSorted();//берём выделенные строки
    boolean needRemove = false;//флаг, тру если нужно удалить элементы в этом интервале
    if (!isDaysClear(selects)) {//проверим нет ли уже элементов в интервале
        int res = MessageBox.showConfirmYesNo(MessageBox.C_NOT_EMPTY_INTERVAL);//если есть - предложим их удалить
        if (res == MessageBox.ANSWER_YES) {//ответ да
            needRemove = true;//запомним, что надо удалить
        } else {
            return;
        }
    }
    //чиста шоп убрать выделение :)
    lstProrumbleTypes.removeSelectionInterval(0, lstProrumbleTypes.getSelectionModel().getMaxSelectionIndex());
    //спросим какого типа пропуск добавить
    int res = JOptionPane.showConfirmDialog(null, lstProrumbleTypes, "Укажите тип", JOptionPane.OK_CANCEL_OPTION, -1);
    if (res == JOptionPane.OK_OPTION) {//ок
        try {
            if (needRemove) {//вспомним надо ли было чё-то удалять
                removeProrumbleDays(selects);
            }
            DirectoryProrumbleItem proType = (DirectoryProrumbleItem) lstProrumbleTypes.getSelectedValue();
            for (int i = 0; i < selects.length; i++) {//шуршим по всем выделенным дням
                addProrumbleDay(selects[i] + 1, proType);//и добавляем пропуск
            }
        } catch (ClipsException ex) {
            MessageBox.showException(ex);
        }
    }

}//GEN-LAST:event_btAddDayActionPerformed

    /**
     * Функция удаления пропусков с заданных дней.
     * Если пропуск есть он будет удалён.
     * Если его не было, то исключения не будет.
     * @param days массив номеров дней в месяце (0..N)
     */
    private void removeProrumbleDays(int[] days){
        ArrayList<SheduleProrumbleData> listToRemove = new ArrayList<SheduleProrumbleData>();
        for (int i = 0; i<days.length; i++){
            SheduleProrumbleData prorumbleData = prorumbleMap.get(days[i]+1);
            if (prorumbleData != null){
                listToRemove.add(prorumbleData);
                System.out.println("Prorumble will be deleted: " + prorumbleData);
            }
        }
        for(int i=0;i<listToRemove.size();i++){
            prorumbleSelector.remove(listToRemove.get(i));
        }
    }


    /**
     * Функция добавляет один пропущенный день.
     * Добавление происходит в установленный месяц установленного года
     * @param day номер дня в месяце (1..N)
     * @param type тип пропуска
     * @throws cli_fmw.delegate.exception.ClipsException
     */
    @SuppressWarnings("unchecked")
    private void addProrumbleDay(int day, DirectoryProrumbleItem type) throws ClipsException {
        if (type != null) {
            SheduleProrumbleData data = new SheduleProrumbleData(collab);
            data.setDay(new Day(year, month-1, day));
            data.setType(type);
            prorumbleSelector.append(data);
            update();
        }
    }

    /**
     * Функция провряет, что все дни в массиве не содержат пропусков.     *
     * @param days массив дней (0..N)
     * @return тру если пропусков нет
     */
    private boolean isDaysClear(int[] days){
        for (int day : days){
            if (prorumbleMap.get(day+1) != null){
                return false;
            }
        }
        return true;
    }
   

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btAddDay;
    private javax.swing.JButton btRemove;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JList lstProrumbleTypes;
    private com.toedter.calendar.JMonthChooser monthChooser;
    private clips.accountant.PanelCollaboratorSelect panelSelColl;
    private cli_fmw.utils.sorted_table.SortedTable tblProrumble;
    private com.toedter.calendar.JYearChooser yearChooser;
    // End of variables declaration//GEN-END:variables

    @Override
    public String getPageTitle() {
        return "Нерабочие дни";
    }

    @Override
    public boolean isDirty() {
        if (prorumbleLocal != null) {
            return prorumbleLocal.isDirty();
        }
        return false;
    }

    @Override
    public void restore() {
        prorumbleLocal.restore();
        update();
    }

    @Override
    public void save() throws ClipsException {
        prorumbleLocal.save1();
    }

    @Override
    public DelegateLine2 getDelegate() {
        return null;
    }

    @Override
    public boolean readyForPrint() {
        return !(isDirty() || collab == null);
    }

    @Override
    public void print() {
        if (readyForPrint()) {
            TableModel model = new PrintTableModel();
           
            Calendar cal = GregorianCalendar.getInstance();
            cal.set(Calendar.MONTH, month - 1);
            String title = "Пропуски сотрудника " + collab.getTitle();
            title += " за " + cal.getDisplayName(Calendar.MONTH, Calendar.LONG, getLocale());
            title += " " + Integer.toString(year) + "г";
            PrintCreators.createGeneratedReport(title, null, null, null, model, getClass());
        }
    }
   
    class PrintTableModel extends AbstractTableModel {

        @Override
        public String getColumnName(int col) {
            if (col == 0 || col == 3) {
                return "День";
            }
            else if (col == 1 || col == 4) {
                return "Пропуск";
            }
            else {
                return "";
            }
        }              

        @Override
        public int getRowCount() {
            if (size % 2 == 0) {
                return size / 2;
            }
            else {
                return size / 2 + 1;
            }
        }

        @Override
        public int getColumnCount() {
            return 5;
        }

        @Override
        public Object getValueAt(int row, int col) {
            int day = row + 1;     
            if (col == 3 || col == 4) {
                day += size / 2;
                if (size % 2 == 1) {
                    day += 1;
                }
            }
            if (col == 2) {
                return "   ";
            }
            else if (col == 0 || col == 3) {
                if (day <= size) {
                    return day;
                }
                else {
                    return "";
                }
            }
            else {
                return prorumbleMap.get(day);
            }
        }
    }
   
}
TOP

Related Classes of clips.shedule.prorumble.PanelProrumble

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.