| /* | |
| * 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.Dimension; | |
| import java.awt.FlowLayout; | |
| import java.awt.GridLayout; | |
| import java.awt.Insets; | |
| import java.awt.event.ActionEvent; | |
| import java.awt.event.ActionListener; | |
| import java.awt.event.KeyAdapter; | |
| import java.awt.event.KeyEvent; | |
| import java.awt.event.MouseAdapter; | |
| import java.awt.event.MouseEvent; | |
| import java.io.IOException; | |
| import java.util.HashMap; | |
| import java.util.Map; | |
| import javax.swing.ImageIcon; | |
| import javax.swing.JButton; | |
| import javax.swing.JLabel; | |
| import javax.swing.JOptionPane; | |
| import javax.swing.JPanel; | |
| import javax.swing.JScrollPane; | |
| import javax.swing.JTable; | |
| import javax.swing.JTextField; | |
| import javax.swing.RowFilter; | |
| import javax.swing.event.ListSelectionEvent; | |
| import javax.swing.event.ListSelectionListener; | |
| import javax.swing.table.TableRowSorter; | |
| import com.gitblit.Constants.RpcRequest; | |
| import com.gitblit.models.SettingModel; | |
| import com.gitblit.utils.StringUtils; | |
| /** | |
| * Settings panel displays a list of server settings and their associated | |
| * metadata. This panel also allows editing of a setting. | |
| * | |
| * @author James Moger | |
| * | |
| */ | |
| public class SettingsPanel extends JPanel { | |
| private static final long serialVersionUID = 1L; | |
| private final GitblitClient gitblit; | |
| private HeaderPanel header; | |
| private JTable table; | |
| private SettingsTableModel tableModel; | |
| private TableRowSorter<SettingsTableModel> defaultSorter; | |
| private JTextField filterTextfield; | |
| public SettingsPanel(GitblitClient gitblit) { | |
| super(); | |
| this.gitblit = gitblit; | |
| initialize(); | |
| } | |
| private void initialize() { | |
| JButton refreshSettings = new JButton(Translation.get("gb.refresh")); | |
| refreshSettings.addActionListener(new ActionListener() { | |
| @Override | |
| public void actionPerformed(ActionEvent e) { | |
| refreshSettings(); | |
| } | |
| }); | |
| final JButton editSetting = new JButton(Translation.get("gb.edit")); | |
| editSetting.addActionListener(new ActionListener() { | |
| @Override | |
| public void actionPerformed(ActionEvent e) { | |
| int viewRow = table.getSelectedRow(); | |
| int modelRow = table.convertRowIndexToModel(viewRow); | |
| String key = tableModel.keys.get(modelRow); | |
| SettingModel setting = tableModel.settings.get(key); | |
| editSetting(setting); | |
| } | |
| }); | |
| NameRenderer nameRenderer = new NameRenderer(); | |
| final SettingPanel settingPanel = new SettingPanel(); | |
| tableModel = new SettingsTableModel(); | |
| defaultSorter = new TableRowSorter<SettingsTableModel>(tableModel); | |
| table = Utils.newTable(tableModel, Utils.DATE_FORMAT); | |
| table.setDefaultRenderer(SettingModel.class, new SettingCellRenderer()); | |
| String name = table.getColumnName(UsersTableModel.Columns.Name.ordinal()); | |
| table.getColumn(name).setCellRenderer(nameRenderer); | |
| table.setRowSorter(defaultSorter); | |
| table.getRowSorter().toggleSortOrder(SettingsTableModel.Columns.Name.ordinal()); | |
| table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { | |
| @Override | |
| public void valueChanged(ListSelectionEvent e) { | |
| if (e.getValueIsAdjusting()) { | |
| return; | |
| } | |
| boolean singleSelection = table.getSelectedRows().length == 1; | |
| editSetting.setEnabled(singleSelection); | |
| if (singleSelection) { | |
| int viewRow = table.getSelectedRow(); | |
| int modelRow = table.convertRowIndexToModel(viewRow); | |
| SettingModel setting = tableModel.get(modelRow); | |
| settingPanel.setSetting(setting); | |
| } else { | |
| settingPanel.clear(); | |
| } | |
| } | |
| }); | |
| table.addMouseListener(new MouseAdapter() { | |
| @Override | |
| public void mouseClicked(MouseEvent e) { | |
| if (e.getClickCount() == 2) { | |
| int viewRow = table.getSelectedRow(); | |
| int modelRow = table.convertRowIndexToModel(viewRow); | |
| SettingModel setting = tableModel.get(modelRow); | |
| editSetting(setting); | |
| } | |
| } | |
| }); | |
| filterTextfield = new JTextField(); | |
| filterTextfield.addActionListener(new ActionListener() { | |
| @Override | |
| public void actionPerformed(ActionEvent e) { | |
| filterSettings(filterTextfield.getText()); | |
| } | |
| }); | |
| filterTextfield.addKeyListener(new KeyAdapter() { | |
| @Override | |
| public void keyReleased(KeyEvent e) { | |
| filterSettings(filterTextfield.getText()); | |
| } | |
| }); | |
| JPanel settingFilterPanel = new JPanel(new BorderLayout(Utils.MARGIN, Utils.MARGIN)); | |
| settingFilterPanel.add(new JLabel(Translation.get("gb.filter")), BorderLayout.WEST); | |
| settingFilterPanel.add(filterTextfield, BorderLayout.CENTER); | |
| JPanel settingsTablePanel = new JPanel(new BorderLayout(Utils.MARGIN, Utils.MARGIN)); | |
| settingsTablePanel.add(settingFilterPanel, BorderLayout.NORTH); | |
| settingsTablePanel.add(new JScrollPane(table), BorderLayout.CENTER); | |
| settingsTablePanel.add(settingPanel, BorderLayout.SOUTH); | |
| JPanel settingsControls = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0)); | |
| settingsControls.add(refreshSettings); | |
| settingsControls.add(editSetting); | |
| setLayout(new BorderLayout(Utils.MARGIN, Utils.MARGIN)); | |
| header = new HeaderPanel(Translation.get("gb.settings"), "settings_16x16.png"); | |
| add(header, BorderLayout.NORTH); | |
| add(settingsTablePanel, BorderLayout.CENTER); | |
| add(settingsControls, BorderLayout.SOUTH); | |
| } | |
| @Override | |
| public void requestFocus() { | |
| filterTextfield.requestFocus(); | |
| } | |
| @Override | |
| public Insets getInsets() { | |
| return Utils.INSETS; | |
| } | |
| protected void updateTable(boolean pack) { | |
| tableModel.setSettings(gitblit.getSettings()); | |
| tableModel.fireTableDataChanged(); | |
| header.setText(Translation.get("gb.settings")); | |
| if (pack) { | |
| Utils.packColumns(table, Utils.MARGIN); | |
| } | |
| } | |
| private void filterSettings(final String fragment) { | |
| if (StringUtils.isEmpty(fragment)) { | |
| table.setRowSorter(defaultSorter); | |
| return; | |
| } | |
| RowFilter<SettingsTableModel, Object> containsFilter = new RowFilter<SettingsTableModel, Object>() { | |
| @Override | |
| public boolean include(Entry<? extends SettingsTableModel, ? extends Object> entry) { | |
| for (int i = entry.getValueCount() - 1; i >= 0; i--) { | |
| if (entry.getStringValue(i).toLowerCase().contains(fragment.toLowerCase())) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| }; | |
| TableRowSorter<SettingsTableModel> sorter = new TableRowSorter<SettingsTableModel>( | |
| tableModel); | |
| sorter.setRowFilter(containsFilter); | |
| table.setRowSorter(sorter); | |
| } | |
| protected void refreshSettings() { | |
| GitblitWorker worker = new GitblitWorker(SettingsPanel.this, RpcRequest.LIST_SETTINGS) { | |
| @Override | |
| protected Boolean doRequest() throws IOException { | |
| gitblit.refreshSettings(); | |
| return true; | |
| } | |
| @Override | |
| protected void onSuccess() { | |
| updateTable(false); | |
| } | |
| }; | |
| worker.execute(); | |
| } | |
| protected void editSetting(final SettingModel settingModel) { | |
| final JTextField textField = new JTextField(settingModel.currentValue); | |
| JPanel editPanel = new JPanel(new GridLayout(0, 1)); | |
| editPanel.add(new JLabel("New Value")); | |
| editPanel.add(textField); | |
| JPanel settingPanel = new JPanel(new BorderLayout()); | |
| settingPanel.add(new SettingPanel(settingModel), BorderLayout.CENTER); | |
| settingPanel.add(editPanel, BorderLayout.SOUTH); | |
| settingPanel.setPreferredSize(new Dimension(800, 200)); | |
| String[] options; | |
| if (settingModel.currentValue.equals(settingModel.defaultValue)) { | |
| options = new String[] { Translation.get("gb.cancel"), Translation.get("gb.save") }; | |
| } else { | |
| options = new String[] { Translation.get("gb.cancel"), | |
| Translation.get("gb.setDefault"), Translation.get("gb.save") }; | |
| } | |
| String defaultOption = options[0]; | |
| int selection = JOptionPane.showOptionDialog(SettingsPanel.this, settingPanel, | |
| settingModel.name, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, | |
| new ImageIcon(getClass().getResource("/settings_16x16.png")), options, | |
| defaultOption); | |
| if (selection <= 0) { | |
| return; | |
| } | |
| if (options[selection].equals(Translation.get("gb.setDefault"))) { | |
| textField.setText(settingModel.defaultValue); | |
| } | |
| final Map<String, String> newSettings = new HashMap<String, String>(); | |
| newSettings.put(settingModel.name, textField.getText().trim()); | |
| GitblitWorker worker = new GitblitWorker(SettingsPanel.this, RpcRequest.EDIT_SETTINGS) { | |
| @Override | |
| protected Boolean doRequest() throws IOException { | |
| boolean success = gitblit.updateSettings(newSettings); | |
| if (success) { | |
| gitblit.refreshSettings(); | |
| } | |
| return success; | |
| } | |
| @Override | |
| protected void onSuccess() { | |
| updateTable(false); | |
| } | |
| }; | |
| worker.execute(); | |
| } | |
| } |