From 33d8d8b21c5586f1328c8c3e7f6049037ae5fd0d Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Fri, 04 Nov 2011 17:22:06 -0400 Subject: [PATCH] Moved SearchType enum to Constants --- src/com/gitblit/client/FeedsPanel.java | 132 +++++++++++++++++++++++++++++++++++++------ 1 files changed, 112 insertions(+), 20 deletions(-) diff --git a/src/com/gitblit/client/FeedsPanel.java b/src/com/gitblit/client/FeedsPanel.java index 2f4391d..a8094f8 100644 --- a/src/com/gitblit/client/FeedsPanel.java +++ b/src/com/gitblit/client/FeedsPanel.java @@ -24,6 +24,7 @@ import java.awt.event.MouseEvent; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -40,7 +41,6 @@ import javax.swing.event.ListSelectionListener; import javax.swing.table.TableRowSorter; -import com.gitblit.Constants.RpcRequest; import com.gitblit.models.FeedModel; import com.gitblit.models.SyndicatedEntryModel; import com.gitblit.utils.StringUtils; @@ -58,7 +58,7 @@ private final GitblitClient gitblit; - private final String ALL = "ALL"; + private final String ALL = "*"; private SyndicatedEntryTableModel tableModel; @@ -69,6 +69,12 @@ private JTable table; private DefaultComboBoxModel repositoryChoices; + + private JComboBox repositorySelector; + + private DefaultComboBoxModel authorChoices; + + private JComboBox authorSelector; public FeedsPanel(GitblitClient gitblit) { super(); @@ -124,7 +130,7 @@ NameRenderer nameRenderer = new NameRenderer(); tableModel = new SyndicatedEntryTableModel(); - header = new HeaderPanel(Translation.get("gb.timeline"), "feed_16x16.png"); + header = new HeaderPanel(Translation.get("gb.activity"), "feed_16x16.png"); table = Utils.newTable(tableModel, Utils.DATE_FORMAT); defaultSorter = new TableRowSorter<SyndicatedEntryTableModel>(tableModel); String name = table.getColumnName(SyndicatedEntryTableModel.Columns.Author.ordinal()); @@ -135,6 +141,9 @@ name = table.getColumnName(SyndicatedEntryTableModel.Columns.Branch.ordinal()); table.getColumn(name).setCellRenderer(new BranchRenderer()); + + name = table.getColumnName(SyndicatedEntryTableModel.Columns.Message.ordinal()); + table.getColumn(name).setCellRenderer(new MessageRenderer(gitblit)); table.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { @@ -162,21 +171,40 @@ }); repositoryChoices = new DefaultComboBoxModel(); - final JComboBox repositorySelector = new JComboBox(repositoryChoices); + repositorySelector = new JComboBox(repositoryChoices); repositorySelector.setRenderer(nameRenderer); repositorySelector.setForeground(nameRenderer.getForeground()); repositorySelector.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { - String repository = ALL; - if (repositorySelector.getSelectedIndex() > -1) { - repository = repositorySelector.getSelectedItem().toString(); + // repopulate the author list based on repository selection + // preserve author selection, if possible + String selectedAuthor = null; + if (authorSelector.getSelectedIndex() > -1) { + selectedAuthor = authorSelector.getSelectedItem().toString(); } - filterRepositories(repository); + updateAuthors(); + if (selectedAuthor != null) { + if (authorChoices.getIndexOf(selectedAuthor) > -1) { + authorChoices.setSelectedItem(selectedAuthor); + } + } + filterFeeds(); + } + }); + authorChoices = new DefaultComboBoxModel(); + authorSelector = new JComboBox(authorChoices); + authorSelector.setRenderer(nameRenderer); + authorSelector.setForeground(nameRenderer.getForeground()); + authorSelector.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent event) { + filterFeeds(); } }); JPanel northControls = new JPanel(new FlowLayout(FlowLayout.LEFT, Utils.MARGIN, 0)); northControls.add(new JLabel(Translation.get("gb.repository"))); northControls.add(repositorySelector); + northControls.add(new JLabel(Translation.get("gb.author"))); + northControls.add(authorSelector); JPanel northPanel = new JPanel(new BorderLayout(0, Utils.MARGIN)); northPanel.add(header, BorderLayout.NORTH); @@ -194,8 +222,7 @@ } protected void refreshFeeds() { - // TODO change request type here - GitblitWorker worker = new GitblitWorker(FeedsPanel.this, RpcRequest.LIST_USERS) { + GitblitWorker worker = new GitblitWorker(FeedsPanel.this, null) { @Override protected Boolean doRequest() throws IOException { gitblit.refreshSubscribedFeeds(); @@ -216,21 +243,47 @@ tableModel.entries.clear(); tableModel.entries.addAll(gitblit.getSyndicatedEntries()); tableModel.fireTableDataChanged(); - header.setText(Translation.get("gb.timeline") + " (" + header.setText(Translation.get("gb.activity") + " (" + gitblit.getSyndicatedEntries().size() + ")"); if (pack) { Utils.packColumns(table, Utils.MARGIN); } + // determine unique repositories Set<String> uniqueRepositories = new HashSet<String>(); for (SyndicatedEntryModel entry : tableModel.entries) { uniqueRepositories.add(entry.repository); } + + // repositories List<String> sortedRespositories = new ArrayList<String>(uniqueRepositories); StringUtils.sortRepositorynames(sortedRespositories); repositoryChoices.removeAllElements(); repositoryChoices.addElement(ALL); for (String repo : sortedRespositories) { repositoryChoices.addElement(repo); + } + } + + private void updateAuthors() { + String repository = ALL; + if (repositorySelector.getSelectedIndex() > -1) { + repository = repositorySelector.getSelectedItem().toString(); + } + + // determine unique repositories and authors + Set<String> uniqueAuthors = new HashSet<String>(); + for (SyndicatedEntryModel entry : tableModel.entries) { + if (repository.equals(ALL) || entry.repository.equalsIgnoreCase(repository)) { + uniqueAuthors.add(entry.author); + } + } + // authors + List<String> sortedAuthors = new ArrayList<String>(uniqueAuthors); + Collections.sort(sortedAuthors); + authorChoices.removeAllElements(); + authorChoices.addElement(ALL); + for (String author : sortedAuthors) { + authorChoices.addElement(author); } } @@ -256,18 +309,57 @@ Utils.browse(entry.link.replace("/commit/", "/tree/")); } - protected void filterRepositories(final String repository) { - if (StringUtils.isEmpty(repository) || repository.equals(ALL)) { + protected void filterFeeds() { + final String repository; + if (repositorySelector.getSelectedIndex() > -1) { + repository = repositorySelector.getSelectedItem().toString(); + } else { + repository = ALL; + } + + final String author; + if (authorSelector.getSelectedIndex() > -1) { + author = authorSelector.getSelectedItem().toString(); + } else { + author = ALL; + } + + if (repository.equals(ALL) && author.equals(ALL)) { table.setRowSorter(defaultSorter); return; } - final int index = SyndicatedEntryTableModel.Columns.Repository.ordinal(); - RowFilter<SyndicatedEntryTableModel, Object> containsFilter = new RowFilter<SyndicatedEntryTableModel, Object>() { - public boolean include( - Entry<? extends SyndicatedEntryTableModel, ? extends Object> entry) { - return entry.getStringValue(index).equalsIgnoreCase(repository); - } - }; + final int repositoryIndex = SyndicatedEntryTableModel.Columns.Repository.ordinal(); + final int authorIndex = SyndicatedEntryTableModel.Columns.Author.ordinal(); + RowFilter<SyndicatedEntryTableModel, Object> containsFilter; + if (repository.equals(ALL)) { + // author filter + containsFilter = new RowFilter<SyndicatedEntryTableModel, Object>() { + public boolean include( + Entry<? extends SyndicatedEntryTableModel, ? extends Object> entry) { + return entry.getStringValue(authorIndex).equalsIgnoreCase(author); + } + }; + } else if (author.equals(ALL)) { + // repository filter + containsFilter = new RowFilter<SyndicatedEntryTableModel, Object>() { + public boolean include( + Entry<? extends SyndicatedEntryTableModel, ? extends Object> entry) { + return entry.getStringValue(repositoryIndex).equalsIgnoreCase(repository); + } + }; + } else { + // repository-author filter + containsFilter = new RowFilter<SyndicatedEntryTableModel, Object>() { + public boolean include( + Entry<? extends SyndicatedEntryTableModel, ? extends Object> entry) { + boolean authorMatch = entry.getStringValue(authorIndex) + .equalsIgnoreCase(author); + boolean repositoryMatch = entry.getStringValue(repositoryIndex) + .equalsIgnoreCase(repository); + return authorMatch && repositoryMatch; + } + }; + } TableRowSorter<SyndicatedEntryTableModel> sorter = new TableRowSorter<SyndicatedEntryTableModel>( tableModel); sorter.setRowFilter(containsFilter); -- Gitblit v1.9.1