/* * Copyright 2012 gitblit.com. * * 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.gitblit.client; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.DefaultCellEditor; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.table.DefaultTableCellRenderer; import com.gitblit.Constants.AccessPermission; import com.gitblit.Constants.PermissionType; import com.gitblit.Constants.RegistrantType; import com.gitblit.client.Utils.RowRenderer; import com.gitblit.models.RegistrantAccessPermission; import com.gitblit.utils.StringUtils; public class RegistrantPermissionsPanel extends JPanel { private static final long serialVersionUID = 1L; private JTable permissionsTable; private RegistrantPermissionsTableModel tableModel; private DefaultComboBoxModel registrantModel; private JComboBox registrantSelector; private JComboBox permissionSelector; private JButton addButton; private JPanel addPanel; public RegistrantPermissionsPanel(final RegistrantType registrantType) { super(new BorderLayout(5, 5)); tableModel = new RegistrantPermissionsTableModel(); permissionsTable = Utils.newTable(tableModel, Utils.DATE_FORMAT, new RowRenderer() { Color clear = new Color(0, 0, 0, 0); Color iceGray = new Color(0xf0, 0xf0, 0xf0); @Override public void prepareRow(Component c, boolean isSelected, int row, int column) { if (isSelected) { c.setBackground(permissionsTable.getSelectionBackground()); } else { if (tableModel.permissions.get(row).mutable) { c.setBackground(clear); } else { c.setBackground(iceGray); } } } }); permissionsTable.setModel(tableModel); permissionsTable.setPreferredScrollableViewportSize(new Dimension(400, 150)); JScrollPane jsp = new JScrollPane(permissionsTable); add(jsp, BorderLayout.CENTER); permissionsTable.getColumnModel().getColumn(RegistrantPermissionsTableModel.Columns.Registrant.ordinal()) .setCellRenderer(new NameRenderer()); permissionsTable.getColumnModel().getColumn(RegistrantPermissionsTableModel.Columns.Type.ordinal()) .setCellRenderer(new PermissionTypeRenderer()); permissionsTable.getColumnModel().getColumn(RegistrantPermissionsTableModel.Columns.Permission.ordinal()) .setCellEditor(new AccessPermissionEditor()); registrantModel = new DefaultComboBoxModel(); registrantSelector = new JComboBox(registrantModel); permissionSelector = new JComboBox(AccessPermission.NEWPERMISSIONS); addButton = new JButton(Translation.get("gb.add")); addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (registrantSelector.getSelectedIndex() < 0) { return; } if (permissionSelector.getSelectedIndex() < 0) { return; } RegistrantAccessPermission rp = new RegistrantAccessPermission(registrantType); rp.registrant = registrantSelector.getSelectedItem().toString(); rp.permission = (AccessPermission) permissionSelector.getSelectedItem(); if (StringUtils.findInvalidCharacter(rp.registrant) != null) { rp.permissionType = PermissionType.REGEX; rp.source = rp.registrant; } else { rp.permissionType = PermissionType.EXPLICIT; } tableModel.permissions.add(rp); // resort permissions after insert to convey idea of eval order Collections.sort(tableModel.permissions); registrantModel.removeElement(rp.registrant); registrantSelector.setSelectedIndex(-1); registrantSelector.invalidate(); addPanel.setVisible(registrantModel.getSize() > 0); tableModel.fireTableDataChanged(); } }); addPanel = new JPanel(); addPanel.add(registrantSelector); addPanel.add(permissionSelector); addPanel.add(addButton); add(addPanel, BorderLayout.SOUTH); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); permissionsTable.setEnabled(enabled); registrantSelector.setEnabled(enabled); permissionSelector.setEnabled(enabled); addButton.setEnabled(enabled); } public void setObjects(List<String> registrants, List<RegistrantAccessPermission> permissions) { List<String> filtered; if (registrants == null) { filtered = new ArrayList<String>(); } else { filtered = new ArrayList<String>(registrants); } if (permissions == null) { permissions = new ArrayList<RegistrantAccessPermission>(); } for (RegistrantAccessPermission rp : permissions) { if (rp.mutable) { // only remove editable duplicates // this allows for specifying an explicit permission filtered.remove(rp.registrant); } else if (rp.isAdmin()) { // administrators can not have their permission changed filtered.remove(rp.registrant); } else if (rp.isOwner()) { // owners can not have their permission changed filtered.remove(rp.registrant); } } for (String registrant : filtered) { registrantModel.addElement(registrant); } tableModel.setPermissions(permissions); registrantSelector.setSelectedIndex(-1); permissionSelector.setSelectedIndex(-1); addPanel.setVisible(filtered.size() > 0); } public List<RegistrantAccessPermission> getPermissions() { return tableModel.permissions; } private class AccessPermissionEditor extends DefaultCellEditor { private static final long serialVersionUID = 1L; public AccessPermissionEditor() { super(new JComboBox(AccessPermission.values())); } } private class PermissionTypeRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; public PermissionTypeRenderer() { super(); setHorizontalAlignment(SwingConstants.CENTER); } @Override protected void setValue(Object value) { RegistrantAccessPermission ap = (RegistrantAccessPermission) value; switch (ap.permissionType) { case ADMINISTRATOR: setText(ap.source == null ? Translation.get("gb.administrator") : ap.source); setToolTipText(Translation.get("gb.administratorPermission")); break; case OWNER: setText(Translation.get("gb.owner")); setToolTipText(Translation.get("gb.ownerPermission")); break; case TEAM: setText(ap.source == null ? Translation.get("gb.team") : ap.source); setToolTipText(MessageFormat.format(Translation.get("gb.teamPermission"), ap.source)); break; case REGEX: setText("regex"); setToolTipText(MessageFormat.format(Translation.get("gb.regexPermission"), ap.source)); break; default: if (ap.isMissing()) { setText(Translation.get("gb.missing")); setToolTipText(Translation.get("gb.missingPermission")); } else { setText(""); setToolTipText(null); } break; } } } }