/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cli_fmw.administrator.arm;
import cli_fmw.delegate.collaborator.ArmLocal;
import cli_fmw.main.ClipsException;
import cli_fmw.utils.MessageBox;
import framework.security.UserRight;
import framework.security.UserRightsGroup;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
/**
*
* @author petr
*/
class TableModelArmRights extends AbstractTableModel {
private ArrayList<UserRight> rights;
private ArmLocal armLocal;
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 TableModelArmRights(UserRightsGroup group, ArmLocal arm) throws ClipsException {
this(group.getRights(), arm);
}
public TableModelArmRights() {
rights = new ArrayList<UserRight>();
armLocal = null;
}
public TableModelArmRights(Set<UserRight> allRts, ArmLocal arm) throws ClipsException {
if(arm == null){
throw new IllegalArgumentException("collaborator must not be null");
}
armLocal = arm;
for (UserRight ur : allRts) {
if(maskMap.get(ur.getGroup()) == null){
maskMap.put(ur.getGroup(), arm.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 {
armLocal.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());
boolean res = (mask != excludeFromMask(ur))||(!(Boolean)getValueAt(row, col)) ;
return res;
}
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;
}
}