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 | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 164 insertions(+), 6 deletions(-) diff --git a/src/com/gitblit/client/FeedsPanel.java b/src/com/gitblit/client/FeedsPanel.java index c6b464d..a8094f8 100644 --- a/src/com/gitblit/client/FeedsPanel.java +++ b/src/com/gitblit/client/FeedsPanel.java @@ -23,18 +23,27 @@ import java.awt.event.MouseAdapter; 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; +import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; +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.FeedModel; import com.gitblit.models.SyndicatedEntryModel; +import com.gitblit.utils.StringUtils; /** * RSS Feeds Panel displays recent entries and launches the browser to view the @@ -49,11 +58,23 @@ private final GitblitClient gitblit; + private final String ALL = "*"; + private SyndicatedEntryTableModel tableModel; + + private TableRowSorter<SyndicatedEntryTableModel> defaultSorter; private HeaderPanel header; private JTable table; + + private DefaultComboBoxModel repositoryChoices; + + private JComboBox repositorySelector; + + private DefaultComboBoxModel authorChoices; + + private JComboBox authorSelector; public FeedsPanel(GitblitClient gitblit) { super(); @@ -109,8 +130,9 @@ 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()); table.setRowHeight(nameRenderer.getFont().getSize() + 8); table.getColumn(name).setCellRenderer(nameRenderer); @@ -119,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) { @@ -145,8 +170,48 @@ } }); + repositoryChoices = new DefaultComboBoxModel(); + repositorySelector = new JComboBox(repositoryChoices); + repositorySelector.setRenderer(nameRenderer); + repositorySelector.setForeground(nameRenderer.getForeground()); + repositorySelector.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent event) { + // repopulate the author list based on repository selection + // preserve author selection, if possible + String selectedAuthor = null; + if (authorSelector.getSelectedIndex() > -1) { + selectedAuthor = authorSelector.getSelectedItem().toString(); + } + 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); + northPanel.add(northControls, BorderLayout.CENTER); + setLayout(new BorderLayout(Utils.MARGIN, Utils.MARGIN)); - add(header, BorderLayout.NORTH); + add(northPanel, BorderLayout.NORTH); add(new JScrollPane(table), BorderLayout.CENTER); add(controls, BorderLayout.SOUTH); } @@ -157,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(); @@ -179,10 +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); } } @@ -207,4 +308,61 @@ SyndicatedEntryModel entry = getSelectedSyndicatedEntry(); Utils.browse(entry.link.replace("/commit/", "/tree/")); } + + 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 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); + table.setRowSorter(sorter); + } } -- Gitblit v1.9.1