From a70b43cde76b4baab82b4ce0d9ff82883f80b8df Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Wed, 26 Oct 2011 17:54:07 -0400 Subject: [PATCH] Added status icon --- src/com/gitblit/client/GitblitPanel.java | 292 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 242 insertions(+), 50 deletions(-) diff --git a/src/com/gitblit/client/GitblitPanel.java b/src/com/gitblit/client/GitblitPanel.java index 7bcaac5..9eb896b 100644 --- a/src/com/gitblit/client/GitblitPanel.java +++ b/src/com/gitblit/client/GitblitPanel.java @@ -19,18 +19,25 @@ import java.awt.Color; import java.awt.Component; import java.awt.Desktop; +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.net.URI; import java.text.MessageFormat; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JOptionPane; @@ -50,6 +57,7 @@ import com.gitblit.Constants.RpcRequest; import com.gitblit.client.ClosableTabComponent.CloseTabListener; import com.gitblit.models.RepositoryModel; +import com.gitblit.models.SettingModel; import com.gitblit.models.UserModel; import com.gitblit.utils.StringUtils; @@ -68,21 +76,21 @@ private final Insets insets = new Insets(margin, margin, margin, margin); - private GitblitModel gitblit; + private GitblitClient gitblit; private JTabbedPane tabs; private JTable repositoriesTable; - private RepositoriesModel repositoriesModel; + private RepositoriesTableModel repositoriesModel; private JTable usersTable; - private UsersModel usersModel; + private UsersTableModel usersModel; private JTable settingsTable; - private SettingsModel settingsModel; + private SettingsTableModel settingsModel; private JButton createRepository; @@ -96,26 +104,34 @@ private DefaultTableCellRenderer sizeRenderer; - private TableRowSorter<RepositoriesModel> defaultRepositoriesSorter; + private TableRowSorter<RepositoriesTableModel> defaultRepositoriesSorter; - private TableRowSorter<UsersModel> defaultUsersSorter; + private TableRowSorter<UsersTableModel> defaultUsersSorter; - private TableRowSorter<SettingsModel> defaultSettingsSorter; + private TableRowSorter<SettingsTableModel> defaultSettingsSorter; private JButton editRepository; + + private HeaderPanel repositoriesHeader; + + private HeaderPanel usersHeader; + + private HeaderPanel settingsHeader; + + private StatusPanel statusPanel; public GitblitPanel(GitblitRegistration reg) { this(reg.url, reg.account, reg.password); } public GitblitPanel(String url, String account, char[] password) { - this.gitblit = new GitblitModel(url, account, password); + this.gitblit = new GitblitClient(url, account, password); tabs = new JTabbedPane(JTabbedPane.BOTTOM); tabs.addTab(Translation.get("gb.repositories"), createRepositoriesPanel()); tabs.addTab(Translation.get("gb.users"), createUsersPanel()); - tabs.addTab(Translation.get("gb.federation"), new JPanel()); tabs.addTab(Translation.get("gb.settings"), createSettingsPanel()); + tabs.addTab(Translation.get("gb.status"), createStatusPanel()); setLayout(new BorderLayout()); add(tabs, BorderLayout.CENTER); @@ -178,17 +194,18 @@ ownerRenderer.setForeground(Color.gray); ownerRenderer.setHorizontalAlignment(SwingConstants.CENTER); - repositoriesModel = new RepositoriesModel(); - defaultRepositoriesSorter = new TableRowSorter<RepositoriesModel>(repositoriesModel); + repositoriesModel = new RepositoriesTableModel(); + defaultRepositoriesSorter = new TableRowSorter<RepositoriesTableModel>(repositoriesModel); repositoriesTable = Utils.newTable(repositoriesModel); repositoriesTable.setRowHeight(nameRenderer.getFont().getSize() + 8); repositoriesTable.setRowSorter(defaultRepositoriesSorter); - repositoriesTable.getRowSorter().toggleSortOrder(RepositoriesModel.Columns.Name.ordinal()); + repositoriesTable.getRowSorter().toggleSortOrder( + RepositoriesTableModel.Columns.Name.ordinal()); - setRepositoryRenderer(RepositoriesModel.Columns.Name, nameRenderer, -1); - setRepositoryRenderer(RepositoriesModel.Columns.Indicators, typeRenderer, 100); - setRepositoryRenderer(RepositoriesModel.Columns.Owner, ownerRenderer, -1); - setRepositoryRenderer(RepositoriesModel.Columns.Size, sizeRenderer, 60); + setRepositoryRenderer(RepositoriesTableModel.Columns.Name, nameRenderer, -1); + setRepositoryRenderer(RepositoriesTableModel.Columns.Indicators, typeRenderer, 100); + setRepositoryRenderer(RepositoriesTableModel.Columns.Owner, ownerRenderer, -1); + setRepositoryRenderer(RepositoriesTableModel.Columns.Size, sizeRenderer, 60); repositoriesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override @@ -203,12 +220,20 @@ if (selected) { int viewRow = repositoriesTable.getSelectedRow(); int modelRow = repositoriesTable.convertRowIndexToModel(viewRow); - RepositoryModel model = ((RepositoriesModel) repositoriesTable.getModel()).list + RepositoryModel model = ((RepositoriesTableModel) repositoriesTable.getModel()).list .get(modelRow); editRepository.setEnabled(singleSelection - && (gitblit.allowAdmin() || gitblit.isOwner(model))); + && (gitblit.allowManagement() || gitblit.isOwner(model))); } else { editRepository.setEnabled(false); + } + } + }); + + repositoriesTable.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2 && gitblit.allowManagement()) { + editRepository(getSelectedRepositories().get(0)); } } }); @@ -248,16 +273,17 @@ return insets; } }; - repositoriesPanel.add(new HeaderPanel(Translation.get("gb.repositories"), - "gitweb-favicon.png"), BorderLayout.NORTH); + repositoriesHeader = new HeaderPanel(Translation.get("gb.repositories"), + "gitweb-favicon.png"); + repositoriesPanel.add(repositoriesHeader, BorderLayout.NORTH); repositoriesPanel.add(repositoryTablePanel, BorderLayout.CENTER); repositoriesPanel.add(repositoryControls, BorderLayout.SOUTH); return repositoriesPanel; } - private void setRepositoryRenderer(RepositoriesModel.Columns col, TableCellRenderer renderer, - int maxWidth) { + private void setRepositoryRenderer(RepositoriesTableModel.Columns col, + TableCellRenderer renderer, int maxWidth) { String name = repositoriesTable.getColumnName(col.ordinal()); repositoriesTable.getColumn(name).setCellRenderer(renderer); if (maxWidth > 0) { @@ -297,14 +323,14 @@ } }); - usersModel = new UsersModel(); - defaultUsersSorter = new TableRowSorter<UsersModel>(usersModel); + usersModel = new UsersTableModel(); + defaultUsersSorter = new TableRowSorter<UsersTableModel>(usersModel); usersTable = Utils.newTable(usersModel); - String name = usersTable.getColumnName(UsersModel.Columns.Name.ordinal()); + String name = usersTable.getColumnName(UsersTableModel.Columns.Name.ordinal()); usersTable.setRowHeight(nameRenderer.getFont().getSize() + 8); usersTable.getColumn(name).setCellRenderer(nameRenderer); usersTable.setRowSorter(defaultUsersSorter); - usersTable.getRowSorter().toggleSortOrder(UsersModel.Columns.Name.ordinal()); + usersTable.getRowSorter().toggleSortOrder(UsersTableModel.Columns.Name.ordinal()); usersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override @@ -316,6 +342,14 @@ boolean singleSelection = usersTable.getSelectedRows().length == 1; editUser.setEnabled(singleSelection && selected); delUser.setEnabled(selected); + } + }); + + usersTable.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + editUser(getSelectedUsers().get(0)); + } } }); @@ -353,8 +387,8 @@ return insets; } }; - usersPanel.add(new HeaderPanel(Translation.get("gb.users"), "user_16x16.png"), - BorderLayout.NORTH); + usersHeader = new HeaderPanel(Translation.get("gb.users"), "user_16x16.png"); + usersPanel.add(usersHeader, BorderLayout.NORTH); usersPanel.add(userTablePanel, BorderLayout.CENTER); usersPanel.add(userControls, BorderLayout.SOUTH); @@ -362,14 +396,34 @@ } private JPanel createSettingsPanel() { - settingsModel = new SettingsModel(); - defaultSettingsSorter = new TableRowSorter<SettingsModel>(settingsModel); + JButton refreshSettings = new JButton(Translation.get("gb.refresh")); + refreshSettings.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + refreshSettings(); + } + }); + + final JButton editSetting = new JButton(Translation.get("gb.edit")); + editSetting.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int viewRow = settingsTable.getSelectedRow(); + int modelRow = settingsTable.convertRowIndexToModel(viewRow); + String key = settingsModel.keys.get(modelRow); + SettingModel setting = settingsModel.settings.get(key); + editSetting(setting); + } + }); + + final SettingPanel settingPanel = new SettingPanel(); + settingsModel = new SettingsTableModel(); + defaultSettingsSorter = new TableRowSorter<SettingsTableModel>(settingsModel); settingsTable = Utils.newTable(settingsModel); - String name = settingsTable.getColumnName(UsersModel.Columns.Name.ordinal()); + settingsTable.setDefaultRenderer(SettingModel.class, new SettingCellRenderer()); + String name = settingsTable.getColumnName(UsersTableModel.Columns.Name.ordinal()); settingsTable.setRowHeight(nameRenderer.getFont().getSize() + 8); settingsTable.getColumn(name).setCellRenderer(nameRenderer); settingsTable.setRowSorter(defaultSettingsSorter); - settingsTable.getRowSorter().toggleSortOrder(SettingsModel.Columns.Name.ordinal()); + settingsTable.getRowSorter().toggleSortOrder(SettingsTableModel.Columns.Name.ordinal()); settingsTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override @@ -377,9 +431,16 @@ if (e.getValueIsAdjusting()) { return; } - boolean selected = settingsTable.getSelectedRow() > -1; boolean singleSelection = settingsTable.getSelectedRows().length == 1; - // TODO enable/disable setting buttons + editSetting.setEnabled(singleSelection); + if (singleSelection) { + int viewRow = settingsTable.getSelectedRow(); + int modelRow = settingsTable.convertRowIndexToModel(viewRow); + SettingModel setting = settingsModel.get(modelRow); + settingPanel.setSetting(setting); + } else { + settingPanel.clear(); + } } }); @@ -402,9 +463,11 @@ JPanel settingsTablePanel = new JPanel(new BorderLayout(margin, margin)); settingsTablePanel.add(settingFilterPanel, BorderLayout.NORTH); settingsTablePanel.add(new JScrollPane(settingsTable), BorderLayout.CENTER); + settingsTablePanel.add(settingPanel, BorderLayout.SOUTH); JPanel settingsControls = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0)); - // TODO update setting? + settingsControls.add(refreshSettings); + settingsControls.add(editSetting); JPanel settingsPanel = new JPanel(new BorderLayout(margin, margin)) { @@ -414,23 +477,40 @@ return insets; } }; - settingsPanel.add(new HeaderPanel(Translation.get("gb.settings"), "settings_16x16.png"), - BorderLayout.NORTH); + settingsHeader = new HeaderPanel(Translation.get("gb.settings"), "settings_16x16.png"); + settingsPanel.add(settingsHeader, BorderLayout.NORTH); settingsPanel.add(settingsTablePanel, BorderLayout.CENTER); settingsPanel.add(settingsControls, BorderLayout.SOUTH); return settingsPanel; } + private JPanel createStatusPanel() { + JButton refreshStatus = new JButton(Translation.get("gb.refresh")); + refreshStatus.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + refreshStatus(); + } + }); + + JPanel controls = new JPanel(); + controls.add(refreshStatus); + + JPanel panel = new JPanel(new BorderLayout()); + statusPanel = new StatusPanel(); + panel.add(statusPanel, BorderLayout.CENTER); + panel.add(controls, BorderLayout.SOUTH); + return panel; + } + public void login() throws IOException { gitblit.login(); updateRepositoriesTable(); - Utils.packColumns(repositoriesTable, 2); + Utils.packColumns(repositoriesTable, 5); - if (gitblit.allowAdmin()) { + if (gitblit.allowManagement()) { updateUsersTable(); - updateSettingsTable(); } else { // user does not have administrator privileges // hide admin repository buttons @@ -439,8 +519,23 @@ delRepository.setVisible(false); while (tabs.getTabCount() > 1) { - // remove admin tabs + // remove all management/administration tabs tabs.removeTabAt(1); + } + } + + if (gitblit.allowAdministration()) { + updateSettingsTable(); + updateStatusPanel(); + Utils.packColumns(settingsTable, 5); + } else { + // remove the settings tab + String settingsTitle = Translation.get("gb.settings"); + for (int i = 0; i < tabs.getTabCount(); i++) { + if (tabs.getTitleAt(i).equals(settingsTitle)) { + tabs.removeTabAt(i); + break; + } } } } @@ -449,17 +544,25 @@ repositoriesModel.list.clear(); repositoriesModel.list.addAll(gitblit.getRepositories()); repositoriesModel.fireTableDataChanged(); + repositoriesHeader.setText(Translation.get("gb.repositories") + " (" + + gitblit.getRepositories().size() + ")"); } private void updateUsersTable() { usersModel.list.clear(); usersModel.list.addAll(gitblit.getUsers()); usersModel.fireTableDataChanged(); + usersHeader.setText(Translation.get("gb.users") + " (" + gitblit.getUsers().size() + ")"); } private void updateSettingsTable() { settingsModel.setSettings(gitblit.getSettings()); settingsModel.fireTableDataChanged(); + settingsHeader.setText(Translation.get("gb.settings")); + } + + private void updateStatusPanel() { + statusPanel.setStatus(gitblit.getStatus()); } private void filterRepositories(final String fragment) { @@ -467,8 +570,8 @@ repositoriesTable.setRowSorter(defaultRepositoriesSorter); return; } - RowFilter<RepositoriesModel, Object> containsFilter = new RowFilter<RepositoriesModel, Object>() { - public boolean include(Entry<? extends RepositoriesModel, ? extends Object> entry) { + RowFilter<RepositoriesTableModel, Object> containsFilter = new RowFilter<RepositoriesTableModel, Object>() { + public boolean include(Entry<? extends RepositoriesTableModel, ? extends Object> entry) { for (int i = entry.getValueCount() - 1; i >= 0; i--) { if (entry.getStringValue(i).toLowerCase().contains(fragment.toLowerCase())) { return true; @@ -477,7 +580,7 @@ return false; } }; - TableRowSorter<RepositoriesModel> sorter = new TableRowSorter<RepositoriesModel>( + TableRowSorter<RepositoriesTableModel> sorter = new TableRowSorter<RepositoriesTableModel>( repositoriesModel); sorter.setRowFilter(containsFilter); repositoriesTable.setRowSorter(sorter); @@ -488,8 +591,8 @@ usersTable.setRowSorter(defaultUsersSorter); return; } - RowFilter<UsersModel, Object> containsFilter = new RowFilter<UsersModel, Object>() { - public boolean include(Entry<? extends UsersModel, ? extends Object> entry) { + RowFilter<UsersTableModel, Object> containsFilter = new RowFilter<UsersTableModel, Object>() { + public boolean include(Entry<? extends UsersTableModel, ? extends Object> entry) { for (int i = entry.getValueCount() - 1; i >= 0; i--) { if (entry.getStringValue(i).toLowerCase().contains(fragment.toLowerCase())) { return true; @@ -498,7 +601,7 @@ return false; } }; - TableRowSorter<UsersModel> sorter = new TableRowSorter<UsersModel>(usersModel); + TableRowSorter<UsersTableModel> sorter = new TableRowSorter<UsersTableModel>(usersModel); sorter.setRowFilter(containsFilter); usersTable.setRowSorter(sorter); } @@ -508,8 +611,8 @@ settingsTable.setRowSorter(defaultSettingsSorter); return; } - RowFilter<SettingsModel, Object> containsFilter = new RowFilter<SettingsModel, Object>() { - public boolean include(Entry<? extends SettingsModel, ? extends Object> entry) { + RowFilter<SettingsTableModel, Object> containsFilter = new RowFilter<SettingsTableModel, Object>() { + 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; @@ -518,7 +621,8 @@ return false; } }; - TableRowSorter<SettingsModel> sorter = new TableRowSorter<SettingsModel>(settingsModel); + TableRowSorter<SettingsTableModel> sorter = new TableRowSorter<SettingsTableModel>( + settingsModel); sorter.setRowFilter(containsFilter); settingsTable.setRowSorter(sorter); } @@ -576,8 +680,10 @@ */ protected void createRepository() { EditRepositoryDialog dialog = new EditRepositoryDialog(); + dialog.setLocationRelativeTo(GitblitPanel.this); dialog.setUsers(null, gitblit.getUsernames(), null); dialog.setRepositories(gitblit.getRepositories()); + dialog.setFederationSets(gitblit.getFederationSets(), null); dialog.setVisible(true); final RepositoryModel newRepository = dialog.getRepository(); final List<String> permittedUsers = dialog.getPermittedUsers(); @@ -622,9 +728,11 @@ */ protected void editRepository(final RepositoryModel repository) { EditRepositoryDialog dialog = new EditRepositoryDialog(repository); + dialog.setLocationRelativeTo(GitblitPanel.this); List<String> usernames = gitblit.getUsernames(); List<String> members = gitblit.getPermittedUsernames(repository); dialog.setUsers(repository.owner, usernames, members); + dialog.setRepositories(gitblit.getRepositories()); dialog.setFederationSets(gitblit.getFederationSets(), repository.federationSets); dialog.setVisible(true); final RepositoryModel revisedRepository = dialog.getRepository(); @@ -724,6 +832,7 @@ */ protected void createUser() { EditUserDialog dialog = new EditUserDialog(gitblit.getSettings()); + dialog.setLocationRelativeTo(GitblitPanel.this); dialog.setUsers(gitblit.getUsers()); dialog.setRepositories(gitblit.getRepositories(), null); dialog.setVisible(true); @@ -765,6 +874,8 @@ */ protected void editUser(final UserModel user) { EditUserDialog dialog = new EditUserDialog(user, gitblit.getSettings()); + dialog.setLocationRelativeTo(GitblitPanel.this); + dialog.setUsers(gitblit.getUsers()); dialog.setRepositories(gitblit.getRepositories(), new ArrayList<String>(user.repositories)); dialog.setVisible(true); final UserModel revisedUser = dialog.getUser(); @@ -833,4 +944,85 @@ worker.execute(); } } + + protected void refreshSettings() { + GitblitWorker worker = new GitblitWorker(GitblitPanel.this, RpcRequest.LIST_SETTINGS) { + @Override + protected Boolean doRequest() throws IOException { + gitblit.refreshSettings(); + return true; + } + + @Override + protected void onSuccess() { + updateSettingsTable(); + } + }; + worker.execute(); + } + + protected void refreshStatus() { + GitblitWorker worker = new GitblitWorker(GitblitPanel.this, RpcRequest.LIST_STATUS) { + @Override + protected Boolean doRequest() throws IOException { + gitblit.refreshStatus(); + return true; + } + + @Override + protected void onSuccess() { + updateStatusPanel(); + } + }; + 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(GitblitPanel.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(GitblitPanel.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() { + updateSettingsTable(); + } + }; + worker.execute(); + } } \ No newline at end of file -- Gitblit v1.9.1