// Copyright 2004-2014 Jim Voris
//
// 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 com.qumasoft.guitools.admin;
import com.qumasoft.guitools.AbstractQVCSCommandDialog;
import com.qumasoft.qvcslib.response.ServerResponseListRolePrivileges;
import java.awt.Component;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
* Maintain privileges dialog.
*
* @author Jim Voris
*/
public class MaintainPrivilegesDialog extends AbstractQVCSCommandDialog implements ChangeListener {
private static final long serialVersionUID = 3895465634092576283L;
private DefaultListModel<JCheckBox> rolesPrivilegesModel = null;
private boolean newRoleFlag = false;
private boolean okFlag = false;
private final MaintainRolePrivilegesDialog maintainRolePrivilegesDialog;
/**
* Creates new form MaintainPrivilegesDialog.
* @param parent the parent frame.
* @param modal should this dialog be modal.
* @param argMaintainRolePrivilegesDialog reference to the Maintain Role Privileges dialog.
*/
public MaintainPrivilegesDialog(java.awt.Frame parent, boolean modal, MaintainRolePrivilegesDialog argMaintainRolePrivilegesDialog) {
super(parent, modal);
initComponents();
privilegesList.setCellRenderer(new MyCellRenderer());
this.maintainRolePrivilegesDialog = argMaintainRolePrivilegesDialog;
MyCheckListener checkListener = new MyCheckListener(privilegesList);
privilegesList.addMouseListener(checkListener);
privilegesList.addKeyListener(checkListener);
}
// Center this dialog. This allows us to avoid overriding the center()
// method which has protected access.
void centerDialog() {
center();
}
void setRoleName(final String roleName) {
roleNameTextField.setText(roleName);
if (0 == roleName.compareTo("ADMIN")) {
okButton.setEnabled(false);
} else {
okButton.setEnabled(true);
}
}
void setEditRoleNameFlag(boolean flag) {
roleNameTextField.setEditable(flag);
newRoleFlag = flag;
}
boolean getIsOK() {
return okFlag;
}
String getRole() {
return roleNameTextField.getText();
}
/**
* This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The content of this method is always regenerated by the Form
* Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
roleNameLabel = new javax.swing.JLabel();
roleNameTextField = new javax.swing.JTextField();
privilegesLabel = new javax.swing.JLabel();
m_PrivilegesScrollPane = new javax.swing.JScrollPane();
privilegesList = new javax.swing.JList();
okButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
setResizable(false);
roleNameLabel.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
roleNameLabel.setText("Role Name");
roleNameTextField.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
roleNameTextField.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
roleNameTextFieldKeyTyped(evt);
}
});
privilegesLabel.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
privilegesLabel.setText("Privileges");
privilegesList.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
privilegesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
privilegesList.setDoubleBuffered(true);
m_PrivilegesScrollPane.setViewportView(privilegesList);
okButton.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
okButton.setText("OK");
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
cancelButton.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
cancelButton.setText("Cancel");
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(okButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 100, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 168, Short.MAX_VALUE)
.add(cancelButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 100, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(m_PrivilegesScrollPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 368, Short.MAX_VALUE)
.add(roleNameTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 368, Short.MAX_VALUE)
.add(roleNameLabel)
.add(privilegesLabel))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(roleNameLabel)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(roleNameTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(privilegesLabel)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(m_PrivilegesScrollPane, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 340, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(okButton)
.add(cancelButton))
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void roleNameTextFieldKeyTyped(java.awt.event.KeyEvent evt)//GEN-FIRST:event_roleNameTextFieldKeyTyped
{//GEN-HEADEREND:event_roleNameTextFieldKeyTyped
if (roleNameTextField.isEditable()) {
String roleName = getRole();
roleName = roleName + evt.getKeyChar();
if (maintainRolePrivilegesDialog.isRoleInUse(roleName)) {
okButton.setEnabled(false);
} else {
if (roleName.length() > 0) {
okButton.setEnabled(true);
}
}
}
}//GEN-LAST:event_roleNameTextFieldKeyTyped
private void okButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_okButtonActionPerformed
{//GEN-HEADEREND:event_okButtonActionPerformed
okFlag = true;
dismissDialog();
}//GEN-LAST:event_okButtonActionPerformed
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cancelButtonActionPerformed
{//GEN-HEADEREND:event_cancelButtonActionPerformed
okFlag = false;
dismissDialog();
}//GEN-LAST:event_cancelButtonActionPerformed
@Override
public void dismissDialog() {
setVisible(false);
dispose();
}
Boolean[] getPrivilegesFlags() {
int size = rolesPrivilegesModel.size();
Boolean[] privilegesFlags = new Boolean[size];
int index;
for (index = 0; index < size; index++) {
privilegesFlags[index] = rolesPrivilegesModel.getElementAt(index).isSelected();
}
return privilegesFlags;
}
String[] getPrivileges() {
int size = rolesPrivilegesModel.size();
String[] privileges = new String[size];
int index;
for (index = 0; index < size; index++) {
privileges[index] = rolesPrivilegesModel.getElementAt(index).getText();
}
return privileges;
}
@Override
public void stateChanged(ChangeEvent changeEvent) {
Object change = changeEvent.getSource();
if (change instanceof ServerResponseListRolePrivileges) {
ServerResponseListRolePrivileges response = (ServerResponseListRolePrivileges) change;
String[] rolePrivileges = response.getRolePrivilegesList();
Boolean[] roleFlags = response.getRoleFlagsList();
rolesPrivilegesModel = new DefaultListModel<>();
// All the roles that are known...
for (int i = 0; i < rolePrivileges.length; i++) {
JCheckBox element = new JCheckBox();
element.setText(rolePrivileges[i]);
// Only enable the checkbox if we're working on an existing role
// and that role has enabled the given privilege
if (!newRoleFlag && roleFlags[i].booleanValue()) {
element.setSelected(true);
}
rolesPrivilegesModel.addElement(element);
}
privilegesList.setModel(rolesPrivilegesModel);
}
}
class MyCellRenderer extends JCheckBox implements ListCellRenderer {
private static final long serialVersionUID = 1L;
// This is the only method defined by ListCellRenderer.
// We just reconfigure the JCheckBox each time we're called.
@Override
public Component getListCellRendererComponent(
JList list,
Object value, // value to display
int index, // cell index
boolean isSelected, // is the cell selected
boolean cellHasFocus) // the list and the cell have the focus
{
if (value instanceof String) {
String s = (String) value;
setText(s);
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
} else if (value instanceof JCheckBox) {
JCheckBox checkBoxValue = (JCheckBox) value;
setText(checkBoxValue.getText());
setSelected(checkBoxValue.isSelected());
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
}
setEnabled(true);
setFont(list.getFont());
setOpaque(true);
return this;
}
}
class MyCheckListener implements MouseListener, KeyListener {
JList m_JList;
public MyCheckListener(JList list) {
m_JList = list;
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getX() < 20) {
doCheck();
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyChar() == ' ') {
doCheck();
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
private void doCheck() {
int index = m_JList.getSelectedIndex();
if (index < 0) {
return;
}
JCheckBox data = (JCheckBox) m_JList.getModel().getElementAt(index);
if (data.isSelected()) {
data.setSelected(false);
} else {
data.setSelected(true);
}
m_JList.repaint();
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancelButton;
private javax.swing.JScrollPane m_PrivilegesScrollPane;
private javax.swing.JButton okButton;
private javax.swing.JLabel privilegesLabel;
private javax.swing.JList privilegesList;
private javax.swing.JLabel roleNameLabel;
private javax.swing.JTextField roleNameTextField;
// End of variables declaration//GEN-END:variables
}