James Moger
2012-09-10 fabe060d3a435f116128851f828e35c2af5fde67
commit | author | age
38688b 1 /*
JM 2  * Copyright 2011 gitblit.com.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.gitblit.client;
17
18 import java.awt.BorderLayout;
19 import java.awt.Dimension;
20 import java.awt.FlowLayout;
21 import java.awt.GridLayout;
22 import java.awt.Insets;
23 import java.awt.event.ActionEvent;
24 import java.awt.event.ActionListener;
25 import java.awt.event.KeyAdapter;
26 import java.awt.event.KeyEvent;
27 import java.awt.event.MouseAdapter;
28 import java.awt.event.MouseEvent;
29 import java.io.IOException;
30 import java.util.HashMap;
31 import java.util.Map;
32
33 import javax.swing.ImageIcon;
34 import javax.swing.JButton;
35 import javax.swing.JLabel;
36 import javax.swing.JOptionPane;
37 import javax.swing.JPanel;
38 import javax.swing.JScrollPane;
39 import javax.swing.JTable;
40 import javax.swing.JTextField;
41 import javax.swing.RowFilter;
42 import javax.swing.event.ListSelectionEvent;
43 import javax.swing.event.ListSelectionListener;
44 import javax.swing.table.TableRowSorter;
45
46 import com.gitblit.Constants.RpcRequest;
47 import com.gitblit.models.SettingModel;
48 import com.gitblit.utils.StringUtils;
49
50 /**
51  * Settings panel displays a list of server settings and their associated
52  * metadata. This panel also allows editing of a setting.
53  * 
54  * @author James Moger
55  * 
56  */
57 public class SettingsPanel extends JPanel {
58
59     private static final long serialVersionUID = 1L;
60
61     private final GitblitClient gitblit;
62
63     private HeaderPanel header;
64
65     private JTable table;
66
67     private SettingsTableModel tableModel;
68
69     private TableRowSorter<SettingsTableModel> defaultSorter;
70
71     private JTextField filterTextfield;
72
73     public SettingsPanel(GitblitClient gitblit) {
74         super();
75         this.gitblit = gitblit;
76         initialize();
77     }
78
79     private void initialize() {
80         JButton refreshSettings = new JButton(Translation.get("gb.refresh"));
81         refreshSettings.addActionListener(new ActionListener() {
82             public void actionPerformed(ActionEvent e) {
83                 refreshSettings();
84             }
85         });
86
87         final JButton editSetting = new JButton(Translation.get("gb.edit"));
88         editSetting.addActionListener(new ActionListener() {
89             public void actionPerformed(ActionEvent e) {
90                 int viewRow = table.getSelectedRow();
91                 int modelRow = table.convertRowIndexToModel(viewRow);
92                 String key = tableModel.keys.get(modelRow);
93                 SettingModel setting = tableModel.settings.get(key);
94                 editSetting(setting);
95             }
96         });
97
98         NameRenderer nameRenderer = new NameRenderer();
99         final SettingPanel settingPanel = new SettingPanel();
100         tableModel = new SettingsTableModel();
101         defaultSorter = new TableRowSorter<SettingsTableModel>(tableModel);
102         table = Utils.newTable(tableModel, Utils.DATE_FORMAT);
103         table.setDefaultRenderer(SettingModel.class, new SettingCellRenderer());
104         String name = table.getColumnName(UsersTableModel.Columns.Name.ordinal());
105         table.setRowHeight(nameRenderer.getFont().getSize() + 8);
106         table.getColumn(name).setCellRenderer(nameRenderer);
107         table.setRowSorter(defaultSorter);
108         table.getRowSorter().toggleSortOrder(SettingsTableModel.Columns.Name.ordinal());
109         table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
110
111             @Override
112             public void valueChanged(ListSelectionEvent e) {
113                 if (e.getValueIsAdjusting()) {
114                     return;
115                 }
116                 boolean singleSelection = table.getSelectedRows().length == 1;
117                 editSetting.setEnabled(singleSelection);
118                 if (singleSelection) {
119                     int viewRow = table.getSelectedRow();
120                     int modelRow = table.convertRowIndexToModel(viewRow);
121                     SettingModel setting = tableModel.get(modelRow);
122                     settingPanel.setSetting(setting);
123                 } else {
124                     settingPanel.clear();
125                 }
126             }
127         });
128         table.addMouseListener(new MouseAdapter() {
129             public void mouseClicked(MouseEvent e) {
130                 if (e.getClickCount() == 2) {
131                     int viewRow = table.getSelectedRow();
132                     int modelRow = table.convertRowIndexToModel(viewRow);
133                     SettingModel setting = tableModel.get(modelRow);
134                     editSetting(setting);
135                 }
136             }
137         });
138
139         filterTextfield = new JTextField();
140         filterTextfield.addActionListener(new ActionListener() {
141             public void actionPerformed(ActionEvent e) {
142                 filterSettings(filterTextfield.getText());
143             }
144         });
145         filterTextfield.addKeyListener(new KeyAdapter() {
146             public void keyReleased(KeyEvent e) {
147                 filterSettings(filterTextfield.getText());
148             }
149         });
150
151         JPanel settingFilterPanel = new JPanel(new BorderLayout(Utils.MARGIN, Utils.MARGIN));
152         settingFilterPanel.add(new JLabel(Translation.get("gb.filter")), BorderLayout.WEST);
153         settingFilterPanel.add(filterTextfield, BorderLayout.CENTER);
154
155         JPanel settingsTablePanel = new JPanel(new BorderLayout(Utils.MARGIN, Utils.MARGIN));
156         settingsTablePanel.add(settingFilterPanel, BorderLayout.NORTH);
157         settingsTablePanel.add(new JScrollPane(table), BorderLayout.CENTER);
158         settingsTablePanel.add(settingPanel, BorderLayout.SOUTH);
159
160         JPanel settingsControls = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
161         settingsControls.add(refreshSettings);
162         settingsControls.add(editSetting);
163
164         setLayout(new BorderLayout(Utils.MARGIN, Utils.MARGIN));
165         header = new HeaderPanel(Translation.get("gb.settings"), "settings_16x16.png");
166         add(header, BorderLayout.NORTH);
167         add(settingsTablePanel, BorderLayout.CENTER);
168         add(settingsControls, BorderLayout.SOUTH);
169     }
170     
171     @Override
172     public void requestFocus() {
173         filterTextfield.requestFocus();
174     }
175
176     @Override
177     public Insets getInsets() {
178         return Utils.INSETS;
179     }
180
181     protected void updateTable(boolean pack) {
182         tableModel.setSettings(gitblit.getSettings());
183         tableModel.fireTableDataChanged();
184         header.setText(Translation.get("gb.settings"));
185         if (pack) {
186             Utils.packColumns(table, Utils.MARGIN);
187         }
188     }
189
190     private void filterSettings(final String fragment) {
191         if (StringUtils.isEmpty(fragment)) {
192             table.setRowSorter(defaultSorter);
193             return;
194         }
195         RowFilter<SettingsTableModel, Object> containsFilter = new RowFilter<SettingsTableModel, Object>() {
196             public boolean include(Entry<? extends SettingsTableModel, ? extends Object> entry) {
197                 for (int i = entry.getValueCount() - 1; i >= 0; i--) {
198                     if (entry.getStringValue(i).toLowerCase().contains(fragment.toLowerCase())) {
199                         return true;
200                     }
201                 }
202                 return false;
203             }
204         };
205         TableRowSorter<SettingsTableModel> sorter = new TableRowSorter<SettingsTableModel>(
206                 tableModel);
207         sorter.setRowFilter(containsFilter);
208         table.setRowSorter(sorter);
209     }
210
211     protected void refreshSettings() {
212         GitblitWorker worker = new GitblitWorker(SettingsPanel.this, RpcRequest.LIST_SETTINGS) {
213             @Override
214             protected Boolean doRequest() throws IOException {
215                 gitblit.refreshSettings();
216                 return true;
217             }
218
219             @Override
220             protected void onSuccess() {
221                 updateTable(false);
222             }
223         };
224         worker.execute();
225     }
226
227     protected void editSetting(final SettingModel settingModel) {
228         final JTextField textField = new JTextField(settingModel.currentValue);
229         JPanel editPanel = new JPanel(new GridLayout(0, 1));
230         editPanel.add(new JLabel("New Value"));
231         editPanel.add(textField);
232
233         JPanel settingPanel = new JPanel(new BorderLayout());
234         settingPanel.add(new SettingPanel(settingModel), BorderLayout.CENTER);
235         settingPanel.add(editPanel, BorderLayout.SOUTH);
236         settingPanel.setPreferredSize(new Dimension(800, 200));
237
238         String[] options;
239         if (settingModel.currentValue.equals(settingModel.defaultValue)) {
240             options = new String[] { Translation.get("gb.cancel"), Translation.get("gb.save") };
241         } else {
242             options = new String[] { Translation.get("gb.cancel"),
243                     Translation.get("gb.setDefault"), Translation.get("gb.save") };
244         }
245         String defaultOption = options[0];
246         int selection = JOptionPane.showOptionDialog(SettingsPanel.this, settingPanel,
247                 settingModel.name, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
248                 new ImageIcon(getClass().getResource("/settings_16x16.png")), options,
249                 defaultOption);
250         if (selection <= 0) {
251             return;
252         }
253         if (options[selection].equals(Translation.get("gb.setDefault"))) {
254             textField.setText(settingModel.defaultValue);
255         }
256         final Map<String, String> newSettings = new HashMap<String, String>();
257         newSettings.put(settingModel.name, textField.getText().trim());
258         GitblitWorker worker = new GitblitWorker(SettingsPanel.this, RpcRequest.EDIT_SETTINGS) {
259             @Override
260             protected Boolean doRequest() throws IOException {
261                 boolean success = gitblit.updateSettings(newSettings);
262                 if (success) {
263                     gitblit.refreshSettings();
264                 }
265                 return success;
266             }
267
268             @Override
269             protected void onSuccess() {
270                 updateTable(false);
271             }
272         };
273         worker.execute();
274     }
275 }