blob: 3d5aa4a7fa751cba5af729ec1a511f69eb24f8fc [file] [log] [blame]
/*
* 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;
}
}
}
}