From 698678268f53067c239a11e928dfd16761a2f9f7 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 08 Apr 2011 17:17:28 -0400
Subject: [PATCH] created panels for logs, tags, and branches.

---
 src/com/gitblit/wicket/pages/TagsPage.java              |   48 --
 src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java |    4 
 src/com/gitblit/wicket/panels/TagsPanel.html            |   33 +
 src/com/gitblit/wicket/panels/PageLinksPanel.html       |    2 
 src/com/gitblit/wicket/panels/TagsPanel.java            |   81 ++++
 src/com/gitblit/wicket/GitBlitWebApp.properties         |    8 
 src/com/gitblit/wicket/WicketUtils.java                 |   67 +++
 src/com/gitblit/wicket/pages/CommitPage.java            |   13 
 src/com/gitblit/wicket/pages/BranchesPage.java          |   55 --
 src/com/gitblit/wicket/panels/AdminLinksPanel.java      |    3 
 src/com/gitblit/wicket/pages/BlobPage.html              |    2 
 src/com/gitblit/wicket/panels/TreeLinksPanel.java       |    9 
 src/com/gitblit/wicket/panels/TreeBlobLinksPanel.java   |   11 
 src/com/gitblit/wicket/pages/BranchesPage.html          |   16 
 src/com/gitblit/wicket/pages/SummaryPage.html           |   49 --
 src/com/gitblit/wicket/models/RefModel.java             |    3 
 src/com/gitblit/wicket/RepositoryPage.java              |   16 
 src/com/gitblit/wicket/pages/TicGitPage.java            |   17 
 src/com/gitblit/wicket/pages/CommitPage.html            |    6 
 src/com/gitblit/wicket/pages/LogPage.html               |   18 +
 src/com/gitblit/wicket/BasePage.java                    |   47 --
 src/com/gitblit/wicket/resources/gitblit.css            |   10 
 src/com/gitblit/wicket/pages/LogPage.java               |   21 +
 src/com/gitblit/wicket/panels/LogPanel.html             |   34 +
 /dev/null                                               |   20 -
 src/com/gitblit/wicket/pages/TicGitTicketPage.java      |    4 
 src/com/gitblit/wicket/panels/PageLinksPanel.java       |   27 
 src/com/gitblit/wicket/pages/TagsPage.html              |   14 
 src/com/gitblit/wicket/panels/BranchesPanel.java        |   84 ++++
 src/com/gitblit/wicket/pages/TicGitTicketPage.html      |    2 
 src/com/gitblit/wicket/panels/LogPanel.java             |  118 ++++++
 src/com/gitblit/wicket/GitBlitWebApp.java               |    4 
 src/com/gitblit/wicket/pages/TicGitPage.html            |    2 
 src/com/gitblit/wicket/pages/SummaryPage.java           |  140 -------
 src/com/gitblit/wicket/panels/BranchesPanel.html        |   34 +
 35 files changed, 594 insertions(+), 428 deletions(-)

diff --git a/src/com/gitblit/wicket/BasePage.java b/src/com/gitblit/wicket/BasePage.java
index d24485f..d795c61 100644
--- a/src/com/gitblit/wicket/BasePage.java
+++ b/src/com/gitblit/wicket/BasePage.java
@@ -1,10 +1,7 @@
 package com.gitblit.wicket;
 
-import java.util.Date;
-
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.wicket.Component;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
@@ -14,9 +11,7 @@
 
 import com.gitblit.Constants;
 import com.gitblit.StoredSettings;
-import com.gitblit.utils.Utils;
 import com.gitblit.wicket.pages.SummaryPage;
-
 
 public abstract class BasePage extends WebPage {
 
@@ -58,49 +53,7 @@
 		HttpServletRequest req = servletWebRequest.getHttpServletRequest();
 		return req.getServerName();
 	}
-
-	protected Label createAuthorLabel(String wicketId, String author) {
-		Label label = new Label(wicketId, author);
-		WicketUtils.setHtmlTitle(label, author);
-		return label;
-	}
-
-	protected Label createDateLabel(String wicketId, Date date) {
-		Label label = new Label(wicketId, GitBlitWebSession.get().formatDate(date));
-		WicketUtils.setCssClass(label, Utils.timeAgoCss(date));
-		WicketUtils.setHtmlTitle(label, Utils.timeAgo(date));
-		return label;
-	}
-
-	protected Label createShortlogDateLabel(String wicketId, Date date) {
-		String dateString = GitBlitWebSession.get().formatDate(date);
-		String title = Utils.timeAgo(date);
-		if ((System.currentTimeMillis() - date.getTime()) < 10 * 24 * 60 * 60 * 1000l) {
-			dateString = title;
-			title = GitBlitWebSession.get().formatDate(date);
-		}
-		Label label = new Label(wicketId, dateString);
-		WicketUtils.setCssClass(label, Utils.timeAgoCss(date));
-		WicketUtils.setHtmlTitle(label, title);
-		return label;
-	}
-
-	protected void setAlternatingBackground(Component c, int i) {
-		String clazz = i % 2 == 0 ? "dark" : "light";
-		WicketUtils.setCssClass(c, clazz);
-	}
-
-	protected String trimShortLog(String string) {
-		return trimString(string, 60);
-	}
 	
-	protected String trimString(String value, int max) {
-		if (value.length() <= max) {
-			return value;
-		}
-		return value.substring(0, max - 3) + "...";
-	}
-
 	public void error(String message, Throwable t) {
 		super.error(message);
 		logger.error(message, t);
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.java b/src/com/gitblit/wicket/GitBlitWebApp.java
index 70bb970..caaf221 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.java
+++ b/src/com/gitblit/wicket/GitBlitWebApp.java
@@ -33,7 +33,7 @@
 import com.gitblit.wicket.pages.CommitPage;
 import com.gitblit.wicket.pages.DiffPage;
 import com.gitblit.wicket.pages.RepositoriesPage;
-import com.gitblit.wicket.pages.ShortLogPage;
+import com.gitblit.wicket.pages.LogPage;
 import com.gitblit.wicket.pages.SummaryPage;
 import com.gitblit.wicket.pages.TagPage;
 import com.gitblit.wicket.pages.TagsPage;
@@ -63,7 +63,7 @@
 
 		// setup the standard gitweb-ish urls
 		mount(new MixedParamUrlCodingStrategy("/summary", SummaryPage.class, new String[] { "p" }));
-		mount(new MixedParamUrlCodingStrategy("/shortlog", ShortLogPage.class, new String[] { "p", "h" }));
+		mount(new MixedParamUrlCodingStrategy("/shortlog", LogPage.class, new String[] { "p", "h" }));
 		mount(new MixedParamUrlCodingStrategy("/tags", TagsPage.class, new String[] { "p" }));
 		mount(new MixedParamUrlCodingStrategy("/branches", BranchesPage.class, new String[] { "p" }));
 		mount(new MixedParamUrlCodingStrategy("/commit", CommitPage.class, new String[] { "p", "h" }));
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.properties b/src/com/gitblit/wicket/GitBlitWebApp.properties
index ba077c7..621cb71 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/com/gitblit/wicket/GitBlitWebApp.properties
@@ -25,10 +25,10 @@
 gb.branches = branches
 gb.patch = patch
 gb.diff = diff
-gb.shortlog = shortlog
-gb.more = more
-gb.allTags = all tags
-gb.allBranches = all branches
+gb.log = log
+gb.moreLogs = more commits...
+gb.allTags = all tags...
+gb.allBranches = all branches...
 gb.summary = summary
 gb.ticket = ticket
 gb.newRepository = new repository
diff --git a/src/com/gitblit/wicket/RepositoryPage.java b/src/com/gitblit/wicket/RepositoryPage.java
index 1a764a3..0cbda3d 100644
--- a/src/com/gitblit/wicket/RepositoryPage.java
+++ b/src/com/gitblit/wicket/RepositoryPage.java
@@ -33,7 +33,7 @@
 			redirectToInterceptPage(new RepositoriesPage());
 		}
 		repositoryName = params.getString("p", "");
-		commitId = params.getString("h", "");
+		commitId = params.getString("h", "HEAD");
 
 		Repository r = getRepository();
 
@@ -112,24 +112,18 @@
 	}
 
 	protected PageParameters newRepositoryParameter() {
-		return new PageParameters("p=" + repositoryName);
+		return WicketUtils.newRepositoryParameter(repositoryName);
 	}
 
 	protected PageParameters newCommitParameter() {
-		return newCommitParameter(commitId);
+		return WicketUtils.newCommitParameter(repositoryName, commitId);
 	}
 
 	protected PageParameters newCommitParameter(String commitId) {
-		if (commitId == null || commitId.trim().length() == 0) {
-			return newRepositoryParameter();
-		}
-		return new PageParameters("p=" + repositoryName + ",h=" + commitId);
+		return WicketUtils.newCommitParameter(repositoryName, commitId);
 	}
 
 	protected PageParameters newPathParameter(String path) {
-		if (path == null || path.trim().length() == 0) {
-			return newCommitParameter();
-		}
-		return new PageParameters("p=" + repositoryName + ",h=" + commitId + ",f=" + path);
+		return WicketUtils.newPathParameter(repositoryName, commitId, path);
 	}
 }
diff --git a/src/com/gitblit/wicket/WicketUtils.java b/src/com/gitblit/wicket/WicketUtils.java
index ee055c1..63efd54 100644
--- a/src/com/gitblit/wicket/WicketUtils.java
+++ b/src/com/gitblit/wicket/WicketUtils.java
@@ -1,9 +1,18 @@
 package com.gitblit.wicket;
 
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
+import java.util.TimeZone;
 
 import org.apache.wicket.Component;
+import org.apache.wicket.PageParameters;
 import org.apache.wicket.behavior.SimpleAttributeModifier;
+import org.apache.wicket.markup.html.basic.Label;
+
+import com.gitblit.StoredSettings;
+import com.gitblit.utils.Utils;
 
 public class WicketUtils {
 
@@ -46,4 +55,62 @@
 		}
 		return sb.toString().trim();
 	}
