/**
* 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.admin;
import static de.juwimm.cms.client.beans.Application.getBean;
import static de.juwimm.cms.common.Constants.rb;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.Collator;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.apache.log4j.Logger;
import de.juwimm.cms.authorization.vo.GroupValue;
import de.juwimm.cms.authorization.vo.RoleValue;
import de.juwimm.cms.client.beans.Beans;
import de.juwimm.cms.common.Constants;
import de.juwimm.cms.common.UserRights;
import de.juwimm.cms.deploy.actions.ExportPersonDataThread;
import de.juwimm.cms.exceptions.UnitnameIsAlreadyUsedException;
import de.juwimm.cms.gui.controls.ReloadablePanel;
import de.juwimm.cms.util.Communication;
import de.juwimm.cms.util.UIConstants;
import de.juwimm.cms.vo.UnitValue;
import de.juwimm.swing.DropDownHolder;
import de.juwimm.swing.NoResizeScrollPane;
/**
* <p>Title: juwimm cms</p>
* <p>Description: content management system</p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: juwi macmillan group gmbh</p>
* @author Dirk Bogun
* @version $Id$
*/
public class PanUnitGroup extends JPanel implements ReloadablePanel {
private static Logger log = Logger.getLogger(PanUnitGroup.class);
private Communication comm = ((Communication) getBean(Beans.COMMUNICATION));
private DefaultListModel dlmUnits = new DefaultListModel();
private DefaultListModel dlmRoles = new DefaultListModel();
private DefaultListModel dlmGroups = new DefaultListModel();
private JPanel panGroups = new JPanel();
private JPanel panUnits = new JPanel();
private JList lstUnits = null;
private JList lstRoles = new JList();
private JList lstGroups = new JList();
private TitledBorder borderGroups;
private TitledBorder borderUnits;
private JScrollPane scrollGroups = new NoResizeScrollPane();
private JScrollPane scrollRoles = new NoResizeScrollPane();
private JButton btnUnitAdd = new JButton();
private JButton btnUnitDelete = new JButton();
private JButton btnUnitEdit = new JButton();
private JButton btnAddGroup = new JButton();
private JButton btnDelGroup = new JButton();
private JButton btnSave = new JButton();
private JButton btnExportPersonData = new JButton();
public PanUnitGroup() {
try {
setDoubleBuffered(true);
lstRoles.setCellRenderer(new RolesCellRenderer());
lstRoles.setModel(dlmRoles);
lstGroups.setModel(dlmGroups);
lstGroups.addListSelectionListener(new GroupListSelectionListener());
jbInit();
reload();
btnUnitAdd.setText(rb.getString("dialog.add"));
btnUnitDelete.setText(rb.getString("dialog.delete"));
btnUnitEdit.setText(rb.getString("dialog.change"));
btnAddGroup.setText(rb.getString("dialog.add"));
btnDelGroup.setText(rb.getString("dialog.delete"));
btnSave.setText(rb.getString("dialog.save"));
btnExportPersonData.setText(rb.getString("panel.panelCmsUnit.exportPersonData"));
} catch (Exception exe) {
log.error("Initialization Error", exe);
}
}
void jbInit() throws Exception {
borderGroups = new TitledBorder(rb.getString("panel.panelCmsUnit.groups"));
borderUnits = new TitledBorder(rb.getString("panel.panelCmsUnit.units"));
lstGroups.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
btnAddGroup.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnAddGroupActionPerformed(e);
}
});
btnDelGroup.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnDelGroupActionPerformed(e);
}
});
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
save();
}
});
scrollGroups.getViewport().add(lstGroups, null);
scrollRoles.getViewport().add(lstRoles, null);
this.setLayout(new GridBagLayout());
//btnUnitAdd.setText("Hinzufügen");
btnUnitAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addUnitActionPerformed(e);
}
});
//btnUnitDelete.setText("Löschen");
btnUnitDelete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
deleteUnitActionPerformed(e);
}
});
btnUnitEdit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
editUnitActionPerformed(e);
}
});
//btnUnitEdit.setText("Ändern");
btnExportPersonData.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnExportPersonDataActionPerformed(e);
}
});
JScrollPane scrollPane = new NoResizeScrollPane(this.getLstUnits());
panGroups.setBorder(borderGroups);
panGroups.setLayout(new GridBagLayout());
panUnits.setBorder(borderUnits);
panUnits.setLayout(new GridBagLayout());
/*
btnAddGroup.setText("Hinzuf�gen");
btnDelGroup.setText("L�schen");
btnSave.setText("Speichern");
*/
this.add(panGroups, new GridBagConstraints(1, 0, 1, 1, 0.6, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(10, 10, 10, 10), 0, 0));
this.add(panUnits, new GridBagConstraints(0, 0, 1, 1, 0.4, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(10, 10, 10, 0), 0, 0));
panUnits.add(btnUnitAdd, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 10, 10), 0, 0));
panUnits.add(btnUnitEdit, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 10, 10), 0, 0));
panUnits.add(btnUnitDelete, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 10, 10), 0, 0));
panUnits.add(scrollPane, new GridBagConstraints(0, 0, 1, 3, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 10, 10, 10), 0, 0));
if (comm.isUserInRole(UserRights.SITE_ROOT)) {
panUnits.add(btnExportPersonData, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0, 10, 10, 10), 0, 0));
}
panGroups.add(scrollRoles, new GridBagConstraints(1, 2, 1, 1, 1.0, 0.6, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 10, 10, 0), 0, 0));
panGroups.add(scrollGroups, new GridBagConstraints(0, 0, 2, 2, 1.0, 0.4, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 10, 10, 0), 0, 0));
panGroups.add(btnAddGroup, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 10, 10, 10), 4, 0));
panGroups.add(btnDelGroup, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 10, 10, 10), 0, 0));
panGroups.add(btnSave, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0, 10, 0, 10), 0, 0));
}
public void reload() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setButtonsEnabled(false);
fillUnits();
fillRoles();
fillGroups();
setButtonsEnabled(true);
}
});
}
private void setButtonsEnabled(boolean enabled) {
if (!enabled) {
// disable all buttons
btnUnitAdd.setEnabled(enabled);
btnUnitDelete.setEnabled(enabled);
btnUnitEdit.setEnabled(enabled);
btnAddGroup.setEnabled(enabled);
btnDelGroup.setEnabled(enabled);
btnSave.setEnabled(enabled);
btnExportPersonData.setEnabled(enabled);
scrollRoles.setEnabled(enabled);
} else {
// enable only some
btnUnitAdd.setEnabled(enabled);
btnAddGroup.setEnabled(enabled);
btnSave.setEnabled(enabled);
btnExportPersonData.setEnabled(enabled);
}
}
public void unload() {
}
private void fillUnits() {
try {
this.getLstUnits().clearSelection();
dlmUnits.removeAllElements();
UnitValue[] uda = comm.getAllUnits();
if (uda != null) {
for (int i = 0; i < uda.length; i++) {
UnitValue ud = uda[i];
dlmUnits.addElement(new DropDownHolder(ud, ud.getName()));
}
}
} catch (Exception exe) {
log.error("Error filling units", exe);
}
}
private void fillGroups() {
dlmGroups.removeAllElements();
lstRoles.clearSelection();
GroupValue[] gv = comm.getAllGroups();
if (gv != null) {
for (int i = 0; i < gv.length; i++) {
dlmGroups.addElement(new DropDownHolder(gv[i], gv[i].getGroupName()));
}
}
}
private void fillRoles() {
try {
dlmRoles.removeAllElements();
RoleValue[] rva = null;
if (comm.isUserInRole(UserRights.SITE_ROOT)) {
rva = comm.getAllRoles();
} else {
rva = comm.getRolesMe();
}
sortRoles(rva);
for (int i = 0; i < rva.length; i++) {
dlmRoles.addElement(rva[i]);
}
} catch (Exception exe) {
log.error("Error filling roles", exe);
}
}
private void sortRoles(RoleValue[] rva) { //bubble bubble :)
Collator collator = Collator.getInstance(Constants.CMS_LOCALE);
RoleValue tmp;
if (rva.length == 1) { return; }
for (int i = 0; i < rva.length; i++) {
for (int j = i + 1; j < rva.length; j++) {
if (collator.compare(roleView(rva[i].getRoleId()), roleView(rva[j].getRoleId())) > 0) {
tmp = rva[i];
rva[i] = rva[j];
rva[j] = tmp;
}
}
}
}
private String roleView(String role) {
String ret = role;
try {
ret = rb.getString("ROLE." + ret);
} catch (Exception exe) {
}
return ret;
}
/**
*
*/
private class GroupListSelectionListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) return;
if (lstGroups.isSelectionEmpty()) {
btnDelGroup.setEnabled(false);
btnSave.setEnabled(false);
scrollRoles.setEnabled(false);
lstRoles.clearSelection();
} else {
btnDelGroup.setEnabled(true);
scrollRoles.setEnabled(true);
btnSave.setEnabled(true);
try {
GroupValue gv = (GroupValue) ((DropDownHolder) lstGroups.getSelectedValue()).getObject();
RoleValue[] rv = gv.getRoles();
if (rv != null) {
int[] selIdx = new int[rv.length];
for (int i = 0; i < rv.length; i++) {
for (int li = 0; li < dlmRoles.size(); li++) {
RoleValue r = (RoleValue) dlmRoles.get(li);
if (r.getRoleId().equalsIgnoreCase(rv[i].getRoleId())) {
selIdx[i] = li;
break;
} else {
selIdx[i] = -1;
}
}
}
lstRoles.setSelectedIndices(selIdx);
} else {
// no roles => no selection
lstRoles.clearSelection();
}
} catch (Exception exe) {
}
}
}
}
/**
*
*/
private class RolesCellRenderer extends DefaultListCellRenderer implements ListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
return super.getListCellRendererComponent(list, roleView(((RoleValue) value).getRoleId()), index, isSelected, cellHasFocus);
}
}
private void addUnitActionPerformed(ActionEvent e) {
String unitName;
unitName = JOptionPane.showInputDialog(UIConstants.getMainFrame(), rb.getString("panel.panelCmsUnit.addNewUnitMessage"), rb.getString("dialog.title"), JOptionPane.PLAIN_MESSAGE);
if (unitName != null) {
if (unitName.trim().equals("")) {
JOptionPane.showMessageDialog(UIConstants.getMainFrame(), rb.getString("panel.panelCmsUnit.addNewUnitEmptyMessage"), rb.getString("dialog.title"), JOptionPane.WARNING_MESSAGE);
} else {
try {
int unitId = comm.createUnit(unitName.trim());
SwingUtilities.invokeLater(new Runnable() {
public void run() {
fillUnits();
}
});
} catch (UnitnameIsAlreadyUsedException uia) {
JOptionPane.showMessageDialog(UIConstants.getMainFrame(), rb.getString("exception.UnitnameIsAlreadyUsed"), rb.getString("dialog.title"), JOptionPane.ERROR_MESSAGE);
} catch (Exception exe) {
log.error("Error adding unit", exe);
}
}
}
}
private void deleteUnitActionPerformed(ActionEvent e) {
try {
UnitValue unit = (UnitValue) ((DropDownHolder) this.getLstUnits().getSelectedValue()).getObject();
comm.removeUnit(unit);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
fillUnits();
}
});
} catch (Exception exe) {
log.error("Error delete unit", exe);
}
}
private void editUnitActionPerformed(ActionEvent e) {
try {
String oldName = ((DropDownHolder) this.getLstUnits().getSelectedValue()).toString();
String unitName = null;
unitName = JOptionPane.showInputDialog(UIConstants.getMainFrame(), rb.getString("panel.panelCmsUnit.addNewUnitMessage"), ((DropDownHolder) this.getLstUnits().getSelectedValue()).toString());
if (unitName != null && !unitName.trim().equalsIgnoreCase("") && !unitName.trim().equals(oldName)) {
UnitValue unit = (UnitValue) ((DropDownHolder) this.getLstUnits().getSelectedValue()).getObject();
unit.setName(unitName.trim());
comm.updateUnit(unit);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
fillUnits();
}
});
}
} catch (Exception exe) {
log.error("Error editing unit", exe);
}
}
private void btnAddGroupActionPerformed(ActionEvent e) {
String groupName = JOptionPane.showInputDialog(UIConstants.getMainFrame(), rb.getString("panel.panelCmsUnit.addNewGroupMessage"), rb.getString("dialog.title"), JOptionPane.PLAIN_MESSAGE);
if (groupName != null && !groupName.equalsIgnoreCase("")) {
try {
GroupValue gv = comm.createGroup(groupName);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
fillGroups();
}
});
int id = dlmGroups.indexOf(gv);
lstGroups.setSelectedIndex(id);
} catch (Exception exe) {
JOptionPane.showMessageDialog(UIConstants.getMainFrame(), rb.getString("exception.groupEditor.addGroup"), rb.getString("dialog.title"), JOptionPane.ERROR_MESSAGE);
}
}
}
void btnDelGroupActionPerformed(ActionEvent e) {
Object selObj = lstGroups.getSelectedValue();
if (selObj != null) {
try {
GroupValue gv = (GroupValue) ((DropDownHolder) selObj).getObject();
comm.removeGroup(gv.getGroupId());
SwingUtilities.invokeLater(new Runnable() {
public void run() {
fillGroups();
}
});
} catch (Exception exe) {
JOptionPane.showMessageDialog(UIConstants.getMainFrame(), rb.getString("exception.groupEditor.delGroup"), rb.getString("dialog.title"), JOptionPane.ERROR_MESSAGE);
}
}
}
public void save() {
Object selObj = lstGroups.getSelectedValue();
if (selObj != null) {
try {
GroupValue gv = (GroupValue) ((DropDownHolder) selObj).getObject();
Object[] obarr = lstRoles.getSelectedValues();
/*RoleValue[] rvold = gv.getRoles();
ArrayList alNew = new ArrayList(obarr.length);
ArrayList alDel = new ArrayList(obarr.length);
for(int i=0;i<obarr.length;i++) { //find out new one
RoleValue rv = (RoleValue) obarr[i];
boolean found = false;
for(int j=0;j<rvold.length;j++) {
if(rvold[j].equals(rv)) {
found = true;
break;
}
}
if(!found) { //new one
alNew.add(rv);
}
}
for(int i=0;i<rvold.length;i++) { //find out deleted one
boolean found = false;
for(int j=0;j<obarr.length;j++) {
RoleValue rv = (RoleValue) obarr[j];
if(rvold[i].equals(rv)) {
found = true;
break;
}
}
if(!found) { //new one
alDel.add(rvold[i]);
}
}
gv.setAddedRoles((RoleValue[]) alNew.toArray(new RoleValue[alNew.size()]));
gv.setRemovedRoles((RoleValue[]) alDel.toArray(new RoleValue[alDel.size()]));
*/
RoleValue[] rva = new RoleValue[obarr.length];
for (int i = 0; i < obarr.length; i++) {
rva[i] = (RoleValue) obarr[i];
}
gv.setRoles(rva);
comm.updateGroup(gv);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
fillGroups();
}
});
} catch (Exception exe) {
log.error("Error filling groups", exe);
JOptionPane.showMessageDialog(UIConstants.getMainFrame(), rb.getString("exception.groupEditor.updateGroup"), rb.getString("dialog.title"), JOptionPane.ERROR_MESSAGE);
}
}
}
private void btnExportPersonDataActionPerformed(ActionEvent e) {
new ExportPersonDataThread().start();
}
private JList getLstUnits() {
if (lstUnits == null) {
lstUnits = new JList(this.dlmUnits);
lstUnits.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lstUnits.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) return;
if (lstUnits.isSelectionEmpty()) {
btnUnitEdit.setEnabled(false);
btnUnitDelete.setEnabled(false);
} else {
btnUnitEdit.setEnabled(true);
btnUnitDelete.setEnabled(true);
}
}
});
}
return lstUnits;
}
}