// 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 }