/**
* Copyright (c) 2009 Juwi MacMillan Group GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.juwimm.cms.gui.table;
import static de.juwimm.cms.common.Constants.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;
import de.juwimm.cms.authorization.vo.GroupValue;
import de.juwimm.cms.authorization.vo.UserUnitsGroupsValue;
import de.juwimm.cms.authorization.vo.UserValue;
import de.juwimm.cms.vo.UnitSlimValue;
/**
* @author Dirk Bogun
* @author <a href="mailto:carsten.schalm@juwimm.com">Carsten Schalm</a>
* , Juwi|MacMillan Group Gmbh, Walsrode, Germany
* @version $Id$
*/
public class UserTableModel extends AbstractTableModel {
private static final long serialVersionUID = 7715989623457225719L;
private Vector<String> columnNames = new Vector<String>(5);
private Vector<Object> vRows = new Vector<Object>();
private boolean editable = false;
public UserTableModel(boolean editable) {
super();
this.editable = editable;
if (editable) {
columnNames = new Vector<String>(5);
} else {
columnNames = new Vector<String>(4);
}
columnNames.addElement(rb.getString("user.userName"));
columnNames.addElement(rb.getString("user.firstName"));
columnNames.addElement(rb.getString("user.lastName"));
columnNames.addElement(rb.getString("user.eMail"));
if (editable) {
columnNames.addElement(rb.getString("user.groups"));
}
}
public UserTableModel(UserValue[] vec) {
this(true);
addRows(vec);
}
public void addRow(UserValue dao) {
Object[] obj = new Object[6];
obj[0] = dao.getUserName();
obj[1] = dao.getFirstName() != null ? dao.getFirstName() : "";
obj[2] = dao.getLastName() != null ? dao.getLastName() : "";
obj[3] = dao.getEmail() != null ? dao.getEmail() : "";
obj[4] = "";
obj[5] = dao;
addRow(obj);
}
public void addRows(UserValue[] vec) {
for (int i = 0; i < vec.length; i++) {
UserValue dao = vec[i];
this.addRow(dao);
}
}
public UserTableModel(UserUnitsGroupsValue[] vec, boolean showGroups) {
this(showGroups);
addRows(vec);
}
public void addRow(UserUnitsGroupsValue dao) {
Object[] obj = new Object[7];
obj[0] = dao.getUser().getUserName();
obj[1] = dao.getUser().getFirstName() != null ? dao.getUser().getFirstName() : "";
obj[2] = dao.getUser().getLastName() != null ? dao.getUser().getLastName() : "";
obj[3] = dao.getUser().getEmail() != null ? dao.getUser().getEmail() : "";
obj[4] = this.getOrderedGroups(dao.getGroups());
obj[5] = this.getOrderedUnits(dao.getUnits());
obj[6] = dao.getUser();
addRow(obj);
}
public void addRows(UserUnitsGroupsValue[] vec) {
for (int i = 0; i < vec.length; i++) {
UserUnitsGroupsValue dao = vec[i];
this.addRow(dao);
}
}
public int getColumnCount() {
return columnNames.size();
}
public int getRowCount() {
return vRows.size();
}
@Override
public String getColumnName(int col) {
if (columnNames.size() >= col) { return columnNames.elementAt(col); }
return "";
}
public void setColumnName(int col, String name) {
if (columnNames.size() == 0 || col >= columnNames.size()) {
columnNames.addElement(name);
} else {
columnNames.setElementAt(name, col);
}
}
public Object getValueAt(int row, int col) {
try {
return ((Object[]) vRows.elementAt(row))[col];
} catch (Exception ex) {
return null;
}
}
@Override
public void setValueAt(Object value, int row, int col) {
Object[] array = (Object[]) vRows.elementAt(row);
array[col] = value;
fireTableCellUpdated(row, col);
}
/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
@Override
public Class getColumnClass(int c) {
try {
return getValueAt(0, c).getClass();
} catch (Exception ex) {
return null;
}
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
@Override
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (editable) { return (col != 0 && col != 4); }
return false;
}
public void addRow(Object[] obj) {
vRows.addElement(obj);
fireTableRowsInserted(getRowCount(), getRowCount());
}
public void insertRow(Object[] obj) {
if (getRowCount() == 0) {
vRows.addElement(obj);
} else {
vRows.insertElementAt(obj, 0);
}
fireTableRowsInserted(getRowCount(), getRowCount());
}
public void removeRow(int i) {
vRows.removeElementAt(i);
this.fireTableRowsDeleted(i, i);
}
public Object[] getRow(int i) {
return (Object[]) vRows.elementAt(i);
}
private String getOrderedGroups(GroupValue[] groups) {
StringBuffer sb = new StringBuffer();
if (groups != null) {
Arrays.sort(groups, new GroupNameComparator());
for (int i = 0; i < groups.length; i++) {
if (sb.length() > 0) sb.append(", ");
sb.append(groups[i].getGroupName());
}
}
return sb.toString();
}
private String getOrderedUnits(UnitSlimValue[] units) {
StringBuffer sb = new StringBuffer();
if (units != null) {
Arrays.sort(units, new UnitNameComparator());
for (int i = 0; i < units.length; i++) {
if (sb.length() > 0) sb.append(", ");
sb.append(units[i].getName());
}
}
return sb.toString();
}
public class GroupNameComparator implements Comparator {
public int compare(Object o1, Object o2) {
GroupValue gv1 = (GroupValue) o1;
GroupValue gv2 = (GroupValue) o2;
if (gv1.getGroupName() == null) return -1;
if (gv2.getGroupName() == null) return 1;
return gv1.getGroupName().compareTo(gv2.getGroupName());
}
}
public class UnitNameComparator implements Comparator {
public int compare(Object o1, Object o2) {
UnitSlimValue usv1 = (UnitSlimValue) o1;
UnitSlimValue usv2 = (UnitSlimValue) o2;
if (usv1.getName() == null) return -1;
if (usv2.getName() == null) return 1;
return usv1.getName().compareTo(usv2.getName());
}
}
}