+	
+	public static void setAlternatingBackground(Component c, int i) {
+		String clazz = i % 2 == 0 ? "dark" : "light";
+		setCssClass(c, clazz);
+	}
+	
+	public static Label createAuthorLabel(String wicketId, String author) {
+		Label label = new Label(wicketId, author);
+		WicketUtils.setHtmlTitle(label, author);
+		return label;
+	}
+
+	public static String trimShortLog(String string) {
+		return trimString(string, 60);
+	}
+	
+	public static String trimString(String value, int max) {
+		if (value.length() <= max) {
+			return value;
+		}
+		return value.substring(0, max - 3) + "...";
+	}
+	
+	public static PageParameters newRepositoryParameter(String repositoryName) {
+		return new PageParameters("p=" + repositoryName);
+	}
+
+	public static PageParameters newCommitParameter(String repositoryName, String commitId) {
+		if (commitId == null || commitId.trim().length() == 0) {
+			return newRepositoryParameter(repositoryName);
+		}
+		return new PageParameters("p=" + repositoryName + ",h=" + commitId);
+	}
+
+	public static PageParameters newPathParameter(String repositoryName, String commitId, String path) {
+		if (path == null || path.trim().length() == 0) {
+			return newCommitParameter(repositoryName, commitId);
+		}
+		return new PageParameters("p=" + repositoryName + ",h=" + commitId + ",f=" + path);
+	}
+	
+	public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone) {
+		DateFormat df = new SimpleDateFormat(StoredSettings.getString("datestampShortFormat", "MM/dd/yy"));
+		if (timeZone != null) {
+			df.setTimeZone(timeZone);
+		}
+		String dateString = df.format(date);
+		String title = Utils.timeAgo(date);
+		if ((System.currentTimeMillis() - date.getTime()) < 10 * 24 * 60 * 60 * 1000l) {
+			String tmp = dateString;
+			dateString = title;
+			title = tmp;
+		}
+		Label label = new Label(wicketId, dateString);
+		WicketUtils.setCssClass(label, Utils.timeAgoCss(date));
+		WicketUtils.setHtmlTitle(label, title);
+		return label;
+	}
 }
diff --git a/src/com/gitblit/wicket/models/RefModel.java b/src/com/gitblit/wicket/models/RefModel.java
index 08de110..0c78434 100644
--- a/src/com/gitblit/wicket/models/RefModel.java
+++ b/src/com/gitblit/wicket/models/RefModel.java
@@ -52,7 +52,8 @@
 	}
 	
 	public boolean isAnnotatedTag() {
-		return ref.isPeeled();
+		// ref.isPeeled() ??
+		return !getCommitId().equals(getObjectId());
 	}
 		
 	@Override
diff --git a/src/com/gitblit/wicket/pages/BlobPage.html b/src/com/gitblit/wicket/pages/BlobPage.html
index 913ab0b..82ba320 100644
--- a/src/com/gitblit/wicket/pages/BlobPage.html
+++ b/src/com/gitblit/wicket/pages/BlobPage.html
@@ -31,7 +31,7 @@
 		<div wicket:id="breadcrumbs">[breadcrumbs]</div>
 		
 		<!--  blob content -->
-		<pre wicket:id="blobText">[blob content]</pre>
+		<pre style="border:0px;" wicket:id="blobText">[blob content]</pre>
 	
 </body>
 </wicket:extend>
diff --git a/src/com/gitblit/wicket/pages/BranchesPage.html b/src/com/gitblit/wicket/pages/BranchesPage.html
index 33d5082..606cbf4 100644
--- a/src/com/gitblit/wicket/pages/BranchesPage.html
+++ b/src/com/gitblit/wicket/pages/BranchesPage.html
@@ -9,20 +9,10 @@
 
 	<!-- page nav links -->	
 	<div wicket:id="pageLinks">[page links]</div>
-	
-	<!-- shortlog -->	
-	<div style="margin-top:5px;" class="header" wicket:id="summary">[header]</div>	
-	<table class="pretty">
-		<tbody>
-       		<tr wicket:id="branch">
-         		<td class="date"><span wicket:id="branchDate">[branch date]</span></td>
-         		<td><div wicket:id="branchName">[branch name]</div></td>
-         		<td><div wicket:id="branchType">[branch type]</div></td>
-         		<td class="rightAlign"><span wicket:id="branchLinks">[branch links]</span></td>
-       		</tr>
-    	</tbody>
-	</table>	
 
+	<!-- branches -->	
+	<div style="margin-top:5px;" wicket:id="branchesPanel">[branches panel]</div>
+	
 </wicket:extend>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/BranchesPage.java b/src/com/gitblit/wicket/pages/BranchesPage.java
index 30fac1a..f4359d8 100644
--- a/src/com/gitblit/wicket/pages/BranchesPage.java
+++ b/src/com/gitblit/wicket/pages/BranchesPage.java
@@ -1,23 +1,9 @@
 package com.gitblit.wicket.pages;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.apache.wicket.PageParameters;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.data.DataView;
-import org.apache.wicket.markup.repeater.data.ListDataProvider;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Repository;
 
-import com.gitblit.utils.JGitUtils;
-import com.gitblit.utils.Utils;
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.RepositoryPage;
-import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.models.RefModel;
-import com.gitblit.wicket.panels.BranchLinksPanel;
+import com.gitblit.wicket.panels.BranchesPanel;
 
 
 public class BranchesPage extends RepositoryPage {
@@ -25,44 +11,7 @@
 	public BranchesPage(PageParameters params) {
 		super(params);
 
-		Repository r = getRepository();
-		List<RefModel> branches = new ArrayList<RefModel>();
-		branches.addAll(JGitUtils.getLocalBranches(r, -1));
-		branches.addAll(JGitUtils.getRemoteBranches(r, -1));
-
-		// shortlog
-		add(new LinkPanel("summary", "title", repositoryName, SummaryPage.class, newRepositoryParameter()));
-
-		ListDataProvider<RefModel> branchesDp = new ListDataProvider<RefModel>(branches);
-		DataView<RefModel> branchView = new DataView<RefModel>("branch", branchesDp) {
-			private static final long serialVersionUID = 1L;
-			int counter = 0;
-
-			public void populateItem(final Item<RefModel> item) {
-				final RefModel entry = item.getModelObject();
-				String date;
-				if (entry.getDate() != null) {
-					date = Utils.timeAgo(entry.getDate());
-				} else {
-					date = "";
-				}
-				Label branchDateLabel = new Label("branchDate", date);
-				item.add(branchDateLabel);
-				WicketUtils.setCssClass(branchDateLabel, Utils.timeAgoCss(entry.getDate()));
-
-				item.add(new LinkPanel("branchName", "list name", entry.getDisplayName(), ShortLogPage.class, newCommitParameter(entry.getName())));
-
-				boolean remote = entry.getName().startsWith(Constants.R_REMOTES);
-				item.add(new Label("branchType", remote ? getString("gb.remote"):getString("gb.local")));
-				
-				item.add(new BranchLinksPanel("branchLinks", repositoryName, entry));
-				
-				String clazz = counter % 2 == 0 ? "dark" : "light";
-				WicketUtils.setCssClass(item, clazz);
-				counter++;
-			}
-		};
-		add(branchView);
+		add(new BranchesPanel("branchesPanel", repositoryName, getRepository(), -1));
 	}
 	
 	@Override
diff --git a/src/com/gitblit/wicket/pages/CommitPage.html b/src/com/gitblit/wicket/pages/CommitPage.html
index 1b79e63..e49cd57 100644
--- a/src/com/gitblit/wicket/pages/CommitPage.html
+++ b/src/com/gitblit/wicket/pages/CommitPage.html
@@ -38,7 +38,11 @@
 	<table class="pretty">
 		<tr wicket:id="changedPath">
 			<td class="path"><span wicket:id="pathName">[commit path]</span></td>			
-			<td><span wicket:id="pathLinks">[path links]</span></td>
+			<td>
+				<div class="link">
+					<a wicket:id="diff"><wicket:message key="gb.diff"></wicket:message></a> | <a wicket:id="view"><wicket:message key="gb.view"></wicket:message></a> | <a wicket:id="history"><wicket:message key="gb.history"></wicket:message></a>
+				</div>
+			</td>
 		</tr>
 	</table>
 	
diff --git a/src/com/gitblit/wicket/pages/CommitPage.java b/src/com/gitblit/wicket/pages/CommitPage.java
index f460827..b0a92b0 100644
--- a/src/com/gitblit/wicket/pages/CommitPage.java
+++ b/src/com/gitblit/wicket/pages/CommitPage.java
@@ -5,6 +5,7 @@
 
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.markup.repeater.data.DataView;
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
@@ -17,7 +18,6 @@
 import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.models.PathModel;
-import com.gitblit.wicket.panels.PathLinksPanel;
 
 
 public class CommitPage extends RepositoryPage {
@@ -45,7 +45,7 @@
 		}
 		add(new Label("patchLink", getString("gb.patch")));
 		
-		add(new LinkPanel("shortlog", "title", c.getShortMessage(), ShortLogPage.class, newRepositoryParameter()));
+		add(new LinkPanel("shortlog", "title", c.getShortMessage(), LogPage.class, newRepositoryParameter()));
 		
 		addRefs(r, c);
 
@@ -89,9 +89,12 @@
 				} else {
 					item.add(new LinkPanel("pathName", "list", entry.path, BlobPage.class, newPathParameter(entry.path)));
 				}
-				item.add(new PathLinksPanel("pathLinks", repositoryName, entry));
-				String clazz = counter % 2 == 0 ? "dark" : "light";
-				WicketUtils.setCssClass(item, clazz);
+				
+				item.add(new BookmarkablePageLink<Void>("diff", DiffPage.class, newPathParameter(entry.path)));
+				item.add(new BookmarkablePageLink<Void>("view", BlobPage.class, newPathParameter(entry.path)));
+				item.add(new BookmarkablePageLink<Void>("history", BlobPage.class).setEnabled(false));
+
+				WicketUtils.setAlternatingBackground(item, counter);
 				counter++;
 			}
 		};
