From 609a16e10fb705e146e7fd4b0fe48c744d40a2e0 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 03 Nov 2011 17:11:47 -0400
Subject: [PATCH] Revised branch rendering. Added ref rendering to message column.

---
 src/com/gitblit/client/SyndicatedEntryTableModel.java |   15 +--
 src/com/gitblit/wicket/GitBlitWebApp.properties       |    2 
 src/com/gitblit/models/SyndicatedEntryModel.java      |    2 
 src/com/gitblit/client/BranchRenderer.java            |   43 ++--------
 src/com/gitblit/client/GitblitPanel.java              |    2 
 src/com/gitblit/client/FeedsPanel.java                |   13 +-
 src/com/gitblit/client/GitblitManager.java            |    6 
 docs/05_roadmap.mkd                                   |    1 
 src/com/gitblit/client/GitblitRegistration.java       |    7 +
 src/com/gitblit/client/MessageRenderer.java           |  129 ++++++++++++++++++++++++++++++++
 10 files changed, 164 insertions(+), 56 deletions(-)

diff --git a/docs/05_roadmap.mkd b/docs/05_roadmap.mkd
index 511e9bb..a7f21a3 100644
--- a/docs/05_roadmap.mkd
+++ b/docs/05_roadmap.mkd
@@ -7,7 +7,6 @@
 
 * Eclipse: create plugin to enumerate repositories and delegate cloning to EGit
 * Manager: support federation RPCs
-* Manager: RSS feed reader tab  
 
 ### TODO (medium priority)
 
diff --git a/src/com/gitblit/client/BranchRenderer.java b/src/com/gitblit/client/BranchRenderer.java
index b8f55f0..532a432 100644
--- a/src/com/gitblit/client/BranchRenderer.java
+++ b/src/com/gitblit/client/BranchRenderer.java
@@ -17,24 +17,18 @@
 
 import java.awt.Color;
 import java.awt.Component;
-import java.awt.FlowLayout;
-import java.io.Serializable;
 
-import javax.swing.JLabel;
-import javax.swing.JPanel;
 import javax.swing.JTable;
-import javax.swing.border.Border;
-import javax.swing.border.LineBorder;
-import javax.swing.table.TableCellRenderer;
+import javax.swing.table.DefaultTableCellRenderer;
 
 /**
- * Branch renderer displays refs/heads and refs/remotes in a style like the
- * site.
+ * Branch renderer displays refs/heads and refs/remotes in a color similar to
+ * the site.
  * 
  * @author James Moger
  * 
  */
-public class BranchRenderer extends JPanel implements TableCellRenderer, Serializable {
+public class BranchRenderer extends DefaultTableCellRenderer {
 
 	private static final long serialVersionUID = 1L;
 
@@ -42,37 +36,20 @@
 
 	private static final String R_REMOTES = "refs/remotes/";
 
-	private JLabel branchLabel;
-
-	public BranchRenderer() {
-		super(new FlowLayout(FlowLayout.CENTER, 0, 1));
-		branchLabel = new JLabel();
-		branchLabel.setOpaque(true);
-		add(branchLabel);
-	}
-
 	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
 			boolean hasFocus, int row, int column) {
-		if (isSelected)
-			setBackground(table.getSelectionBackground());
-		else
-			setBackground(table.getBackground());
-
+		super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
 		String name = value.toString();
-		Color bg = getBackground();
-		Border border = null;
+		Color fg = getForeground();
 		if (name.startsWith(R_HEADS)) {
-			bg = Color.decode("#CCFFCC");
 			name = name.substring(R_HEADS.length());
-			border = new LineBorder(Color.decode("#00CC33"), 1);
+			fg = new Color(0, 0x80, 0);
 		} else if (name.startsWith(R_REMOTES)) {
-			bg = Color.decode("#CAC2F5");
 			name = name.substring(R_REMOTES.length());
-			border = new LineBorder(Color.decode("#6C6CBF"), 1);
+			fg = Color.decode("#6C6CBF");
 		}
-		branchLabel.setText(" " + name + " ");
-		branchLabel.setBackground(bg);
-		branchLabel.setBorder(border);
+		setText(name);
+		setForeground(isSelected ? table.getSelectionForeground() : fg);
 		return this;
 	}
 }
\ No newline at end of file
diff --git a/src/com/gitblit/client/FeedsPanel.java b/src/com/gitblit/client/FeedsPanel.java
index a9a2473..a8094f8 100644
--- a/src/com/gitblit/client/FeedsPanel.java
+++ b/src/com/gitblit/client/FeedsPanel.java
@@ -41,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;
@@ -130,8 +129,8 @@
 		controls.add(viewTree);
 
 		NameRenderer nameRenderer = new NameRenderer();
