From 92e2df83f34e9c4a21b7e32d858504be8113c0a9 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Wed, 02 Nov 2011 17:26:42 -0400
Subject: [PATCH] Added repository selector to feeds panel

---
 src/com/gitblit/client/FeedsPanel.java |   68 +++++++++++++++++++++++++++++++++
 1 files changed, 67 insertions(+), 1 deletions(-)

diff --git a/src/com/gitblit/client/FeedsPanel.java b/src/com/gitblit/client/FeedsPanel.java
index c6b464d..2f4391d 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.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,17 @@
 
 	private final GitblitClient gitblit;
 
+	private final String ALL = "ALL";
+
 	private SyndicatedEntryTableModel tableModel;
+
+	private TableRowSorter<SyndicatedEntryTableModel> defaultSorter;
 
 	private HeaderPanel header;
 
 	private JTable table;
+
+	private DefaultComboBoxModel repositoryChoices;
 
 	public FeedsPanel(GitblitClient gitblit) {
 		super();
@@ -111,6 +126,7 @@
 		tableModel = new SyndicatedEntryTableModel();
 		header = new HeaderPanel(Translation.get("gb.timeline"), "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);
@@ -145,8 +161,29 @@
 			}
 		});
 
+		repositoryChoices = new DefaultComboBoxModel();
+		final JComboBox 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);
+			}
+		});
+		JPanel northControls = new JPanel(new FlowLayout(FlowLayout.LEFT, Utils.MARGIN, 0));
+		northControls.add(new JLabel(Translation.get("gb.repository")));
+		northControls.add(repositorySelector);
+
+		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);
 	}
@@ -184,6 +221,17 @@
 		if (pack) {
 			Utils.packColumns(table, Utils.MARGIN);
 		}
+		Set<String> uniqueRepositories = new HashSet<String>();
+		for (SyndicatedEntryModel entry : tableModel.entries) {
+			uniqueRepositories.add(entry.repository);
+		}
+		List<String> sortedRespositories = new ArrayList<String>(uniqueRepositories);
+		StringUtils.sortRepositorynames(sortedRespositories);
+		repositoryChoices.removeAllElements();
+		repositoryChoices.addElement(ALL);
+		for (String repo : sortedRespositories) {
+			repositoryChoices.addElement(repo);
+		}
 	}
 
 	protected SyndicatedEntryModel getSelectedSyndicatedEntry() {
@@ -207,4 +255,22 @@
 		SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
 		Utils.browse(entry.link.replace("/commit/", "/tree/"));
 	}
+
+	protected void filterRepositories(final String repository) {
+		if (StringUtils.isEmpty(repository) || repository.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);
+			}
+		};
+		TableRowSorter<SyndicatedEntryTableModel> sorter = new TableRowSorter<SyndicatedEntryTableModel>(
+				tableModel);
+		sorter.setRowFilter(containsFilter);
+		table.setRowSorter(sorter);
+	}
 }

--
Gitblit v1.9.1