From 5506b8d4d21d2996f14363f75ca7f3f883546934 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Wed, 02 Nov 2011 17:40:33 -0400
Subject: [PATCH] Added author selector to feeds panel

---
 src/com/gitblit/client/FeedsPanel.java |   99 +++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 83 insertions(+), 16 deletions(-)

diff --git a/src/com/gitblit/client/FeedsPanel.java b/src/com/gitblit/client/FeedsPanel.java
index 2f4391d..0492b95 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;
@@ -58,7 +59,7 @@
 
 	private final GitblitClient gitblit;
 
-	private final String ALL = "ALL";
+	private final String ALL = "*";
 
 	private SyndicatedEntryTableModel tableModel;
 
@@ -69,6 +70,12 @@
 	private JTable table;
 
 	private DefaultComboBoxModel repositoryChoices;
+
+	private JComboBox repositorySelector;
+
+	private DefaultComboBoxModel authorChoices;
+
+	private JComboBox authorSelector;
 
 	public FeedsPanel(GitblitClient gitblit) {
 		super();
@@ -162,21 +169,28 @@
 		});
 
 		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();
-				}
-				filterRepositories(repository);
+				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);
@@ -221,16 +235,30 @@
 		if (pack) {
 			Utils.packColumns(table, Utils.MARGIN);
 		}
+		// determine unique repositories and authors
 		Set<String> uniqueRepositories = new HashSet<String>();
+		Set<String> uniqueAuthors = new HashSet<String>();
 		for (SyndicatedEntryModel entry : tableModel.entries) {
 			uniqueRepositories.add(entry.repository);
+			uniqueAuthors.add(entry.author);
 		}
+
+		// repositories
 		List<String> sortedRespositories = new ArrayList<String>(uniqueRepositories);
 		StringUtils.sortRepositorynames(sortedRespositories);
 		repositoryChoices.removeAllElements();
 		repositoryChoices.addElement(ALL);
 		for (String repo : sortedRespositories) {
 			repositoryChoices.addElement(repo);
+		}
+
+		// 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 +284,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