/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cli_fmw.rights_m;
import cli_fmw.delegate.collaborator.CollaboratorLocalAbstract;
import cli_fmw.main.ClipsException;
import cli_fmw.utils.MessageBox;
import framework.security.UserRight;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import framework.security.UserRightsGroup;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
*
* @author petr
*/
public class TableModelUserRightsM extends AbstractTableModel {
private ArrayList<UserRight> rights;
private CollaboratorLocalAbstract collabLoc;
private Map<UserRightsGroup, Integer> maskMap = new HashMap<UserRightsGroup, Integer>();
// private Set<UserRights> visibleRights;
// private UserInfo user;
public static final int COLUMN_RIGHTS = 0;
public static final int COLUMN_CHECKS = 1;
public static final int COLUMN_COUNT = 2;
/**
*
* @param group
* @param collaborator may be null
* @throws cli_fmw.main.ClipsException
*/
public TableModelUserRightsM(UserRightsGroup group, CollaboratorLocalAbstract collaborator) throws ClipsException {
this(group.getRights(), collaborator);
}
public TableModelUserRightsM() {
rights = new ArrayList<UserRight>();
collabLoc = null;
}
public TableModelUserRightsM(Set<UserRight> allRts, CollaboratorLocalAbstract collaborator) throws ClipsException {
if(collaborator == null){
throw new IllegalArgumentException("collaborator must not be null");
}
collabLoc = collaborator;
for (UserRight ur : allRts) {
if(maskMap.get(ur.getGroup()) == null){
maskMap.put(ur.getGroup(), collaborator.getRightMask(ur.getGroup()));
}
}
rights = new ArrayList<UserRight>(allRts);
Collections.sort(rights);
}
@Override
public int getRowCount() {
return rights.size();
}
@Override
public int getColumnCount() {
return COLUMN_COUNT;
}
@Override
public void setValueAt(Object obj, int row, int col) {// изменение таблицы
if(col == COLUMN_CHECKS){
Boolean set = (Boolean) obj;
UserRight r = rights.get(row);
UserRightsGroup group = r.getGroup();
int mask = maskMap.get(group);
if(set){
mask = mask | r.getRightsMask();
}else{
mask = excludeFromMask(r);
}
try {
collabLoc.setRightsMask(group, mask);
maskMap.put(group, mask);
} catch (ClipsException ex) {
MessageBox.showExceptionOnly(ex);
}
}
fireTableDataChanged();
}
@Override
public Object getValueAt(int row, int col) {// загрузка таблицы
if(col == COLUMN_RIGHTS){
return rights.get(row).toString();
}
if(col == COLUMN_CHECKS){
UserRight ur = rights.get(row);
return hasRight(ur);
}
return null;
}
@Override
public Class getColumnClass(int columnIndex) {
if(columnIndex == COLUMN_CHECKS) {
return Boolean.class;
}
return super.getColumnClass(columnIndex);
}
@Override
public void addTableModelListener(TableModelListener arg0) {
super.addTableModelListener(arg0);
}
@Override
public String getColumnName(int col) {
String s = "";
if(col == COLUMN_RIGHTS) {
s = "Право";
}
if(col == COLUMN_CHECKS) {
s = "Наличие";
}
return s;
}
@Override
public boolean isCellEditable(int row, int col) {
if(col == COLUMN_CHECKS) {
UserRight ur = rights.get(row);
int mask = maskMap.get(ur.getGroup());
return (mask != excludeFromMask(ur))||(!(Boolean)getValueAt(row, col)) ;
}
return false;
}
private boolean hasRight(UserRight ur){
int mask = maskMap.get(ur.getGroup());
int rightsMask = ur.getRightsMask();
boolean res = mask == (mask | rightsMask);
return res;
}
private int excludeFromMask(UserRight r){
int newMask = 0;
Set<UserRight> groupRights = r.getGroup().getRights();
for (UserRight ur : groupRights) {
if (ur != r && hasRight(ur)){
newMask = newMask | ur.getRightsMask();
}
}
return newMask;
}
}