OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Rev

Rev 144 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * 
 * Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
 * 
 * The contents of this file are subject to the terms of the GNU General Public License Version 3
 * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
 * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
 * language governing permissions and limitations under the License.
 * 
 * When distributing the software, include this License Header Notice in each file.
 */
 
 package org.openconcerto.task.ui;

import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.task.UserTaskRight;
import org.openconcerto.ui.DisplayabilityListener;
import org.openconcerto.utils.ExceptionHandler;

import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.ListModel;

public class UserRightPanelDetail extends JPanel {

    JLabel labelDocumentation1 = new JLabel("");
    JLabel labelDocumentation2 = new JLabel("");
    private final UserListModel model;
    private final SQLTable tableTacheRights;
    UserTaskRightListCellRenderer cellRenderer1 = new UserTaskRightListCellRenderer(UserTaskRightListCellRenderer.READ);
    UserTaskRightListCellRenderer cellRenderer2 = new UserTaskRightListCellRenderer(UserTaskRightListCellRenderer.MODIFY);
    UserTaskRightListCellRenderer cellRenderer3 = new UserTaskRightListCellRenderer(UserTaskRightListCellRenderer.ADD);
    UserTaskRightListCellRenderer cellRenderer4 = new UserTaskRightListCellRenderer(UserTaskRightListCellRenderer.VALIDATE);
    private User selectedUser;
    private JList list1;
    private JList list2;
    private JList list3;
    private JList list4;

    UserRightPanelDetail(final UserManager uMngr, final DBRoot root) {
        this.model = new UserListModel(uMngr);
        this.tableTacheRights = root.getTable("TACHE_RIGHTS");
        this.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(4, 10, 2, 2);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 4;
        labelDocumentation1.setFont(labelDocumentation1.getFont().deriveFont(Font.BOLD));
        this.add(labelDocumentation1, c);
        c.gridy++;
        c.insets = new Insets(0, 10, 10, 2);
        this.add(labelDocumentation2, c);
        c.gridy++;
        c.insets = new Insets(0, 0, 0, 0);
        this.add(new JSeparator(JSeparator.HORIZONTAL), c);

        c.fill = GridBagConstraints.BOTH;
        c.insets = new Insets(2, 10, 2, 10);
        //
        c.gridwidth = 1;
        c.weightx = 1;
        int YTOP = c.gridy + 1;

        c.gridy = YTOP;
        c.weighty = 0;
        JLabel label1 = new JLabel("Voir les tâches assignées à:");
        this.add(label1, c);
        c.gridy++;
        list1 = new JList(model);
        list1.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                swapOnDoubleClick(list1, e, "READ");
            }
        });
        list1.setCellRenderer(cellRenderer1);
        c.weighty = 1;
        this.add(new JScrollPane(list1), c);
        //
        c.gridx++;
        c.gridy = YTOP;
        c.weighty = 0;
        JLabel label2 = new JLabel("Modifier les tâches créées par:");

        this.add(label2, c);
        c.gridy++;
        list2 = new JList(model);
        list2.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                swapOnDoubleClick(list2, e, "MODIFY");
            }
        });
        list2.setCellRenderer(cellRenderer2);
        c.weighty = 1;
        this.add(new JScrollPane(list2), c);
        //
        c.gridx++;
        c.gridy = YTOP;
        c.weighty = 0;
        JLabel label3 = new JLabel("Assigner des tâches à:");
        this.add(label3, c);
        c.gridy++;
        list3 = new JList(model);
        list3.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                swapOnDoubleClick(list3, e, "ADD");
            }
        });
        list3.setCellRenderer(cellRenderer3);
        c.weighty = 1;
        this.add(new JScrollPane(list3), c);
        //
        c.gridx++;
        c.gridy = YTOP;
        c.weighty = 0;
        JLabel label4 = new JLabel("Valider les tâches de:");
        this.add(label4, c);
        c.gridy++;
        list4 = new JList(model);
        list4.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                swapOnDoubleClick(list4, e, "VALIDATE");
            }
        });
        list4.setCellRenderer(cellRenderer4);
        c.weighty = 1;
        this.add(new JScrollPane(list4), c);

        c.weighty = 0;
        c.gridy++;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridwidth = 4;
        JLabel labelHelp = new JLabel("Une autorisation désactivée apparait en gris clair");
        labelHelp.setIcon(new ImageIcon(UserRightPanelDetail.class.getResource("toc_open.gif")));
        this.add(labelHelp, c);

        this.addHierarchyListener(new DisplayabilityListener() {
            @Override
            protected void displayabilityChanged(Component c) {
                if (c.isDisplayable())
                    model.start();
                else
                    model.stop();
            }
        });

        setUser(null);
    }

    /**
     * @param list
     * @param e
     */
    private void swapOnDoubleClick(final JList list, MouseEvent e, String field) {
        if (e.getClickCount() == 2) {
            int index = list.locationToIndex(e.getPoint());
            if (index >= 0) {
                ListModel dlm = list.getModel();
                Object item = dlm.getElementAt(index);
                list.ensureIndexIsVisible(index);
                User toUser = (User) item;
                swapState(selectedUser, toUser, field);
            }
        }
    }

    protected void swapState(User user, User toUser, String field) {
        final SQLSelect sel = new SQLSelect();
        sel.addSelectStar(tableTacheRights);
        Where where = new Where(tableTacheRights.getField("ID_USER_COMMON"), "=", user.getId());
        where = where.and(new Where(tableTacheRights.getField("ID_USER_COMMON_TO"), "=", toUser.getId()));
        sel.setWhere(where);

        final List<SQLRow> rows = SQLRowListRSH.execute(sel);
        final SQLRowValues rowV;
        if (rows.size() == 0) {
            rowV = new SQLRowValues(tableTacheRights);
            rowV.put("ID_USER_COMMON", user.getId());
            rowV.put("ID_USER_COMMON_TO", toUser.getId());
            rowV.put(field, Boolean.TRUE);
        } else if (rows.size() == 1) {
            final SQLRow row = rows.get(0);
            rowV = row.createEmptyUpdateRow();
            rowV.put(field, !row.getBoolean(field));
        } else {
            throw new IllegalStateException("More than one row : " + rows);
        }

        try {
            rowV.commit();
            setUser(this.selectedUser);
        } catch (SQLException e1) {
            ExceptionHandler.handle(this, "Impossible de changer la valeur", e1);
        }
    }

    public void setUser(User selectedUser) {
        if (selectedUser == null) {
            labelDocumentation1.setText(" Veuillez sélectionner un utilisateur");
            labelDocumentation2.setText(" Pour cela, cliquez sur un nom de la liste de gauche");
            list1.setEnabled(false);
            list2.setEnabled(false);
            list3.setEnabled(false);
            list4.setEnabled(false);
            return;
        }

        this.selectedUser = selectedUser;

        labelDocumentation1.setText(" Autorisations de l'utilisateur " + selectedUser.getFirstName() + " " + selectedUser.getName());
        labelDocumentation2.setText(" Double cliquez sur un nom d'une des colonnes suivantes pour activer/désactiver le droit correspondant.");
        List<UserTaskRight> l = UserTaskRight.getUserTaskRight(selectedUser);
        cellRenderer1.setUserTaskRight(l);
        cellRenderer2.setUserTaskRight(l);
        cellRenderer3.setUserTaskRight(l);
        cellRenderer4.setUserTaskRight(l);
        model.clearAndReload();
        list1.setEnabled(true);
        list2.setEnabled(true);
        list3.setEnabled(true);
        list4.setEnabled(true);
    }

}