/* * Copyright 2011 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.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.DefaultListCellRenderer; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.ListCellRenderer; import javax.swing.ScrollPaneConstants; import org.eclipse.jgit.lib.Repository; import com.gitblit.Constants.AccessRestrictionType; import com.gitblit.Constants.AuthorizationControl; import com.gitblit.Constants.FederationStrategy; import com.gitblit.Constants.RegistrantType; import com.gitblit.models.RegistrantAccessPermission; import com.gitblit.models.RepositoryModel; import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.StringUtils; /** * Dialog to create/edit a repository. * * @author James Moger */ public class EditRepositoryDialog extends JDialog { private static final long serialVersionUID = 1L; private final String repositoryName; private final RepositoryModel repository; private boolean isCreate; private boolean canceled = true; private JTextField nameField; private JTextField descriptionField; private JCheckBox acceptNewPatchsets; private JCheckBox acceptNewTickets; private JCheckBox requireApproval; private JComboBox mergeToField; private JCheckBox useIncrementalPushTags; private JCheckBox showRemoteBranches; private JCheckBox skipSizeCalculation; private JCheckBox skipSummaryMetrics; private JCheckBox isFrozen; private JTextField mailingListsField; private JComboBox accessRestriction; private JRadioButton allowAuthenticated; private JRadioButton allowNamed; private JCheckBox allowForks; private JCheckBox verifyCommitter; private JComboBox federationStrategy; private JPalette<String> ownersPalette; private JComboBox headRefField; private JComboBox gcPeriod; private JTextField gcThreshold; private JComboBox maxActivityCommits; private RegistrantPermissionsPanel usersPalette; private JPalette<String> setsPalette; private RegistrantPermissionsPanel teamsPalette; private JPalette<String> indexedBranchesPalette; private JPalette<String> preReceivePalette; private JLabel preReceiveInherited; private JPalette<String> postReceivePalette; private JLabel postReceiveInherited; private Set<String> repositoryNames; private JPanel customFieldsPanel; private List<JTextField> customTextfields; public EditRepositoryDialog(int protocolVersion) { this(protocolVersion, new RepositoryModel()); this.isCreate = true; setTitle(Translation.get("gb.newRepository")); } public EditRepositoryDialog(int protocolVersion, RepositoryModel aRepository) { super(); this.repositoryName = aRepository.name; this.repository = new RepositoryModel(); this.repositoryNames = new HashSet<String>(); this.isCreate = false; initialize(protocolVersion, aRepository); setModal(true); setResizable(false); setTitle(Translation.get("gb.edit") + ": " + aRepository.name); setIconImage(new ImageIcon(getClass() .getResource("/gitblt-favicon.png")).getImage()); } @Override protected JRootPane createRootPane() { KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); JRootPane rootPane = new JRootPane(); rootPane.registerKeyboardAction(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { setVisible(false); } }, stroke, JComponent.WHEN_IN_FOCUSED_WINDOW); return rootPane; } private void initialize(int protocolVersion, RepositoryModel anRepository) { nameField = new JTextField(anRepository.name == null ? "" : anRepository.name, 35); descriptionField = new JTextField(anRepository.description == null ? "" : anRepository.description, 35); JTextField originField = new JTextField( anRepository.origin == null ? "" : anRepository.origin, 40); originField.setEditable(false); if (ArrayUtils.isEmpty(anRepository.availableRefs)) { headRefField = new JComboBox(); headRefField.setEnabled(false); } else { headRefField = new JComboBox( anRepository.availableRefs.toArray()); headRefField.setSelectedItem(anRepository.HEAD); } Integer [] gcPeriods = { 1, 2, 3, 4, 5, 7, 10, 14 }; gcPeriod = new JComboBox(gcPeriods); gcPeriod.setSelectedItem(anRepository.gcPeriod); gcThreshold = new JTextField(8); gcThreshold.setText(anRepository.gcThreshold); ownersPalette = new JPalette<String>(true); acceptNewTickets = new JCheckBox(Translation.get("gb.acceptsNewTicketsDescription"), anRepository.acceptNewTickets); acceptNewPatchsets = new JCheckBox(Translation.get("gb.acceptsNewPatchsetsDescription"), anRepository.acceptNewPatchsets); requireApproval = new JCheckBox(Translation.get("gb.requireApprovalDescription"), anRepository.requireApproval); if (ArrayUtils.isEmpty(anRepository.availableRefs)) { mergeToField = new JComboBox(); mergeToField.setEnabled(false); } else { mergeToField = new JComboBox( anRepository.availableRefs.toArray()); mergeToField.setSelectedItem(anRepository.mergeTo); } useIncrementalPushTags = new JCheckBox(Translation.get("gb.useIncrementalPushTagsDescription"), anRepository.useIncrementalPushTags); showRemoteBranches = new JCheckBox( Translation.get("gb.showRemoteBranchesDescription"), anRepository.showRemoteBranches); skipSizeCalculation = new JCheckBox( Translation.get("gb.skipSizeCalculationDescription"), anRepository.skipSizeCalculation); skipSummaryMetrics = new JCheckBox( Translation.get("gb.skipSummaryMetricsDescription"), anRepository.skipSummaryMetrics); isFrozen = new JCheckBox(Translation.get("gb.isFrozenDescription"), anRepository.isFrozen); maxActivityCommits = new JComboBox(new Integer [] { -1, 0, 25, 50, 75, 100, 150, 250, 500 }); maxActivityCommits.setSelectedItem(anRepository.maxActivityCommits); mailingListsField = new JTextField( ArrayUtils.isEmpty(anRepository.mailingLists) ? "" : StringUtils.flattenStrings(anRepository.mailingLists, " "), 50); accessRestriction = new JComboBox(AccessRestrictionType.values()); accessRestriction.setRenderer(new AccessRestrictionRenderer()); accessRestriction.setSelectedItem(anRepository.accessRestriction); accessRestriction.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { AccessRestrictionType art = (AccessRestrictionType) accessRestriction.getSelectedItem(); EditRepositoryDialog.this.setupAccessPermissions(art); } } }); boolean authenticated = anRepository.authorizationControl != null && AuthorizationControl.AUTHENTICATED.equals(anRepository.authorizationControl); allowAuthenticated = new JRadioButton(Translation.get("gb.allowAuthenticatedDescription")); allowAuthenticated.setSelected(authenticated); allowAuthenticated.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { usersPalette.setEnabled(false); teamsPalette.setEnabled(false); } } }); allowNamed = new JRadioButton(Translation.get("gb.allowNamedDescription")); allowNamed.setSelected(!authenticated); allowNamed.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { usersPalette.setEnabled(true); teamsPalette.setEnabled(true); } } }); ButtonGroup group = new ButtonGroup(); group.add(allowAuthenticated); group.add(allowNamed); JPanel authorizationPanel = new JPanel(new GridLayout(0, 1)); authorizationPanel.add(allowAuthenticated); authorizationPanel.add(allowNamed); allowForks = new JCheckBox(Translation.get("gb.allowForksDescription"), anRepository.allowForks); verifyCommitter = new JCheckBox(Translation.get("gb.verifyCommitterDescription"), anRepository.verifyCommitter); // federation strategies - remove ORIGIN choice if this repository has // no origin. List<FederationStrategy> federationStrategies = new ArrayList<FederationStrategy>( Arrays.asList(FederationStrategy.values())); if (StringUtils.isEmpty(anRepository.origin)) { federationStrategies.remove(FederationStrategy.FEDERATE_ORIGIN); } federationStrategy = new JComboBox(federationStrategies.toArray()); federationStrategy.setRenderer(new FederationStrategyRenderer()); federationStrategy.setSelectedItem(anRepository.federationStrategy); JPanel fieldsPanel = new JPanel(new GridLayout(0, 1)); fieldsPanel.add(newFieldPanel(Translation.get("gb.name"), nameField)); fieldsPanel.add(newFieldPanel(Translation.get("gb.description"), descriptionField)); fieldsPanel .add(newFieldPanel(Translation.get("gb.origin"), originField)); fieldsPanel.add(newFieldPanel(Translation.get("gb.headRef"), headRefField)); fieldsPanel.add(newFieldPanel(Translation.get("gb.gcPeriod"), gcPeriod)); fieldsPanel.add(newFieldPanel(Translation.get("gb.gcThreshold"), gcThreshold)); fieldsPanel.add(newFieldPanel(Translation.get("gb.acceptsNewTickets"), acceptNewTickets)); fieldsPanel.add(newFieldPanel(Translation.get("gb.acceptsNewPatchsets"), acceptNewPatchsets)); fieldsPanel.add(newFieldPanel(Translation.get("gb.requireApproval"), requireApproval)); fieldsPanel.add(newFieldPanel(Translation.get("gb.mergeTo"), mergeToField)); fieldsPanel .add(newFieldPanel(Translation.get("gb.enableIncrementalPushTags"), useIncrementalPushTags)); fieldsPanel.add(newFieldPanel(Translation.get("gb.showRemoteBranches"), showRemoteBranches)); fieldsPanel .add(newFieldPanel(Translation.get("gb.skipSizeCalculation"), skipSizeCalculation)); fieldsPanel.add(newFieldPanel(Translation.get("gb.skipSummaryMetrics"), skipSummaryMetrics)); fieldsPanel.add(newFieldPanel(Translation.get("gb.maxActivityCommits"), maxActivityCommits)); fieldsPanel.add(newFieldPanel(Translation.get("gb.mailingLists"), mailingListsField)); JPanel clonePushPanel = new JPanel(new GridLayout(0, 1)); clonePushPanel .add(newFieldPanel(Translation.get("gb.isFrozen"), isFrozen)); clonePushPanel .add(newFieldPanel(Translation.get("gb.allowForks"), allowForks)); clonePushPanel .add(newFieldPanel(Translation.get("gb.verifyCommitter"), verifyCommitter)); usersPalette = new RegistrantPermissionsPanel(RegistrantType.USER); JPanel northFieldsPanel = new JPanel(new BorderLayout(0, 5)); northFieldsPanel.add(newFieldPanel(Translation.get("gb.owners"), ownersPalette), BorderLayout.NORTH); northFieldsPanel.add(newFieldPanel(Translation.get("gb.accessRestriction"), accessRestriction), BorderLayout.CENTER); JPanel northAccessPanel = new JPanel(new BorderLayout(5, 5)); northAccessPanel.add(northFieldsPanel, BorderLayout.NORTH); northAccessPanel.add(newFieldPanel(Translation.get("gb.authorizationControl"), authorizationPanel), BorderLayout.CENTER); northAccessPanel.add(clonePushPanel, BorderLayout.SOUTH); JPanel accessPanel = new JPanel(new BorderLayout(5, 5)); accessPanel.add(northAccessPanel, BorderLayout.NORTH); accessPanel.add(newFieldPanel(Translation.get("gb.userPermissions"), usersPalette), BorderLayout.CENTER); teamsPalette = new RegistrantPermissionsPanel(RegistrantType.TEAM); JPanel teamsPanel = new JPanel(new BorderLayout(5, 5)); teamsPanel.add( newFieldPanel(Translation.get("gb.teamPermissions"), teamsPalette), BorderLayout.CENTER); setsPalette = new JPalette<String>(); JPanel federationPanel = new JPanel(new BorderLayout(5, 5)); federationPanel.add( newFieldPanel(Translation.get("gb.federationStrategy"), federationStrategy), BorderLayout.NORTH); federationPanel .add(newFieldPanel(Translation.get("gb.federationSets"), setsPalette), BorderLayout.CENTER); indexedBranchesPalette = new JPalette<String>(); JPanel indexedBranchesPanel = new JPanel(new BorderLayout(5, 5)); indexedBranchesPanel .add(newFieldPanel(Translation.get("gb.indexedBranches"), indexedBranchesPalette), BorderLayout.CENTER); preReceivePalette = new JPalette<String>(true); preReceiveInherited = new JLabel(); JPanel preReceivePanel = new JPanel(new BorderLayout(5, 5)); preReceivePanel.add(preReceivePalette, BorderLayout.CENTER); preReceivePanel.add(preReceiveInherited, BorderLayout.WEST); postReceivePalette = new JPalette<String>(true); postReceiveInherited = new JLabel(); JPanel postReceivePanel = new JPanel(new BorderLayout(5, 5)); postReceivePanel.add(postReceivePalette, BorderLayout.CENTER); postReceivePanel.add(postReceiveInherited, BorderLayout.WEST); customFieldsPanel = new JPanel(); customFieldsPanel.setLayout(new BoxLayout(customFieldsPanel, BoxLayout.Y_AXIS)); JScrollPane customFieldsScrollPane = new JScrollPane(customFieldsPanel); customFieldsScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); customFieldsScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); JTabbedPane panel = new JTabbedPane(JTabbedPane.TOP); panel.addTab(Translation.get("gb.general"), fieldsPanel); panel.addTab(Translation.get("gb.accessRestriction"), accessPanel); if (protocolVersion >= 2) { panel.addTab(Translation.get("gb.teams"), teamsPanel); } panel.addTab(Translation.get("gb.federation"), federationPanel); if (protocolVersion >= 3) { panel.addTab(Translation.get("gb.indexedBranches"), indexedBranchesPanel); } panel.addTab(Translation.get("gb.preReceiveScripts"), preReceivePanel); panel.addTab(Translation.get("gb.postReceiveScripts"), postReceivePanel); panel.addTab(Translation.get("gb.customFields"), customFieldsScrollPane); setupAccessPermissions(anRepository.accessRestriction); JButton createButton = new JButton(Translation.get("gb.save")); createButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { if (validateFields()) { canceled = false; setVisible(false); } } }); JButton cancelButton = new JButton(Translation.get("gb.cancel")); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { canceled = true; setVisible(false); } }); JPanel controls = new JPanel(); controls.add(cancelButton); controls.add(createButton); final Insets _insets = new Insets(5, 5, 5, 5); JPanel centerPanel = new JPanel(new BorderLayout(5, 5)) { private static final long serialVersionUID = 1L; @Override public Insets getInsets() { return _insets; } }; centerPanel.add(panel, BorderLayout.CENTER); centerPanel.add(controls, BorderLayout.SOUTH); getContentPane().setLayout(new BorderLayout(5, 5)); getContentPane().add(centerPanel, BorderLayout.CENTER); pack(); nameField.requestFocus(); } private JPanel newFieldPanel(String label, JComponent comp) { return newFieldPanel(label, 150, comp); } private JPanel newFieldPanel(String label, int labelSize, JComponent comp) { JLabel fieldLabel = new JLabel(label); fieldLabel.setFont(fieldLabel.getFont().deriveFont(Font.BOLD)); fieldLabel.setPreferredSize(new Dimension(labelSize, 20)); JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0)); panel.add(fieldLabel); panel.add(comp); return panel; } private void setupAccessPermissions(AccessRestrictionType art) { if (AccessRestrictionType.NONE.equals(art)) { usersPalette.setEnabled(false); teamsPalette.setEnabled(false); allowAuthenticated.setEnabled(false); allowNamed.setEnabled(false); verifyCommitter.setEnabled(false); } else { allowAuthenticated.setEnabled(true); allowNamed.setEnabled(true); verifyCommitter.setEnabled(true); if (allowNamed.isSelected()) { usersPalette.setEnabled(true); teamsPalette.setEnabled(true); } } } private boolean validateFields() { String rname = nameField.getText(); if (StringUtils.isEmpty(rname)) { error("Please enter a repository name!"); return false; } // automatically convert backslashes to forward slashes rname = rname.replace('\\', '/'); // Automatically replace // with / rname = rname.replace("//", "/"); // prohibit folder paths if (rname.startsWith("/")) { error("Leading root folder references (/) are prohibited."); return false; } if (rname.startsWith("../")) { error("Relative folder references (../) are prohibited."); return false; } if (rname.contains("/../")) { error("Relative folder references (../) are prohibited."); return false; } if (rname.endsWith("/")) { rname = rname.substring(0, rname.length() - 1); } // confirm valid characters in repository name Character c = StringUtils.findInvalidCharacter(rname); if (c != null) { error(MessageFormat.format( "Illegal character ''{0}'' in repository name!", c)); return false; } // verify repository name uniqueness on create if (isCreate) { // force repo names to lowercase // this means that repository name checking for rpc creation // is case-insensitive, regardless of the Gitblit server's // filesystem if (repositoryNames.contains(rname.toLowerCase())) { error(MessageFormat .format("Can not create repository ''{0}'' because it already exists.", rname)); return false; } } else { // check rename collision if (!repositoryName.equalsIgnoreCase(rname)) { if (repositoryNames.contains(rname.toLowerCase())) { error(MessageFormat .format("Failed to rename ''{0}'' because ''{1}'' already exists.", repositoryName, rname)); return false; } } } if (accessRestriction.getSelectedItem() == null) { error("Please select access restriction!"); return false; } if (federationStrategy.getSelectedItem() == null) { error("Please select federation strategy!"); return false; } repository.name = rname; repository.description = descriptionField.getText(); repository.owners.clear(); repository.owners.addAll(ownersPalette.getSelections()); repository.HEAD = headRefField.getSelectedItem() == null ? null : headRefField.getSelectedItem().toString(); repository.gcPeriod = (Integer) gcPeriod.getSelectedItem(); repository.gcThreshold = gcThreshold.getText(); repository.acceptNewPatchsets = acceptNewPatchsets.isSelected(); repository.acceptNewTickets = acceptNewTickets.isSelected(); repository.requireApproval = requireApproval.isSelected(); repository.mergeTo = mergeToField.getSelectedItem() == null ? null : Repository.shortenRefName(mergeToField.getSelectedItem().toString()); repository.useIncrementalPushTags = useIncrementalPushTags.isSelected(); repository.showRemoteBranches = showRemoteBranches.isSelected(); repository.skipSizeCalculation = skipSizeCalculation.isSelected(); repository.skipSummaryMetrics = skipSummaryMetrics.isSelected(); repository.maxActivityCommits = (Integer) maxActivityCommits.getSelectedItem(); repository.isFrozen = isFrozen.isSelected(); repository.allowForks = allowForks.isSelected(); repository.verifyCommitter = verifyCommitter.isSelected(); String ml = mailingListsField.getText(); if (!StringUtils.isEmpty(ml)) { Set<String> list = new HashSet<String>(); for (String address : ml.split("(,|\\s)")) { if (StringUtils.isEmpty(address)) { continue; } list.add(address.toLowerCase()); } repository.mailingLists = new ArrayList<String>(list); } repository.accessRestriction = (AccessRestrictionType) accessRestriction .getSelectedItem(); repository.authorizationControl = allowAuthenticated.isSelected() ? AuthorizationControl.AUTHENTICATED : AuthorizationControl.NAMED; repository.federationStrategy = (FederationStrategy) federationStrategy .getSelectedItem(); if (repository.federationStrategy.exceeds(FederationStrategy.EXCLUDE)) { repository.federationSets = setsPalette.getSelections(); } repository.indexedBranches = indexedBranchesPalette.getSelections(); repository.preReceiveScripts = preReceivePalette.getSelections(); repository.postReceiveScripts = postReceivePalette.getSelections(); // Custom Fields repository.customFields = new LinkedHashMap<String, String>(); if (customTextfields != null) { for (JTextField field : customTextfields) { String key = field.getName(); String value = field.getText(); repository.customFields.put(key, value); } } return true; } private void error(String message) { JOptionPane.showMessageDialog(EditRepositoryDialog.this, message, Translation.get("gb.error"), JOptionPane.ERROR_MESSAGE); } public void setAccessRestriction(AccessRestrictionType restriction) { this.accessRestriction.setSelectedItem(restriction); setupAccessPermissions(restriction); } public void setAuthorizationControl(AuthorizationControl authorization) { boolean authenticated = authorization != null && AuthorizationControl.AUTHENTICATED.equals(authorization); this.allowAuthenticated.setSelected(authenticated); this.allowNamed.setSelected(!authenticated); } public void setUsers(List<String> owners, List<String> all, List<RegistrantAccessPermission> permissions) { ownersPalette.setObjects(all, owners); usersPalette.setObjects(all, permissions); } public void setTeams(List<String> all, List<RegistrantAccessPermission> permissions) { teamsPalette.setObjects(all, permissions); } public void setRepositories(List<RepositoryModel> repositories) { repositoryNames.clear(); for (RepositoryModel repository : repositories) { // force repo names to lowercase // this means that repository name checking for rpc creation // is case-insensitive, regardless of the Gitblit server's // filesystem repositoryNames.add(repository.name.toLowerCase()); } } public void setFederationSets(List<String> all, List<String> selected) { setsPalette.setObjects(all, selected); } public void setIndexedBranches(List<String> all, List<String> selected) { indexedBranchesPalette.setObjects(all, selected); } public void setPreReceiveScripts(List<String> all, List<String> inherited, List<String> selected) { preReceivePalette.setObjects(all, selected); showInherited(inherited, preReceiveInherited); } public void setPostReceiveScripts(List<String> all, List<String> inherited, List<String> selected) { postReceivePalette.setObjects(all, selected); showInherited(inherited, postReceiveInherited); } private void showInherited(List<String> list, JLabel label) { StringBuilder sb = new StringBuilder(); if (list != null && list.size() > 0) { sb.append("<html><body><b>INHERITED</b><ul style=\"margin-left:5px;list-style-type: none;\">"); for (String script : list) { sb.append("<li>").append(script).append("</li>"); } sb.append("</ul></body></html>"); } label.setText(sb.toString()); } public RepositoryModel getRepository() { if (canceled) { return null; } return repository; } public List<RegistrantAccessPermission> getUserAccessPermissions() { return usersPalette.getPermissions(); } public List<RegistrantAccessPermission> getTeamAccessPermissions() { return teamsPalette.getPermissions(); } public void setCustomFields(RepositoryModel repository, Map<String, String> customFields) { customFieldsPanel.removeAll(); customTextfields = new ArrayList<JTextField>(); final Insets insets = new Insets(5, 5, 5, 5); JPanel fields = new JPanel(new GridLayout(0, 1, 0, 5)) { private static final long serialVersionUID = 1L; @Override public Insets getInsets() { return insets; } }; for (Map.Entry<String, String> entry : customFields.entrySet()) { String field = entry.getKey(); String value = ""; if (repository.customFields != null && repository.customFields.containsKey(field)) { value = repository.customFields.get(field); } JTextField textField = new JTextField(value); textField.setName(field); textField.setPreferredSize(new Dimension(450, 26)); fields.add(newFieldPanel(entry.getValue(), 250, textField)); customTextfields.add(textField); } JScrollPane jsp = new JScrollPane(fields); jsp.getVerticalScrollBar().setBlockIncrement(100); jsp.getVerticalScrollBar().setUnitIncrement(100); jsp.setViewportBorder(null); customFieldsPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); customFieldsPanel.add(jsp); } /** * ListCellRenderer to display descriptive text about the access * restriction. * */ private class AccessRestrictionRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof AccessRestrictionType) { AccessRestrictionType restriction = (AccessRestrictionType) value; switch (restriction) { case NONE: setText(Translation.get("gb.notRestricted")); break; case PUSH: setText(Translation.get("gb.pushRestricted")); break; case CLONE: setText(Translation.get("gb.cloneRestricted")); break; case VIEW: setText(Translation.get("gb.viewRestricted")); break; } } else { setText(value.toString()); } return this; } } /** * ListCellRenderer to display descriptive text about the federation * strategy. */ private class FederationStrategyRenderer extends JLabel implements ListCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (value instanceof FederationStrategy) { FederationStrategy strategy = (FederationStrategy) value; switch (strategy) { case EXCLUDE: setText(Translation.get("gb.excludeFromFederation")); break; case FEDERATE_THIS: setText(Translation.get("gb.federateThis")); break; case FEDERATE_ORIGIN: setText(Translation.get("gb.federateOrigin")); break; } } else { setText(value.toString()); } return this; } } }