diff --git a/src/com/gitblit/wicket/pages/LogPage.html b/src/com/gitblit/wicket/pages/LogPage.html
new file mode 100644
index 0000000..82abb1b
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/LogPage.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
+      xml:lang="en"  
+      lang="en"> 
+
+<body>
+<wicket:extend>
+
+	<!-- page nav links -->	
+	<div wicket:id="pageLinks">[page links]</div>
+
+	<!-- log -->
+	<div style="margin-top:5px;" wicket:id="logPanel">[log panel]</div>
+	
+</wicket:extend>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/LogPage.java b/src/com/gitblit/wicket/pages/LogPage.java
new file mode 100644
index 0000000..56ab07a
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/LogPage.java
@@ -0,0 +1,21 @@
+package com.gitblit.wicket.pages;
+
+import org.apache.wicket.PageParameters;
+
+import com.gitblit.wicket.RepositoryPage;
+import com.gitblit.wicket.panels.LogPanel;
+
+
+public class LogPage extends RepositoryPage {
+
+	public LogPage(PageParameters params) {
+		super(params);
+
+		add(new LogPanel("logPanel", repositoryName, getRepository(), 100, true));
+	}
+	
+	@Override
+	protected String getPageName() {
+		return getString("gb.log");
+	}
+}
diff --git a/src/com/gitblit/wicket/pages/ShortLogPage.html b/src/com/gitblit/wicket/pages/ShortLogPage.html
deleted file mode 100644
index 3336931..0000000
--- a/src/com/gitblit/wicket/pages/ShortLogPage.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"  
-      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
-      xml:lang="en"  
-      lang="en"> 
-
-<body>
-<wicket:extend>
-
-	<!-- page nav links -->	
-	<div wicket:id="pageLinks">[page links]</div>
-	
-	<!-- shortlog -->	
-	<div style="margin-top:5px;" class="header" wicket:id="summary">[shortlog header]</div>	
-	<table style="width:100%" "class="pretty">
-		<tbody>
-       		<tr wicket:id="commit">
-         		<td class="date"><span wicket:id="commitDate">[commit date]</span></td>
-         		<td class="author"><span wicket:id="commitAuthor">[commit author]</span></td>
-         		<td><div wicket:id="commitShortMessage">[commit short message]</div></td>
-         		<td class="rightAlign"><div wicket:id="commitRefs">[commit refs]</div></td>         		
-         		<td class="rightAlign"><span wicket:id="commitLinks">[commit links]</span></td>
-       		</tr>
-    	</tbody>
-	</table>	
-	<div class="pager" wicket:id="navigator">[pager]</div>
-	
-</wicket:extend>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/ShortLogPage.java b/src/com/gitblit/wicket/pages/ShortLogPage.java
deleted file mode 100644
index c83050d..0000000
--- a/src/com/gitblit/wicket/pages/ShortLogPage.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package com.gitblit.wicket.pages;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.data.DataView;
-import org.apache.wicket.markup.repeater.data.ListDataProvider;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-import com.gitblit.utils.JGitUtils;
-import com.gitblit.wicket.GitBlitWebApp;
-import com.gitblit.wicket.LinkPanel;
-import com.gitblit.wicket.RepositoryPage;
-import com.gitblit.wicket.WicketUtils;
-import com.gitblit.wicket.panels.RefsPanel;
-import com.gitblit.wicket.panels.ShortLogLinksPanel;
-
-
-public class ShortLogPage extends RepositoryPage {
-
-	public ShortLogPage(PageParameters params) {
-		super(params);
-
-		Repository r = getRepository();
-		final Map<ObjectId, List<String>> allRefs = JGitUtils.getAllRefs(r);
-		List<RevCommit> commits = JGitUtils.getRevLog(r, 100);
-
-		// shortlog
-		add(new LinkPanel("summary", "title", repositoryName, SummaryPage.class, newRepositoryParameter()));
-
-		ListDataProvider<RevCommit> dp = new ListDataProvider<RevCommit>(commits);
-		DataView<RevCommit> shortlogView = new DataView<RevCommit>("commit", dp) {
-			private static final long serialVersionUID = 1L;
-			int counter = 0;
-
-			public void populateItem(final Item<RevCommit> item) {
-				final RevCommit entry = item.getModelObject();
-				final Date date = JGitUtils.getCommitDate(entry);
-
-				item.add(createShortlogDateLabel("commitDate", date));
-
-				String author = entry.getAuthorIdent().getName();
-				item.add(createAuthorLabel("commitAuthor", author));
-
-				String shortMessage = entry.getShortMessage();
-				String trimmedMessage = trimShortLog(shortMessage);
-				LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject", trimmedMessage, CommitPage.class, newCommitParameter(entry.getName()));
-				if (!shortMessage.equals(trimmedMessage)) {
-					WicketUtils.setHtmlTitle(shortlog, shortMessage);
-				}
-				item.add(shortlog);
-				
-				item.add(new RefsPanel("commitRefs", entry, allRefs));
-				
-				item.add(new ShortLogLinksPanel("commitLinks", repositoryName, entry.getName()));
-
-				String clazz = counter % 2 == 0 ? "dark" : "light";
-				WicketUtils.setCssClass(item, clazz);
-				counter++;
-			}
-		};
-		shortlogView.setItemsPerPage(GitBlitWebApp.PAGING_ITEM_COUNT);
-		add(shortlogView);
-		add(new PagingNavigator("navigator", shortlogView));
-	}
-	
-	@Override
-	protected String getPageName() {
-		return getString("gb.shortlog");
-	}
-}
diff --git a/src/com/gitblit/wicket/pages/SummaryPage.html b/src/com/gitblit/wicket/pages/SummaryPage.html
index cba149e..4151640 100644
--- a/src/com/gitblit/wicket/pages/SummaryPage.html
+++ b/src/com/gitblit/wicket/pages/SummaryPage.html
@@ -27,54 +27,17 @@
 		</div>
 	</div>
 
-	<!-- shortlog -->
-	<div class="header" wicket:id="shortlog">[shortlog header]</div>	
-	<table style="width:100%" class="pretty">
-		<tbody>
-       		<tr wicket:id="commit">
-         		<td class="date"><span wicket:id="commitDate">[commit date]</span></td>
-         		<td class="author"><span wicket:id="commitAuthor">[commit author]</span></td>
-         		<td><div wicket:id="commitShortMessage">[commit short message]</div></td>
-         		<td class="rightAlign"><div wicket:id="commitRefs">[commit refs]</div></td>
-         		<td class="rightAlign"><span wicket:id="commitLinks">[commit links]</span></td>
-       		</tr>
-    	</tbody>
-	</table>	
-	<div class="pager" wicket:id="shortlogMore">[more shortlogs]</div>
+	<!-- commits -->
+	<div wicket:id="commitsPanel">[commits panel]</div>	
 
-	<!-- Open Branches Body -->
+	<!-- branches -->
 	<div style="width:400px; float:left;">
-		<!-- heads -->
-		<div class="header" wicket:id="branches">[branches header]</div>	
-		<table style="width:100%" class="pretty">
-			<tbody>
-   				<tr wicket:id="branch">
-       				<td class="date"><span wicket:id="branchDate">[branch date]</span></td>
-       				<td><div wicket:id="branchName">[branch name]</div></td>
-       				<td class="rightAlign"><span wicket:id="branchLinks">[branch links]</span></td>
-   				</tr>
-   			</tbody>
-		</table>
-		<div class="pager" wicket:id="allBranches">[all branches]</div>
-		<!-- Close Branches Body -->
+		<div wicket:id="branchesPanel">[branches panel]</div>
 	</div>
 
-	<!-- Open Tags body -->
+	<!-- tags -->
 	<div style="margin-left:405px;">
-		<!-- tags -->
-		<div class="header" wicket:id="tags">[tags header]</div>	
-			<table style="width:100%" class="pretty">
-				<tbody>
-       				<tr wicket:id="tag">
-         				<td class="date"><span wicket:id="tagDate">[tag date]</span></td>
-         				<td><b><div wicket:id="tagName">[tag name]</div></b></td>
-         				<td><div wicket:id="tagDescription">[tag description]</div></td>
-         				<td class="rightAlign"><span wicket:id="tagLinks">[tag links]</span></td>
-       				</tr>
-    			</tbody>
-			</table>
-		<div class="pager" wicket:id="allTags">[all tags]</div>	
-	<!-- Close Tags Body -->
+		<div wicket:id="tagsPanel">[tags panel]</div>
 	</div>
 	
 </wicket:extend>	
diff --git a/src/com/gitblit/wicket/pages/SummaryPage.java b/src/com/gitblit/wicket/pages/SummaryPage.java
index 0fef375..72643a7 100644
--- a/src/com/gitblit/wicket/pages/SummaryPage.java
+++ b/src/com/gitblit/wicket/pages/SummaryPage.java
@@ -1,21 +1,12 @@
 package com.gitblit.wicket.pages;
 
 import java.awt.Dimension;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
 import java.util.List;
-import java.util.Map;
 
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.image.ContextImage;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.data.DataView;
-import org.apache.wicket.markup.repeater.data.ListDataProvider;
-import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
 
 import com.codecommit.wicket.AbstractChartData;
 import com.codecommit.wicket.Chart;
