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