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/utils/SyndicationUtils.java |    2 
 src/com/gitblit/client/BranchRenderer.java  |    4 +-
 src/com/gitblit/client/NameRenderer.java    |   28 ++++++++++++-
 src/com/gitblit/client/FeedsPanel.java      |   68 +++++++++++++++++++++++++++++++++
 4 files changed, 95 insertions(+), 7 deletions(-)

diff --git a/src/com/gitblit/client/BranchRenderer.java b/src/com/gitblit/client/BranchRenderer.java
index f9c9f36..b8f55f0 100644
--- a/src/com/gitblit/client/BranchRenderer.java
+++ b/src/com/gitblit/client/BranchRenderer.java
@@ -64,11 +64,11 @@
 		if (name.startsWith(R_HEADS)) {
 			bg = Color.decode("#CCFFCC");
 			name = name.substring(R_HEADS.length());
-			border = new LineBorder(Color.decode("#00CC33"), 1, true);
+			border = new LineBorder(Color.decode("#00CC33"), 1);
 		} else if (name.startsWith(R_REMOTES)) {
 			bg = Color.decode("#CAC2F5");
 			name = name.substring(R_REMOTES.length());
-			border = new LineBorder(Color.decode("#6C6CBF"), 1, true);
+			border = new LineBorder(Color.decode("#6C6CBF"), 1);
 		}
 		branchLabel.setText(" " + name + " ");
 		branchLabel.setBackground(bg);
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);
+	}
 }
diff --git a/src/com/gitblit/client/NameRenderer.java b/src/com/gitblit/client/NameRenderer.java
index f334d42..8ba2e00 100644
--- a/src/com/gitblit/client/NameRenderer.java
+++ b/src/com/gitblit/client/NameRenderer.java
@@ -18,7 +18,9 @@
 import java.awt.Color;
 import java.awt.Component;
 
+import javax.swing.JList;
 import javax.swing.JTable;
+import javax.swing.ListCellRenderer;
 import javax.swing.table.DefaultTableCellRenderer;
 
 /**
@@ -28,14 +30,16 @@
  * @author James Moger
  * 
  */
-public class NameRenderer extends DefaultTableCellRenderer {
+public class NameRenderer extends DefaultTableCellRenderer implements ListCellRenderer {
 
 	private static final long serialVersionUID = 1L;
+
+	private static final Color CORNFLOWER = new Color(0x00, 0x69, 0xD6);
 
 	private final String groupSpan;
 
 	public NameRenderer() {
-		this(Color.gray, new Color(0x00, 0x69, 0xD6));
+		this(Color.gray, CORNFLOWER);
 	}
 
 	private NameRenderer(Color group, Color repo) {
@@ -55,6 +59,25 @@
 	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
 			boolean hasFocus, int row, int column) {
 		super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+		setValue(value, isSelected);
+		return this;
+	}
+
+	@Override
+	public Component getListCellRendererComponent(JList list, Object value, int index,
+			boolean isSelected, boolean cellHasFocus) {
+		setValue(value, isSelected);
+		if (isSelected) {
+			setBackground(list.getSelectionBackground());
+			setForeground(list.getSelectionForeground());
+		} else {
+			setBackground(list.getBackground());
+			setForeground(CORNFLOWER);
+		}
+		return this;
+	}
+
+	private void setValue(Object value, boolean isSelected) {
 		String name = value.toString();
 		int lastSlash = name.lastIndexOf('/');
 		if (!isSelected && lastSlash > -1) {
@@ -64,6 +87,5 @@
 		} else {
 			this.setText(name);
 		}
-		return this;
 	}
 }
\ No newline at end of file
diff --git a/src/com/gitblit/utils/SyndicationUtils.java b/src/com/gitblit/utils/SyndicationUtils.java
index 9aedeb4..8987c26 100644
--- a/src/com/gitblit/utils/SyndicationUtils.java
+++ b/src/com/gitblit/utils/SyndicationUtils.java
@@ -126,7 +126,7 @@
 			parameters.add("h=" + branch);
 		}
 		StringBuilder sb = new StringBuilder();
-		sb.append(MessageFormat.format("{0}/feed/{1}", url, repository));
+		sb.append(MessageFormat.format("{0}" + Constants.SYNDICATION_PATH + "{1}", url, repository));
 		if (parameters.size() > 0) {
 			boolean first = true;
 			for (String parameter : parameters) {

--
Gitblit v1.9.1