@@ -28,16 +19,11 @@
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.wicket.GitBlitWebApp;
 import com.gitblit.wicket.GitBlitWebSession;
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.RepositoryPage;
-import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.models.Metric;
-import com.gitblit.wicket.models.RefModel;
-import com.gitblit.wicket.panels.AnnotatedTagLinksPanel;
-import com.gitblit.wicket.panels.BranchLinksPanel;
-import com.gitblit.wicket.panels.RefsPanel;
-import com.gitblit.wicket.panels.ShortLogLinksPanel;
-import com.gitblit.wicket.panels.TagLinksPanel;
+import com.gitblit.wicket.panels.BranchesPanel;
+import com.gitblit.wicket.panels.LogPanel;
+import com.gitblit.wicket.panels.TagsPanel;
 
 public class SummaryPage extends RepositoryPage {
 
@@ -57,8 +43,7 @@
 			numberRefs = numRefsDef;
 		}
 		
-		Repository r = getRepository();
-		final Map<ObjectId, List<String>> allRefs = JGitUtils.getAllRefs(r);
+		Repository r = getRepository();		
 
 		String owner = JGitUtils.getRepositoryOwner(r);
 		GitBlitWebSession session = GitBlitWebSession.get();
@@ -71,120 +56,9 @@
 		add(new Label("repositoryLastChange", lastchange));
 		add(new Label("repositoryCloneUrl", cloneurl));
 
-		// shortlog
-		add(new LinkPanel("shortlog", "title", getString("gb.shortlog"), ShortLogPage.class, newRepositoryParameter()));
-
-		List<RevCommit> commits = JGitUtils.getRevLog(r, numberCommits);
-		ListDataProvider<RevCommit> dp = new ListDataProvider<RevCommit>(commits);
-		DataView<RevCommit> shortlogView = new DataView<RevCommit>("commit", dp) {
-			private static final long serialVersionUID = 1L;
-			int counter = 0;
-
-			public void populateItem(final Item<RevCommit> item) {
-				RevCommit entry = item.getModelObject();
-				Date date = JGitUtils.getCommitDate(entry);
-
-				item.add(createShortlogDateLabel("commitDate", date));
-
-				String author = entry.getAuthorIdent().getName();
-				item.add(createAuthorLabel("commitAuthor", author));
-
-				String shortMessage = entry.getShortMessage();
-				String trimmedMessage = trimShortLog(shortMessage);
-				LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject", trimmedMessage, CommitPage.class, newCommitParameter(entry.getName()));
-				if (!shortMessage.equals(trimmedMessage)) {
-					WicketUtils.setHtmlTitle(shortlog, shortMessage);
-				}
-				item.add(shortlog);
-
-				item.add(new RefsPanel("commitRefs", entry, allRefs));
-
-				item.add(new ShortLogLinksPanel("commitLinks", repositoryName, entry.getName()));
-
-				setAlternatingBackground(item, counter);
-				counter++;
-			}
-		};
-		add(shortlogView);
-		if (commits.size() < numberCommits) {
-			add(new Label("shortlogMore", "").setVisible(false));
-		} else {
-			add(new LinkPanel("shortlogMore", "link", getString("gb.more") + "...", ShortLogPage.class, newRepositoryParameter()));
-		}
-
-		// tags
-		List<RefModel> tags = JGitUtils.getTags(r, numberRefs);
-		add(new LinkPanel("tags", "title", getString("gb.tags"), TagsPage.class, newRepositoryParameter()));
-
-		ListDataProvider<RefModel> tagsDp = new ListDataProvider<RefModel>(tags);
-		DataView<RefModel> tagView = new DataView<RefModel>("tag", tagsDp) {
-			private static final long serialVersionUID = 1L;
-			int counter = 0;
-
-			public void populateItem(final Item<RefModel> item) {
-				final RefModel entry = item.getModelObject();
-
-				item.add(createDateLabel("tagDate", entry.getDate()));
-
-				item.add(new LinkPanel("tagName", "list name", entry.getDisplayName(), CommitPage.class, newCommitParameter(entry.getCommitId().getName())));
-
-				if (entry.isAnnotatedTag()) {
-					// annotated tag
-					item.add(new LinkPanel("tagDescription", "list subject", entry.getShortLog(), TagPage.class, newCommitParameter(entry.getObjectId().getName())));
-					item.add(new AnnotatedTagLinksPanel("tagLinks", repositoryName, entry));
-				} else {
-					// simple tag on commit object
-					item.add(new Label("tagDescription", ""));
-					item.add(new TagLinksPanel("tagLinks", repositoryName, entry));
-				}
-
-				setAlternatingBackground(item, counter);
-				counter++;
-			}
-		};
-		add(tagView);
-		if (tags.size() < numberRefs) {
-			add(new Label("allTags", "").setVisible(false));
-		} else {
-			add(new LinkPanel("allTags", "link", getString("gb.allTags") + "...", TagsPage.class, newRepositoryParameter()));
-		}
-
-		// branches
-		List<RefModel> branches = new ArrayList<RefModel>();
-		branches.addAll(JGitUtils.getLocalBranches(r, numberRefs));
-		branches.addAll(JGitUtils.getRemoteBranches(r, numberRefs));
-		Collections.sort(branches);
-		Collections.reverse(branches);
-		if (numberRefs > 0 && branches.size() > numberRefs) {
-			branches = new ArrayList<RefModel>(branches.subList(0, numberRefs));
-		}
-
-		add(new LinkPanel("branches", "title", getString("gb.branches"), BranchesPage.class, newRepositoryParameter()));
-
-		ListDataProvider<RefModel> branchesDp = new ListDataProvider<RefModel>(branches);
-		DataView<RefModel> branchesView = new DataView<RefModel>("branch", branchesDp) {
-			private static final long serialVersionUID = 1L;
-			int counter = 0;
-
-			public void populateItem(final Item<RefModel> item) {
-				final RefModel entry = item.getModelObject();
-
-				item.add(createDateLabel("branchDate", entry.getDate()));
-
-				item.add(new LinkPanel("branchName", "list name", trimString(entry.getDisplayName(), 28), ShortLogPage.class, newCommitParameter(entry.getName())));
-
-				item.add(new BranchLinksPanel("branchLinks", repositoryName, entry));
-
-				setAlternatingBackground(item, counter);
-				counter++;
-			}
-		};
-		add(branchesView);
-		if (branches.size() < numberRefs) {
-			add(new Label("allBranches", "").setVisible(false));
-		} else {
-			add(new LinkPanel("allBranches", "link", getString("gb.allBranches") + "...", BranchesPage.class, newRepositoryParameter()));
-		}
+		add(new LogPanel("commitsPanel", repositoryName, r, numberCommits, false));
+		add(new TagsPanel("tagsPanel", repositoryName, r, numberRefs));
+		add(new BranchesPanel("branchesPanel", repositoryName, r, numberRefs));
 		
 		// Display an activity line graph
 		insertActivityGraph(r);
diff --git a/src/com/gitblit/wicket/pages/TagsPage.html b/src/com/gitblit/wicket/pages/TagsPage.html
index f2bce49..3a49a74 100644
--- a/src/com/gitblit/wicket/pages/TagsPage.html
+++ b/src/com/gitblit/wicket/pages/TagsPage.html
@@ -10,18 +10,8 @@
 	<!-- page nav links -->	
 	<div wicket:id="pageLinks">[page links]</div>
 
-	<!-- shortlog -->	
-	<div style="margin-top:5px;" class="header" wicket:id="summary">[header]</div>	
-	<table class="pretty">
-		<tbody>
-       		<tr wicket:id="tag">
-         		<td class="date"><span wicket:id="tagDate">[tag date]</span></td>
-         		<td><b><div wicket:id="tagName">[tag name]</div></b></td>
-         		<td><div wicket:id="tagDescription">[tag description]</div></td>
-         		<td class="rightAlign"><span wicket:id="tagLinks">[tag links]</span></td>
-       		</tr>
-    	</tbody>
-	</table>	
+	<!-- tags panel -->
+	<div style="margin-top:5px;" wicket:id="tagsPanel">[tags panel]</div>
 	
 </wicket:extend>	
 </body>
diff --git a/src/com/gitblit/wicket/pages/TagsPage.java b/src/com/gitblit/wicket/pages/TagsPage.java
index 2f5b029..eb1742d 100644
--- a/src/com/gitblit/wicket/pages/TagsPage.java
+++ b/src/com/gitblit/wicket/pages/TagsPage.java
@@ -1,58 +1,18 @@
 package com.gitblit.wicket.pages;
 
-import java.util.List;
-
 import org.apache.wicket.PageParameters;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.data.DataView;
-import org.apache.wicket.markup.repeater.data.ListDataProvider;
-import org.eclipse.jgit.lib.Repository;
 