-		tableModel = new SyndicatedEntryTableModel(gitblit);
-		header = new HeaderPanel(Translation.get("gb.timeline"), "feed_16x16.png");
+		tableModel = new SyndicatedEntryTableModel();
+		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());
@@ -142,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) {
@@ -220,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();
@@ -242,7 +243,7 @@
 		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);
diff --git a/src/com/gitblit/client/GitblitManager.java b/src/com/gitblit/client/GitblitManager.java
index a16cfe6..dd0315f 100644
--- a/src/com/gitblit/client/GitblitManager.java
+++ b/src/com/gitblit/client/GitblitManager.java
@@ -400,7 +400,7 @@
 	}
 
 	private void loadFeedCache(GitblitRegistration reg) {
-		File feedCache = new File(configFile.getParentFile(), StringUtils.getSHA1(reg.url)
+		File feedCache = new File(configFile.getParentFile(), StringUtils.getSHA1(reg.toString())
 				+ ".cache");
 		if (!feedCache.exists()) {
 			// no cache for this registration
@@ -429,8 +429,8 @@
 
 	private void writeFeedCache(GitblitRegistration reg) {
 		try {
-			File feedCache = new File(configFile.getParentFile(), StringUtils.getSHA1(reg.url)
-					+ ".cache");
+			File feedCache = new File(configFile.getParentFile(), StringUtils.getSHA1(reg
+					.toString()) + ".cache");
 			FileWriter writer = new FileWriter(feedCache);
 			for (FeedModel feed : reg.feeds) {
 				writer.append(MessageFormat.format("{0}={1,date,yyyy-MM-dd'T'HH:mm:ss}\n",
diff --git a/src/com/gitblit/client/GitblitPanel.java b/src/com/gitblit/client/GitblitPanel.java
index f675b4a..0e670ae 100644
--- a/src/com/gitblit/client/GitblitPanel.java
+++ b/src/com/gitblit/client/GitblitPanel.java
@@ -61,7 +61,7 @@
 
 		tabs = new JTabbedPane(JTabbedPane.BOTTOM);
 		tabs.addTab(Translation.get("gb.repositories"), createRepositoriesPanel());
-		tabs.addTab(Translation.get("gb.timeline"), createFeedsPanel());
+		tabs.addTab(Translation.get("gb.activity"), createFeedsPanel());
 		tabs.addTab(Translation.get("gb.users"), createUsersPanel());
 		tabs.addTab(Translation.get("gb.settings"), createSettingsPanel());
 		tabs.addTab(Translation.get("gb.status"), createStatusPanel());
diff --git a/src/com/gitblit/client/GitblitRegistration.java b/src/com/gitblit/client/GitblitRegistration.java
index 33399b1..f9d0748 100644
--- a/src/com/gitblit/client/GitblitRegistration.java
+++ b/src/com/gitblit/client/GitblitRegistration.java
@@ -71,11 +71,16 @@
 		}
 	}
 
+	protected void cacheFeeds() {
+	}
+
 	@Override
 	public int compareTo(GitblitRegistration o) {
 		return name.toLowerCase().compareTo(o.name.toLowerCase());
 	}
 
-	protected void cacheFeeds() {
+	@Override
+	public String toString() {
+		return name + " (" + url + ")";
 	}
 }
diff --git a/src/com/gitblit/client/MessageRenderer.java b/src/com/gitblit/client/MessageRenderer.java
new file mode 100644
index 0000000..c848cef
--- /dev/null
+++ b/src/com/gitblit/client/MessageRenderer.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.client;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.io.Serializable;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTable;
+import javax.swing.border.Border;
+import javax.swing.border.LineBorder;
+import javax.swing.table.TableCellRenderer;
+
+import com.gitblit.models.SyndicatedEntryModel;
+
+/**
+ * Message renderer displays the short log message and then any refs in a style
+ * like the site.
+ * 
+ * @author James Moger
+ * 
+ */
+public class MessageRenderer extends JPanel implements TableCellRenderer, Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private static final String R_TAGS = "refs/tags/";
+
+	private static final String R_HEADS = "refs/heads/";
+
+	private static final String R_REMOTES = "refs/remotes/";
+
+	private final GitblitClient gitblit;
+
+	private final JLabel messageLabel;
+
+	private final JLabel branchLabel;
+
+	public MessageRenderer(GitblitClient gitblit) {
+		super(new FlowLayout(FlowLayout.LEFT, 10, 1));
+		this.gitblit = gitblit;
+
+		messageLabel = new JLabel();
+		branchLabel = new JLabel();
+		branchLabel.setOpaque(true);
+		Font font = branchLabel.getFont();
+		branchLabel.setFont(font.deriveFont(font.getSize2D() - 1f));
+		add(messageLabel);
+		add(branchLabel);
+	}
+
+	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
+			boolean hasFocus, int row, int column) {
+		if (isSelected)
+			setBackground(table.getSelectionBackground());
+		else
+			setBackground(table.getBackground());
+		messageLabel.setForeground(isSelected ? table.getSelectionForeground() : table
+				.getForeground());
+		SyndicatedEntryModel entry = (SyndicatedEntryModel) value;
+		
+		// show message in BOLD if its a new entry
+		if (entry.published.after(gitblit.getLastFeedRefresh(entry.repository, entry.branch))) {
+			messageLabel.setText("<html><body><b>" + entry.title);
+		} else {
+			messageLabel.setText(entry.title);
+		}
+
+		// reset ref label
+		branchLabel.setText("");
+		branchLabel.setBackground(messageLabel.getBackground());
+		branchLabel.setBorder(null);
+
+		if (entry.tags != null) {
+			for (String tag : entry.tags) {
+				if (tag.equals(entry.branch)) {
+					continue;
+				}
+				String name = tag;
+				Color bg = getBackground();
+				Border border = null;
+				if (name.startsWith(R_HEADS)) {
+					// local branch
+					bg = Color.decode("#CCFFCC");
+					name = name.substring(R_HEADS.length());
+					border = new LineBorder(Color.decode("#00CC33"), 1);
+				} else if (name.startsWith(R_REMOTES)) {
+					// origin branch
+					bg = Color.decode("#CAC2F5");
+					name = name.substring(R_REMOTES.length());
+					border = new LineBorder(Color.decode("#6C6CBF"), 1);
+				} else if (name.startsWith(R_TAGS)) {
+					// tag
+					bg = Color.decode("#FFFFAA");
+					name = name.substring(R_TAGS.length());
+					border = new LineBorder(Color.decode("#FFCC00"), 1);
+				} else if (name.equals("HEAD")) {
+					// HEAD
+					bg = Color.decode("#FFAAFF");
+					border = new LineBorder(Color.decode("#FF00EE"), 1);
+				} else {
+
+				}
+				branchLabel.setText(" " + name + " ");
+				branchLabel.setBackground(bg);
+				branchLabel.setBorder(border);
+			}
+		}
+
+		return this;
+	}
+}
\ No newline at end of file
diff --git a/src/com/gitblit/client/SyndicatedEntryTableModel.java b/src/com/gitblit/client/SyndicatedEntryTableModel.java
index 93177a8..8fcdb47 100644
--- a/src/com/gitblit/client/SyndicatedEntryTableModel.java
+++ b/src/com/gitblit/client/SyndicatedEntryTableModel.java
@@ -34,12 +34,10 @@
 
 	private static final long serialVersionUID = 1L;
 
-	private final GitblitClient gitblit;
-
 	List<SyndicatedEntryModel> entries;
 
 	enum Columns {
-		Date, Repository, Author, Message, Branch;
+		Date, Repository, Branch, Author, Message;
 
 		@Override
 		public String toString() {
@@ -47,8 +45,7 @@
 		}
 	}
 
-	public SyndicatedEntryTableModel(GitblitClient gitblit) {
-		this.gitblit = gitblit;
+	public SyndicatedEntryTableModel() {
 		this.entries = new ArrayList<SyndicatedEntryModel>();
 	}
 
@@ -95,6 +92,8 @@
 	public Class<?> getColumnClass(int columnIndex) {
 		if (Columns.Date.ordinal() == columnIndex) {
 			return Date.class;
+		} else if (Columns.Message.ordinal() == columnIndex) {
+			return SyndicatedEntryModel.class;
 		}
 		return String.class;
 	}
@@ -113,11 +112,7 @@
 		case Author:
 			return entry.author;
 		case Message:
-			Date lastRefresh = gitblit.getLastFeedRefresh(entry.repository, entry.branch);
-			if (entry.published.after(lastRefresh)) {
-				return "<html><body><b>" + entry.title;
-			}
-			return entry.title;
+			return entry;
 		}
 		return null;
 	}
diff --git a/src/com/gitblit/models/SyndicatedEntryModel.java b/src/com/gitblit/models/SyndicatedEntryModel.java
index a1c1221..f59418e 100644
--- a/src/com/gitblit/models/SyndicatedEntryModel.java
+++ b/src/com/gitblit/models/SyndicatedEntryModel.java
@@ -17,6 +17,7 @@
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 /**
  * SyndicationEntryModel represents an entry in a syndication (RSS) feed.
@@ -33,6 +34,7 @@
 	public String link;
 	public String content;
 	public String contentType;
+	public List<String> tags;
 
 	private static final long serialVersionUID = 1L;
 
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.properties b/src/com/gitblit/wicket/GitBlitWebApp.properties
index 96a5bc8..3ab1b7a 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/com/gitblit/wicket/GitBlitWebApp.properties
@@ -177,6 +177,6 @@
 gb.version = version
 gb.releaseDate = release date
 gb.date = date
-gb.timeline = timeline
+gb.activity = activity
 gb.subscribe = subscribe
 gb.branch = branch
\ No newline at end of file

--
Gitblit v1.9.1