-import com.gitblit.utils.JGitUtils;
-import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.RepositoryPage;
-import com.gitblit.wicket.models.RefModel;
-import com.gitblit.wicket.panels.AnnotatedTagLinksPanel;
-import com.gitblit.wicket.panels.TagLinksPanel;
+import com.gitblit.wicket.panels.TagsPanel;
 
 
 public class TagsPage extends RepositoryPage {
 
 	public TagsPage(PageParameters params) {
 		super(params);
-		Repository r = getRepository();
-		List<RefModel> tags = JGitUtils.getTags(r, -1);
-
-		// shortlog
-		add(new LinkPanel("summary", "title", repositoryName, SummaryPage.class, newRepositoryParameter()));
-
-		ListDataProvider<RefModel> tagsDp = new ListDataProvider<RefModel>(tags);
-		DataView<RefModel> tagView = new DataView<RefModel>("tag", tagsDp) {
-			private static final long serialVersionUID = 1L;
-			int counter = 0;
-
-			public void populateItem(final Item<RefModel> item) {
-				final RefModel entry = item.getModelObject();
-				item.add(createDateLabel("tagDate", entry.getDate()));
-
-				item.add(new LinkPanel("tagName", "list name", entry.getDisplayName(), CommitPage.class, newCommitParameter(entry.getObjectId().getName())));
-
-				if (entry.isAnnotatedTag()) {
-					// annotated tag
-					item.add(new LinkPanel("tagDescription", "list subject", entry.getShortLog(), TagPage.class, newCommitParameter(entry.getObjectId().getName())));
-					item.add(new AnnotatedTagLinksPanel("tagLinks", repositoryName, entry));
-				} else {
-					// simple tag on commit object
-					item.add(new Label("tagDescription", ""));
-					item.add(new TagLinksPanel("tagLinks", repositoryName, entry));
-				}
-
-				setAlternatingBackground(item, counter);
-				counter++;
-			}
-		};
-		add(tagView);
+		
+		add(new TagsPanel("tagsPanel", repositoryName, getRepository(), -1));
+		
 	}
 	
 	@Override
diff --git a/src/com/gitblit/wicket/pages/TicGitPage.html b/src/com/gitblit/wicket/pages/TicGitPage.html
index 262257e..e339232 100644
--- a/src/com/gitblit/wicket/pages/TicGitPage.html
+++ b/src/com/gitblit/wicket/pages/TicGitPage.html
@@ -11,7 +11,7 @@
 	<div wicket:id="pageLinks">[page links]</div>
 
 	<!-- header -->	
-	<div style="margin-top:5px;" class="header" wicket:id="summary">[header]</div>
+	<div style="margin-top:5px;" class="header" wicket:id="header">[header]</div>
 	
 	<!-- tickets -->	
 	<table style="width:100%" class="pretty">
diff --git a/src/com/gitblit/wicket/pages/TicGitPage.java b/src/com/gitblit/wicket/pages/TicGitPage.java
index 001002c..2cfb772 100644
--- a/src/com/gitblit/wicket/pages/TicGitPage.java
+++ b/src/com/gitblit/wicket/pages/TicGitPage.java
@@ -7,10 +7,10 @@
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.markup.repeater.data.DataView;
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
-import org.eclipse.jgit.lib.Repository;
 
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.utils.TicGitTicket;
+import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.LinkPanel;
 import com.gitblit.wicket.RepositoryPage;
 import com.gitblit.wicket.WicketUtils;
@@ -20,11 +20,10 @@
 	public TicGitPage(PageParameters params) {
 		super(params);
 
-		Repository r = getRepository();
-		List<TicGitTicket> tickets = JGitUtils.getTicGitTickets(r);
+		List<TicGitTicket> tickets = JGitUtils.getTicGitTickets(getRepository());
 
-		// shortlog
-		add(new LinkPanel("summary", "title", repositoryName, SummaryPage.class, newRepositoryParameter()));
+		// header
+		add(new LinkPanel("header", "title", repositoryName, SummaryPage.class, newRepositoryParameter()));
 
 		ListDataProvider<TicGitTicket> ticketsDp = new ListDataProvider<TicGitTicket>(tickets);
 		DataView<TicGitTicket> ticketsView = new DataView<TicGitTicket>("ticket", ticketsDp) {
@@ -36,11 +35,11 @@
 				Label stateLabel = new Label("ticketState", entry.state);
 				WicketUtils.setTicketCssClass(stateLabel, entry.state);
 				item.add(stateLabel);
-				item.add(createDateLabel("ticketDate", entry.date));
-				item.add(new Label("ticketHandler", trimString(entry.handler, 30)));
-				item.add(new LinkPanel("ticketTitle", null, trimString(entry.title, 80), TicGitTicketPage.class, newPathParameter(entry.name)));
+				item.add(WicketUtils.createDateLabel("ticketDate", entry.date, GitBlitWebSession.get().getTimezone()));
+				item.add(new Label("ticketHandler", WicketUtils.trimString(entry.handler, 30)));
+				item.add(new LinkPanel("ticketTitle", null, WicketUtils.trimString(entry.title, 80), TicGitTicketPage.class, newPathParameter(entry.name)));
 
-				setAlternatingBackground(item, counter);
+				WicketUtils.setAlternatingBackground(item, counter);
 				counter++;
 			}
 		};
diff --git a/src/com/gitblit/wicket/pages/TicGitTicketPage.html b/src/com/gitblit/wicket/pages/TicGitTicketPage.html
index 5b39268..47fa87b 100644
--- a/src/com/gitblit/wicket/pages/TicGitTicketPage.html
+++ b/src/com/gitblit/wicket/pages/TicGitTicketPage.html
@@ -30,7 +30,7 @@
 		<tbody>
 			<tr wicket:id="comment">
          		<td class="date"><span wicket:id="commentDate">[comment date]</span></td>
-         		<td><b><div wicket:id="commentAuthor">[comment author]</div></b></td>
+         		<td class="author"><span wicket:id="commentAuthor">[comment author]</span></td>
          		<td><div wicket:id="commentText">[comment text]</div></td>
        		</tr>
        	</tbody>
diff --git a/src/com/gitblit/wicket/pages/TicGitTicketPage.java b/src/com/gitblit/wicket/pages/TicGitTicketPage.java
index 06a7a5a..5d3ceb4 100644
--- a/src/com/gitblit/wicket/pages/TicGitTicketPage.java
+++ b/src/com/gitblit/wicket/pages/TicGitTicketPage.java
@@ -41,10 +41,10 @@
 
 			public void populateItem(final Item<Comment> item) {
 				final Comment entry = item.getModelObject();
-				item.add(createDateLabel("commentDate", entry.date));
+				item.add(WicketUtils.createDateLabel("commentDate", entry.date, GitBlitWebSession.get().getTimezone()));
 				item.add(new Label("commentAuthor", entry.author));
 				item.add(new Label("commentText", prepareComment(entry.text)).setEscapeModelStrings(false));
-				setAlternatingBackground(item, counter);
+				WicketUtils.setAlternatingBackground(item, counter);
 				counter++;
 			}
 		};
diff --git a/src/com/gitblit/wicket/panels/AdminLinksPanel.java b/src/com/gitblit/wicket/panels/AdminLinksPanel.java
index 628036f..3199447 100644
--- a/src/com/gitblit/wicket/panels/AdminLinksPanel.java
+++ b/src/com/gitblit/wicket/panels/AdminLinksPanel.java
@@ -1,10 +1,11 @@
 package com.gitblit.wicket.panels;
 
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.panel.Panel;
 
 import com.gitblit.wicket.pages.RepositoriesPage;
 
-public class AdminLinksPanel extends BasePanel {
+public class AdminLinksPanel extends Panel {
 
 	private static final long serialVersionUID = 1L;
 
diff --git a/src/com/gitblit/wicket/panels/AnnotatedTagLinksPanel.html b/src/com/gitblit/wicket/panels/AnnotatedTagLinksPanel.html
deleted file mode 100644
index 1bedc69..0000000
--- a/src/com/gitblit/wicket/panels/AnnotatedTagLinksPanel.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"  
-      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
-      xml:lang="en"  
-      lang="en"> 
-
-<wicket:panel>
-	<div class="link">
-		<a wicket:id="tag"><wicket:message key="gb.tag"></wicket:message></a> | <a wicket:id="commit"><wicket:message key="gb.commit"></wicket:message></a> | <a wicket:id="shortlog"><wicket:message key="gb.shortlog"></wicket:message></a>
-	</div>	
-</wicket:panel>
-</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/AnnotatedTagLinksPanel.java b/src/com/gitblit/wicket/panels/AnnotatedTagLinksPanel.java
deleted file mode 100644
index 3a494df..0000000
--- a/src/com/gitblit/wicket/panels/AnnotatedTagLinksPanel.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.gitblit.wicket.panels;
-
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-
-import com.gitblit.wicket.models.RefModel;
-import com.gitblit.wicket.pages.CommitPage;
-import com.gitblit.wicket.pages.ShortLogPage;
-import com.gitblit.wicket.pages.TagPage;
-
-
-public class AnnotatedTagLinksPanel extends BasePanel {
-
-	private static final long serialVersionUID = 1L;
-
-	public AnnotatedTagLinksPanel(String id, String repositoryName, RefModel tag) {
-		super(id);
-		add(new BookmarkablePageLink<Void>("tag", TagPage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getObjectId().getName())));
-		add(new BookmarkablePageLink<Void>("commit", CommitPage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getCommitId().getName())));
-		add(new BookmarkablePageLink<Void>("shortlog", ShortLogPage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getName())));
-	}
-}
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/BasePanel.java b/src/com/gitblit/wicket/panels/BasePanel.java
deleted file mode 100644
index 48f5218..0000000
--- a/src/com/gitblit/wicket/panels/BasePanel.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.gitblit.wicket.panels;
-
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.StringResourceModel;
-
-public abstract class BasePanel extends Panel {
-
-	private static final long serialVersionUID = 1L;
-
-	public BasePanel(String id) {
-		super(id);
-	}
-	
-	public StringResourceModel stringModel(String key) {
-		return new StringResourceModel(key, this, null);
-	}
-}
diff --git a/src/com/gitblit/wicket/panels/BranchLinksPanel.html b/src/com/gitblit/wicket/panels/BranchLinksPanel.html
deleted file mode 100644
index 3e51948..0000000
--- a/src/com/gitblit/wicket/panels/BranchLinksPanel.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"  
-      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
-      xml:lang="en"  
-      lang="en"> 
-
-<wicket:panel>
-	<div class="link">
-		<a wicket:id="shortlog"><wicket:message key="gb.shortlog"></wicket:message></a> | <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a>
-	</div>	
-</wicket:panel>
-</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/BranchLinksPanel.java b/src/com/gitblit/wicket/panels/BranchLinksPanel.java
deleted file mode 100644
index ccc8f4e..0000000
--- a/src/com/gitblit/wicket/panels/BranchLinksPanel.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.gitblit.wicket.panels;
-
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-
-import com.gitblit.wicket.models.RefModel;
-import com.gitblit.wicket.pages.ShortLogPage;
-import com.gitblit.wicket.pages.TreePage;
-
-public class BranchLinksPanel extends BasePanel {
-
-	private static final long serialVersionUID = 1L;
-
-	public BranchLinksPanel(String id, String repositoryName, RefModel tag) {
-		super(id);
-		add(new BookmarkablePageLink<Void>("shortlog", ShortLogPage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getName())));
-		add(new BookmarkablePageLink<Void>("tree", TreePage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getName())));
-	}
-}
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/BranchesPanel.html b/src/com/gitblit/wicket/panels/BranchesPanel.html
new file mode 100644
index 0000000..50a1681
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/BranchesPanel.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
+      xml:lang="en"  
+      lang="en"> 
+
+<body>
+<wicket:panel>
+
+	<!-- header -->
+	<div class="header" wicket:id="branches">[branches header]</div>	
+	
+	<table style="width:100%;" class="pretty">
+		<tbody>
+       		<tr wicket:id="branch">
+         		<td class="date"><span wicket:id="branchDate">[branch date]</span></td>
+         		<td><span wicket:id="branchName">[branch name]</span></td>
+         		<td><span wicket:id="branchType">[branch type]</span></td>
+         		<td class="rightAlign">
+         			<div class="link">
+						<a wicket:id="log"><wicket:message key="gb.log"></wicket:message></a> | <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a>
+					</div>	
+				</td>
+       		</tr>
+    	</tbody>
+	</table>	
+
+	<div wicket:id="allBranches">[all branches]</div>	
+		
+	<!-- spacer -->
+	<div style="padding:5px;"></div>
+</wicket:panel>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/BranchesPanel.java b/src/com/gitblit/wicket/panels/BranchesPanel.java
new file mode 100644
index 0000000..dd4596d
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/BranchesPanel.java
@@ -0,0 +1,84 @@
+package com.gitblit.wicket.panels;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.markup.repeater.data.ListDataProvider;
+import org.apache.wicket.model.StringResourceModel;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Repository;
+
+import com.gitblit.utils.JGitUtils;
+import com.gitblit.wicket.GitBlitWebSession;
+import com.gitblit.wicket.LinkPanel;
+import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.models.RefModel;
+import com.gitblit.wicket.pages.BranchesPage;
+import com.gitblit.wicket.pages.LogPage;
+import com.gitblit.wicket.pages.SummaryPage;
+import com.gitblit.wicket.pages.TreePage;
+
+public class BranchesPanel extends Panel {
+
+	private static final long serialVersionUID = 1L;
+
+	public BranchesPanel(String wicketId, final String repositoryName, Repository r, final int maxCount) {
+		super(wicketId);
+
+		// branches
+		List<RefModel> branches = new ArrayList<RefModel>();
+		branches.addAll(JGitUtils.getLocalBranches(r, maxCount));
+		branches.addAll(JGitUtils.getRemoteBranches(r, maxCount));
+		Collections.sort(branches);
+		Collections.reverse(branches);
+		if (maxCount > 0 && branches.size() > maxCount) {
+			branches = new ArrayList<RefModel>(branches.subList(0, maxCount));
+		}
+
+		if (maxCount > 0) {
+			// summary page
+			// show branches page link
+			add(new LinkPanel("branches", "title", new StringResourceModel("gb.branches", this, null), BranchesPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+		} else {
+			// branches page
+			// show repository summary page link
+			add(new LinkPanel("branches", "title", repositoryName, SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+		}
+		
+		ListDataProvider<RefModel> branchesDp = new ListDataProvider<RefModel>(branches);
+		DataView<RefModel> branchesView = new DataView<RefModel>("branch", branchesDp) {
+			private static final long serialVersionUID = 1L;
+			int counter = 0;
+
+			public void populateItem(final Item<RefModel> item) {
+				final RefModel entry = item.getModelObject();
+
+				item.add(WicketUtils.createDateLabel("branchDate", entry.getDate(), GitBlitWebSession.get().getTimezone()));
+
+				item.add(new LinkPanel("branchName", "list name", WicketUtils.trimString(entry.getDisplayName(), 28), LogPage.class, WicketUtils.newCommitParameter(repositoryName, entry.getName())));
+				
+				// only show branch type on the branches page
+				boolean remote = entry.getName().startsWith(Constants.R_REMOTES);
+				item.add(new Label("branchType", remote ? getString("gb.remote"):getString("gb.local")).setVisible(maxCount <= 0));
+				
+				item.add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils.newCommitParameter(repositoryName, entry.getName())));
+				item.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newCommitParameter(repositoryName, entry.getName())));
+
+				WicketUtils.setAlternatingBackground(item, counter);
+				counter++;
+			}
+		};
+		add(branchesView);
+		if (branches.size() < maxCount || maxCount <= 0) {
+			add(new Label("allBranches", "").setVisible(false));
+		} else {
+			add(new LinkPanel("allBranches", "link", new StringResourceModel("gb.allBranches", this, null), BranchesPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+		}
+	}
+}
diff --git a/src/com/gitblit/wicket/panels/LogPanel.html b/src/com/gitblit/wicket/panels/LogPanel.html
new file mode 100644
index 0000000..e342f00
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/LogPanel.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
+      xml:lang="en"  
+      lang="en"> 
+
+<body>
+<wicket:panel>
+
+	<!-- header -->	
+	<div class="header" wicket:id="header">[log header]</div>
+		
+	<table style="width:100%" class="pretty">
+		<tbody>
+       		<tr wicket:id="commit">
+         		<td class="date"><span wicket:id="commitDate">[commit date]</span></td>
+         		<td class="author"><span wicket:id="commitAuthor">[commit author]</span></td>
+         		<td><div wicket:id="commitShortMessage">[commit short message]</div></td>
+         		<td class="rightAlign"><div wicket:id="commitRefs">[commit refs]</div></td>         		
+         		<td class="rightAlign"><div class="link">
+					<a wicket:id="view"><wicket:message key="gb.view"></wicket:message></a> | <a wicket:id="diff"><wicket:message key="gb.diff"></wicket:message></a> | <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a>
+					</div>
+				</td>
+       		</tr>
+    	</tbody>
+	</table>	
+	<div class="pager" wicket:id="pageLogs">[pager]</div>
+	<div wicket:id="moreLogs">[more...]</div>
+	
+	<!-- spacer -->
+	<div style="padding:5px;"></div>
+</wicket:panel>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/LogPanel.java b/src/com/gitblit/wicket/panels/LogPanel.java
new file mode 100644
index 0000000..630be61
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/LogPanel.java
@@ -0,0 +1,118 @@
+package com.gitblit.wicket.panels;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.markup.repeater.data.ListDataProvider;
+import org.apache.wicket.model.StringResourceModel;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+import com.gitblit.utils.JGitUtils;
+import com.gitblit.wicket.GitBlitWebApp;
+import com.gitblit.wicket.GitBlitWebSession;
+import com.gitblit.wicket.LinkPanel;
+import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.pages.CommitPage;
+import com.gitblit.wicket.pages.DiffPage;
+import com.gitblit.wicket.pages.LogPage;
+import com.gitblit.wicket.pages.SummaryPage;
+import com.gitblit.wicket.pages.TreePage;
+
+public class LogPanel extends Panel {
+
+	private static final long serialVersionUID = 1L;
+
+	public LogPanel(String wicketId, final String repositoryName, Repository r, int maxCount, boolean showPager) {
+		super(wicketId);
+
+		final Map<ObjectId, List<String>> allRefs = JGitUtils.getAllRefs(r);
+		List<RevCommit> commits = JGitUtils.getRevLog(r, maxCount);
+
+		// header
+		if (showPager) {
+			// shortlog page
+			// show repository summary page link
+			add(new LinkPanel("header", "title", repositoryName, SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryName)));			
+		} else {
+			// summary page
+			// show shortlog page link
+			add(new LinkPanel("header", "title", new StringResourceModel("gb.log", this, null), LogPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+		}
+
+		ListDataProvider<RevCommit> dp = new ListDataProvider<RevCommit>(commits);
+		DataView<RevCommit> logView = new DataView<RevCommit>("commit", dp) {
+			private static final long serialVersionUID = 1L;
+			int counter = 0;
+
+			public void populateItem(final Item<RevCommit> item) {
+				final RevCommit entry = item.getModelObject();
+				final Date date = JGitUtils.getCommitDate(entry);
+
+				item.add(WicketUtils.createDateLabel("commitDate", date, GitBlitWebSession.get().getTimezone()));
+
+				String author = entry.getAuthorIdent().getName();
+				item.add(WicketUtils.createAuthorLabel("commitAuthor", author));
+
+				String shortMessage = entry.getShortMessage();
+				String trimmedMessage = WicketUtils.trimShortLog(shortMessage);
+				LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject", trimmedMessage, CommitPage.class, WicketUtils.newCommitParameter(repositoryName, entry.getName()));
+				if (!shortMessage.equals(trimmedMessage)) {
+					WicketUtils.setHtmlTitle(shortlog, shortMessage);
+				}
+				item.add(shortlog);
+
+				item.add(new RefsPanel("commitRefs", entry, allRefs));
+
+				item.add(new BookmarkablePageLink<Void>("view", CommitPage.class, WicketUtils.newCommitParameter(repositoryName, entry.getName())));
+				item.add(new BookmarkablePageLink<Void>("diff", DiffPage.class, WicketUtils.newCommitParameter(repositoryName, entry.getName())));
+				item.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newCommitParameter(repositoryName, entry.getName())));
+
+				WicketUtils.setAlternatingBackground(item, counter);
+				counter++;
+			}
+		};
+		add(logView);
+
+		// determine to show pager, more, or neither
+		if (maxCount <= 0) {
+			// no display limit
+			add(new Label("moreLogs", "").setVisible(false));
+			add(new Label("pageLogs", "").setVisible(false));
+		} else {
+			if (commits.size() == maxCount) {
+
+			}
+			if (showPager) {
+				// paging
+				add(new Label("moreLogs", "").setVisible(false));
+				if (commits.size() == maxCount) {
+					// show pager
+					logView.setItemsPerPage(GitBlitWebApp.PAGING_ITEM_COUNT);
+					add(new PagingNavigator("pageLogs", logView));
+				} else {
+					// nothing to page
+					add(new Label("pageLogs", "").setVisible(false));
+				}
+			} else {
+				// more
+				add(new Label("pageLogs", "").setVisible(false));
+				if (commits.size() == maxCount) {
+					// show more
+					add(new LinkPanel("moreLogs", "link", new StringResourceModel("gb.moreLogs", this, null), LogPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+				} else {
+					// no more
+					add(new Label("moreLogs", "").setVisible(false));
+				}
+			}
+		}
+	}
+}
diff --git a/src/com/gitblit/wicket/panels/PageLinksPanel.html b/src/com/gitblit/wicket/panels/PageLinksPanel.html
index db82728..f2e4d31 100644
--- a/src/com/gitblit/wicket/panels/PageLinksPanel.html
+++ b/src/com/gitblit/wicket/panels/PageLinksPanel.html
@@ -7,7 +7,7 @@
 <wicket:panel>
 	<!-- page nav links -->	
 	<div class="page_nav">
-		<a wicket:id="summary"><wicket:message key="gb.summary"></wicket:message></a> | <a wicket:id="shortlog"><wicket:message key="gb.shortlog"></wicket:message></a> | <a wicket:id="branches"><wicket:message key="gb.branches"></wicket:message></a> | <a wicket:id="tags"><wicket:message key="gb.tags"></wicket:message></a> | <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a> <span wicket:id="extra"><span wicket:id="extraSeparator"></span><span wicket:id="extraLink"></span></span>
+		<a wicket:id="summary"><wicket:message key="gb.summary"></wicket:message></a> | <a wicket:id="log"><wicket:message key="gb.log"></wicket:message></a> | <a wicket:id="branches"><wicket:message key="gb.branches"></wicket:message></a> | <a wicket:id="tags"><wicket:message key="gb.tags"></wicket:message></a> | <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a> <span wicket:id="extra"><span wicket:id="extraSeparator"></span><span wicket:id="extraLink"></span></span>
 	</div>	
 </wicket:panel>
 </html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/PageLinksPanel.java b/src/com/gitblit/wicket/panels/PageLinksPanel.java
index d9c2527..9c6298c 100644
--- a/src/com/gitblit/wicket/panels/PageLinksPanel.java
+++ b/src/com/gitblit/wicket/panels/PageLinksPanel.java
@@ -6,9 +6,9 @@
 import java.util.Map;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.markup.repeater.Item;
 import org.apache.wicket.markup.repeater.data.DataView;
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
@@ -16,14 +16,15 @@
 
 import com.gitblit.utils.JGitUtils;
 import com.gitblit.wicket.LinkPanel;
+import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.pages.BranchesPage;
-import com.gitblit.wicket.pages.ShortLogPage;
+import com.gitblit.wicket.pages.LogPage;
 import com.gitblit.wicket.pages.SummaryPage;
 import com.gitblit.wicket.pages.TagsPage;
 import com.gitblit.wicket.pages.TicGitPage;
 import com.gitblit.wicket.pages.TreePage;
 
-public class PageLinksPanel extends BasePanel {
+public class PageLinksPanel extends Panel {
 
 	private static final long serialVersionUID = 1L;
 
@@ -33,7 +34,7 @@
 
 		{
 			put("summary", "gb.summary");
-			put("shortlog", "gb.shortlog");
+			put("log", "gb.log");
 			put("branches", "gb.branches");
 			put("tags", "gb.tags");
 			put("tree", "gb.tree");
@@ -45,11 +46,11 @@
 		super(id);
 
 		// summary
-		add(new BookmarkablePageLink<Void>("summary", SummaryPage.class, new PageParameters("p=" + repositoryName)));
-		add(new BookmarkablePageLink<Void>("shortlog", ShortLogPage.class, new PageParameters("p=" + repositoryName)));
-		add(new BookmarkablePageLink<Void>("branches", BranchesPage.class, new PageParameters("p=" + repositoryName)));
-		add(new BookmarkablePageLink<Void>("tags", TagsPage.class, new PageParameters("p=" + repositoryName)));
-		add(new BookmarkablePageLink<Void>("tree", TreePage.class, new PageParameters("p=" + repositoryName + ",h=HEAD")));
+		add(new BookmarkablePageLink<Void>("summary", SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+		add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+		add(new BookmarkablePageLink<Void>("branches", BranchesPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+		add(new BookmarkablePageLink<Void>("tags", TagsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+		add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newRepositoryParameter(repositoryName)));
 
 		// Add dynamic repository extras
 		List<String> extras = new ArrayList<String>();
@@ -65,7 +66,7 @@
 				String extra = item.getModelObject();
 				if (extra.equals("ticgit")) {
 					item.add(new Label("extraSeparator", " | "));
-					item.add(new LinkPanel("extraLink", null, "ticgit", TicGitPage.class, new PageParameters("p=" + repositoryName)));
+					item.add(new LinkPanel("extraLink", null, "ticgit", TicGitPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
 				}
 			}
 		};
@@ -77,8 +78,10 @@
 			String key = knownPages.get(wicketId);
 			String linkName = getString(key);
 			if (linkName.equals(pageName)) {
-				Component c = get(wicketId);
-				c.setEnabled(false);
+				Component c = get(wicketId);				
+				if (c != null) {
+					c.setEnabled(false);
+				}
 				break;
 			}
 		}
diff --git a/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java b/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java
index a8a5c28..d27133c 100644
--- a/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java
+++ b/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java
@@ -4,7 +4,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.markup.repeater.Item;
@@ -12,6 +11,7 @@
 import org.apache.wicket.markup.repeater.data.ListDataProvider;
 
 import com.gitblit.wicket.LinkPanel;
+import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.pages.TreePage;
 
 public class PathBreadcrumbsPanel extends Panel {
@@ -49,7 +49,7 @@
 					parameters += ",f=" + path;
 				}
 
-				item.add(new LinkPanel("pathLink", null, entry.name, TreePage.class, new PageParameters(parameters)));
+				item.add(new LinkPanel("pathLink", null, entry.name, TreePage.class, WicketUtils.newPathParameter(repositoryName, commitId, path)));
 				item.add(new Label("pathSeparator", entry.isLeaf ? "" : "/"));
 			}
 		};
diff --git a/src/com/gitblit/wicket/panels/PathLinksPanel.html b/src/com/gitblit/wicket/panels/PathLinksPanel.html
deleted file mode 100644
index 8079ecc..0000000
--- a/src/com/gitblit/wicket/panels/PathLinksPanel.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"  
-      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
-      xml:lang="en"  
-      lang="en"> 
-
-<wicket:panel>
-	<div class="link">
-		<a wicket:id="diff"><wicket:message key="gb.diff"></wicket:message></a> | <a wicket:id="view"><wicket:message key="gb.view"></wicket:message></a> | <a wicket:id="history"><wicket:message key="gb.history"></wicket:message></a>
-	</div>	
-</wicket:panel>
-</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/PathLinksPanel.java b/src/com/gitblit/wicket/panels/PathLinksPanel.java
deleted file mode 100644
index e1c489f..0000000
--- a/src/com/gitblit/wicket/panels/PathLinksPanel.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.gitblit.wicket.panels;
-
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-
-import com.gitblit.wicket.models.PathModel;
-import com.gitblit.wicket.pages.BlobPage;
-import com.gitblit.wicket.pages.DiffPage;
-
-
-public class PathLinksPanel extends BasePanel {
-
-	private static final long serialVersionUID = 1L;
-
-	public PathLinksPanel(String id, String repositoryName, PathModel path) {
-		super(id);
-		add(new BookmarkablePageLink<Void>("diff", DiffPage.class, new PageParameters("p=" + repositoryName + ",h=" + path.commitId + ",f=" + path.path)));
-		add(new BookmarkablePageLink<Void>("view", BlobPage.class, new PageParameters("p=" + repositoryName + ",h=" + path.commitId + ",f=" + path.path)));
-		add(new BookmarkablePageLink<Void>("history", BlobPage.class, new PageParameters()).setEnabled(false));
-	}
-}
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/ShortLogLinksPanel.html b/src/com/gitblit/wicket/panels/ShortLogLinksPanel.html
deleted file mode 100644
index 2208ceb..0000000
--- a/src/com/gitblit/wicket/panels/ShortLogLinksPanel.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"  
-      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
-      xml:lang="en"  
-      lang="en"> 
-
-<wicket:panel>
-	<div class="link">
-		<a wicket:id="commit"><wicket:message key="gb.commit"></wicket:message></a> | <a wicket:id="commitdiff"><wicket:message key="gb.commitdiff"></wicket:message></a> | <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a>
-	</div>	
-</wicket:panel>
-</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/ShortLogLinksPanel.java b/src/com/gitblit/wicket/panels/ShortLogLinksPanel.java
deleted file mode 100644
index bf2c772..0000000
--- a/src/com/gitblit/wicket/panels/ShortLogLinksPanel.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.gitblit.wicket.panels;
-
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-
-import com.gitblit.wicket.pages.CommitPage;
-import com.gitblit.wicket.pages.DiffPage;
-import com.gitblit.wicket.pages.TreePage;
-
-
-public class ShortLogLinksPanel extends BasePanel {
-
-	private static final long serialVersionUID = 1L;
-
-	public ShortLogLinksPanel(String id, String repositoryName, String commitId) {
-		super(id);
-
-		add(new BookmarkablePageLink<Void>("commit", CommitPage.class, new PageParameters("p=" + repositoryName + ",h=" + commitId)));
-		add(new BookmarkablePageLink<Void>("commitdiff", DiffPage.class, new PageParameters("p=" + repositoryName + ",h=" + commitId)));
-		add(new BookmarkablePageLink<Void>("tree", TreePage.class, new PageParameters("p=" + repositoryName + ",h=" + commitId)));
-	}
-}
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/TagLinksPanel.html b/src/com/gitblit/wicket/panels/TagLinksPanel.html
deleted file mode 100644
index 34a39c9..0000000
--- a/src/com/gitblit/wicket/panels/TagLinksPanel.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"  
-      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
-      xml:lang="en"  
-      lang="en"> 
-
-<wicket:panel>
-	<div class="link">
-		<a wicket:id="commit"><wicket:message key="gb.commit"></wicket:message></a> | <a wicket:id="shortlog"><wicket:message key="gb.shortlog"></wicket:message></a>
-	</div>	
-</wicket:panel>
-</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/TagLinksPanel.java b/src/com/gitblit/wicket/panels/TagLinksPanel.java
deleted file mode 100644
index e7f7c8d..0000000
--- a/src/com/gitblit/wicket/panels/TagLinksPanel.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.gitblit.wicket.panels;
-
-import org.apache.wicket.PageParameters;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-
-import com.gitblit.wicket.models.RefModel;
-import com.gitblit.wicket.pages.CommitPage;
-import com.gitblit.wicket.pages.ShortLogPage;
-
-
-public class TagLinksPanel extends BasePanel {
-
-	private static final long serialVersionUID = 1L;
-
-	public TagLinksPanel(String id, String repositoryName, RefModel tag) {
-		super(id);
-		add(new BookmarkablePageLink<Void>("commit", CommitPage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getCommitId().getName())));
-		add(new BookmarkablePageLink<Void>("shortlog", ShortLogPage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getName())));
-	}
-}
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/TagsPanel.html b/src/com/gitblit/wicket/panels/TagsPanel.html
new file mode 100644
index 0000000..599412d
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/TagsPanel.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  
+      xml:lang="en"  
+      lang="en"> 
+
+<body>
+<wicket:panel>
+
+	<!-- tags -->
+	<div class="header" wicket:id="header">[tags header]</div>	
+	<table style="width:100%" class="pretty">
+		<tbody>
+    		<tr wicket:id="tag">
+    			<td class="date"><span wicket:id="tagDate">[tag date]</span></td>
+    			<td><b><span wicket:id="tagName">[tag name]</span></b></td>
+    			<td><span wicket:id="tagDescription">[tag description]</span></td>
+    			<td class="rightAlign">
+    				<div class="link">
+						<a wicket:id="view"><wicket:message key="gb.view"></wicket:message></a> | <a wicket:id="commit"><wicket:message key="gb.commit"></wicket:message></a> | <a wicket:id="log"><wicket:message key="gb.log"></wicket:message></a>
+					</div>
+				</td>
+    		</tr>
+    	</tbody>
+	</table>
+	
+	<div wicket:id="allTags">[all tags]</div>	
+		
+	<!-- spacer -->
+	<div style="padding:5px;"></div>
+</wicket:panel>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/TagsPanel.java b/src/com/gitblit/wicket/panels/TagsPanel.java
new file mode 100644
index 0000000..92307b4
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/TagsPanel.java
@@ -0,0 +1,81 @@
+package com.gitblit.wicket.panels;
+
+import java.util.List;
+
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.markup.repeater.data.ListDataProvider;
+import org.apache.wicket.model.StringResourceModel;
+import org.eclipse.jgit.lib.Repository;
+
+import com.gitblit.utils.JGitUtils;
+import com.gitblit.wicket.GitBlitWebSession;
+import com.gitblit.wicket.LinkPanel;
+import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.models.RefModel;
+import com.gitblit.wicket.pages.CommitPage;
+import com.gitblit.wicket.pages.LogPage;
+import com.gitblit.wicket.pages.SummaryPage;
+import com.gitblit.wicket.pages.TagPage;
+import com.gitblit.wicket.pages.TagsPage;
+
+public class TagsPanel extends Panel {
+
+	private static final long serialVersionUID = 1L;
+
+	public TagsPanel(String wicketId, final String repositoryName, Repository r, final int maxCount) {
+		super(wicketId);
+
+		// header
+		List<RefModel> tags = JGitUtils.getTags(r, maxCount);
+		if (maxCount > 0) {
+			// summary page
+			// show tags page link
+			add(new LinkPanel("header", "title", new StringResourceModel("gb.tags", this, null), TagsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+		} else {
+			// tags page
+			// show repository summary page link
+			add(new LinkPanel("header", "title", repositoryName, SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+		}
+
+		ListDataProvider<RefModel> tagsDp = new ListDataProvider<RefModel>(tags);
+		DataView<RefModel> tagView = new DataView<RefModel>("tag", tagsDp) {
+			private static final long serialVersionUID = 1L;
+			int counter = 0;
+
+			public void populateItem(final Item<RefModel> item) {
+				RefModel entry = item.getModelObject();
+
+				item.add(WicketUtils.createDateLabel("tagDate", entry.getDate(), GitBlitWebSession.get().getTimezone()));
+
+				item.add(new LinkPanel("tagName", "list name", entry.getDisplayName(), CommitPage.class, WicketUtils.newCommitParameter(repositoryName, entry.getCommitId().getName())));
+				String message;
+				if (maxCount > 0) {
+					message = WicketUtils.trimString(entry.getShortLog(), 40);
+				} else {
+					message = entry.getShortLog();
+				}
+				if (entry.isAnnotatedTag()) {
+					item.add(new LinkPanel("tagDescription", "list subject", message, TagPage.class, WicketUtils.newCommitParameter(repositoryName, entry.getObjectId().getName())));
+				} else {
+					item.add(new LinkPanel("tagDescription", "list subject", message, CommitPage.class, WicketUtils.newCommitParameter(repositoryName, entry.getObjectId().getName())));
+				}
+				item.add(new BookmarkablePageLink<Void>("view", TagPage.class, WicketUtils.newCommitParameter(repositoryName, entry.getObjectId().getName())).setEnabled(entry.isAnnotatedTag()));
+				item.add(new BookmarkablePageLink<Void>("commit", CommitPage.class, WicketUtils.newCommitParameter(repositoryName, entry.getCommitId().getName())));
+				item.add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils.newCommitParameter(repositoryName, entry.getName())));
+
+				WicketUtils.setAlternatingBackground(item, counter);
+				counter++;
+			}
+		};
+		add(tagView);
+		if (tags.size() < maxCount || maxCount <= 0) {
+			add(new Label("allTags", "").setVisible(false));
+		} else {
+			add(new LinkPanel("allTags", "link", new StringResourceModel("gb.allTags", this, null), TagsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
+		}
+	}
+}
diff --git a/src/com/gitblit/wicket/panels/TreeBlobLinksPanel.java b/src/com/gitblit/wicket/panels/TreeBlobLinksPanel.java
index c8277ae..e1e6f79 100644
--- a/src/com/gitblit/wicket/panels/TreeBlobLinksPanel.java
+++ b/src/com/gitblit/wicket/panels/TreeBlobLinksPanel.java
@@ -1,20 +1,21 @@
 package com.gitblit.wicket.panels;
 
-import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.panel.Panel;
 
+import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.models.PathModel;
 import com.gitblit.wicket.pages.BlobPage;
 
 
-public class TreeBlobLinksPanel extends BasePanel {
+public class TreeBlobLinksPanel extends Panel {
 
 	private static final long serialVersionUID = 1L;
 
 	public TreeBlobLinksPanel(String id, String repositoryName, PathModel path) {
 		super(id);
-		add(new BookmarkablePageLink<Void>("view", BlobPage.class, new PageParameters("p=" + repositoryName + ",h=" + path.commitId + ",f=" + path.path)));
-		add(new BookmarkablePageLink<Void>("raw", BlobPage.class, new PageParameters()).setEnabled(false));
-		add(new BookmarkablePageLink<Void>("history", BlobPage.class, new PageParameters()).setEnabled(false));
+		add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils.newPathParameter(repositoryName, path.commitId, path.path)));
+		add(new BookmarkablePageLink<Void>("raw", BlobPage.class).setEnabled(false));
+		add(new BookmarkablePageLink<Void>("history", BlobPage.class).setEnabled(false));
 	}
 }
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/TreeLinksPanel.java b/src/com/gitblit/wicket/panels/TreeLinksPanel.java
index 9a42943..4965004 100644
--- a/src/com/gitblit/wicket/panels/TreeLinksPanel.java
+++ b/src/com/gitblit/wicket/panels/TreeLinksPanel.java
@@ -1,19 +1,20 @@
 package com.gitblit.wicket.panels;
 
-import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.panel.Panel;
 
+import com.gitblit.wicket.WicketUtils;
 import com.gitblit.wicket.models.PathModel;
 import com.gitblit.wicket.pages.TreePage;
 
 
-public class TreeLinksPanel extends BasePanel {
+public class TreeLinksPanel extends Panel {
 
 	private static final long serialVersionUID = 1L;
 
 	public TreeLinksPanel(String id, String repositoryName, PathModel path) {
 		super(id);
-		add(new BookmarkablePageLink<Void>("tree", TreePage.class, new PageParameters("p=" + repositoryName + ",h=" + path.commitId + ",f=" + path.path)));
-		add(new BookmarkablePageLink<Void>("history", TreePage.class, new PageParameters()).setEnabled(false));
+		add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newPathParameter(repositoryName, path.commitId, path.path)));
+		add(new BookmarkablePageLink<Void>("history", TreePage.class).setEnabled(false));
 	}
 }
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/resources/gitblit.css b/src/com/gitblit/wicket/resources/gitblit.css
index 6e1717c..42ab2c0 100644
--- a/src/com/gitblit/wicket/resources/gitblit.css
+++ b/src/com/gitblit/wicket/resources/gitblit.css
@@ -103,6 +103,12 @@
 	font-size: inherit;
 }
 
+div.link em, div.link span em {
+	font-style: normal;
+	font-family: inherit;
+	font-size: inherit;
+}
+
 div.page_header {
 	height: 25px;
 	padding: 5px;
@@ -157,6 +163,10 @@
 	text-decoration: underline;
 }
 
+div.page_nav em {
+	font-style: normal;
+}
+
 div.page_nav2 {
 	padding: 2px 5px 7px 5px;	
 }

--
Gitblit v1.9.1