Commit header panel. File type icons. Docs page.
diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index eddd3df..e5dbfd2 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -8,6 +8,7 @@
 import java.text.ParseException;

 import java.text.SimpleDateFormat;

 import java.util.ArrayList;

+import java.util.Collection;

 import java.util.Collections;

 import java.util.Date;

 import java.util.HashMap;

@@ -43,8 +44,10 @@
 import org.eclipse.jgit.revwalk.filter.RevFilter;

 import org.eclipse.jgit.treewalk.TreeWalk;

 import org.eclipse.jgit.treewalk.filter.AndTreeFilter;

+import org.eclipse.jgit.treewalk.filter.OrTreeFilter;

 import org.eclipse.jgit.treewalk.filter.PathFilter;

 import org.eclipse.jgit.treewalk.filter.PathFilterGroup;

+import org.eclipse.jgit.treewalk.filter.PathSuffixFilter;

 import org.eclipse.jgit.treewalk.filter.TreeFilter;

 import org.eclipse.jgit.util.io.DisabledOutputStream;

 import org.slf4j.Logger;

@@ -352,6 +355,42 @@
 		}

 		return list;

 	}

+	

+	public static List<PathModel> getDocuments(Repository r, List<String> extensions) {

+		List<PathModel> list = new ArrayList<PathModel>();

+		RevCommit commit = getCommit(r, Constants.HEAD);		

+		final TreeWalk walk = new TreeWalk(r);

+		try {

+			walk.addTree(commit.getTree());

+			if (extensions != null && extensions.size() > 0) {

+				Collection<TreeFilter> suffixFilters = new ArrayList<TreeFilter>();

+				for (String extension:extensions) {

+					if (extension.charAt(0) == '.') {

+						suffixFilters.add(PathSuffixFilter.create(extension));

+					} else {

+						// escape the . since this is a regexp filter

+						suffixFilters.add(PathSuffixFilter.create("\\." + extension));

+					}

+				}

+				TreeFilter filter = OrTreeFilter.create(suffixFilters);

+				walk.setFilter(filter);

+				walk.setRecursive(true);

+				while (walk.next()) {

+					list.add(getPathModel(walk, null, commit));

+				}

+			} else {

+				while (walk.next()) {

+					list.add(getPathModel(walk, null, commit));

+				}

+			}

+		} catch (IOException e) {

+			LOGGER.error("Failed to get files for commit " + commit.getName(), e);

+		} finally {

+			walk.release();

+		}

+		Collections.sort(list);

+		return list;

+	}

 

 	public static Map<ChangeType, AtomicInteger> getChangedPathsStats(List<PathChangeModel> paths) {

 		Map<ChangeType, AtomicInteger> stats = new HashMap<ChangeType, AtomicInteger>();

@@ -895,10 +934,6 @@
 		return metrics;

 	}

 	

-	public static RefModel getDocumentsBranch(Repository r) {

-		return getTicketsBranch(r);

-	}

-

 	public static RefModel getTicketsBranch(Repository r) {

 		RefModel ticgitBranch = null;

 		try {

diff --git a/src/com/gitblit/wicket/BasePage.html b/src/com/gitblit/wicket/BasePage.html
index c3c56ef..b88192b 100644
--- a/src/com/gitblit/wicket/BasePage.html
+++ b/src/com/gitblit/wicket/BasePage.html
@@ -21,7 +21,8 @@
 					<img src="resources/gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>

 				</wicket:link>

 			</a>

-			<a href="/"><span wicket:id="siteName">[site name]</span></a> / <span wicket:id="repositoryName">[repository name]</span> <span wicket:id="pageName">[page name]</span> 

+			<a href="/"><span wicket:id="siteName">[site name]</span></a> / <span wicket:id="repositoryName">[repository name]</span> <span wicket:id="pageName">[page name]</span>

+			<div style="float:none;" wicket:id="feedback">[Feedback Panel]</div> 

 		</div>

 

 		<!-- page content -->

diff --git a/src/com/gitblit/wicket/BasePage.java b/src/com/gitblit/wicket/BasePage.java
index 33feacb..8daab44 100644
--- a/src/com/gitblit/wicket/BasePage.java
+++ b/src/com/gitblit/wicket/BasePage.java
@@ -7,6 +7,7 @@
 import org.apache.wicket.PageParameters;

 import org.apache.wicket.markup.html.WebPage;

 import org.apache.wicket.markup.html.basic.Label;

+import org.apache.wicket.markup.html.panel.FeedbackPanel;

 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;

 import org.slf4j.Logger;

 import org.slf4j.LoggerFactory;

@@ -45,6 +46,9 @@
 		add(new LinkPanel("repositoryName", null, repositoryName, SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryName)));

 		add(new Label("pageName", pageName));

 

+		// Feedback panel for info, warning, and non-fatal error messages

+		add(new FeedbackPanel("feedback"));

+

 		// footer

 		if (GitBlit.self().settings().getBoolean(Keys.web.authenticateViewPages, true)

 				|| GitBlit.self().settings().getBoolean(Keys.web.authenticateAdminPages, true)) {

diff --git a/src/com/gitblit/wicket/GitBlitWebApp.java b/src/com/gitblit/wicket/GitBlitWebApp.java
index e3c41cd..7410dfa 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.java
+++ b/src/com/gitblit/wicket/GitBlitWebApp.java
@@ -15,6 +15,7 @@
 import com.gitblit.wicket.pages.BranchesPage;

 import com.gitblit.wicket.pages.CommitDiffPage;

 import com.gitblit.wicket.pages.CommitPage;

+import com.gitblit.wicket.pages.DocsPage;

 import com.gitblit.wicket.pages.HistoryPage;

 import com.gitblit.wicket.pages.LogPage;

 import com.gitblit.wicket.pages.MarkdownPage;

@@ -69,6 +70,7 @@
 		mount(new MixedParamUrlCodingStrategy("/ticket", TicketPage.class, new String[] { "r", "h", "f" }));

 

 		// setup the markdown urls

+		mount(new MixedParamUrlCodingStrategy("/docs", DocsPage.class, new String[] { "r" }));

 		mount(new MixedParamUrlCodingStrategy("/markdown", MarkdownPage.class, new String[] { "r", "h", "f" }));

 		

 		// setup login/logout urls, if we are using authentication

diff --git a/src/com/gitblit/wicket/GitBlitWebApp.properties b/src/com/gitblit/wicket/GitBlitWebApp.properties
index 18b1e78..367ae3d 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/com/gitblit/wicket/GitBlitWebApp.properties
@@ -70,4 +70,9 @@
 gb.rename = rename

 gb.delete = delete

 gb.docs = docs

-gb.restrictedAccess = restricted access
\ No newline at end of file
+gb.restrictedAccess = restricted access

+gb.name = name

+gb.group = group

+gb.description = description

+gb.enableTickets = enable tickets

+gb.enableDocs = enable docs
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/WicketUtils.java b/src/com/gitblit/wicket/WicketUtils.java
index fb8e296..bf2bcb9 100644
--- a/src/com/gitblit/wicket/WicketUtils.java
+++ b/src/com/gitblit/wicket/WicketUtils.java
@@ -3,6 +3,7 @@
 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;

@@ -83,10 +84,55 @@
 		return label;

 	}

 

+	public static ContextImage getFileImage(String wicketId, String filename) {

+		filename = filename.toLowerCase();

+		if (filename.endsWith(".java")) {

+			return newImage(wicketId, "file_java_16x16.png");

+		} else if (filename.endsWith(".rb")) {

+			return newImage(wicketId, "file_ruby_16x16.png");

+		} else if (filename.endsWith(".php")) {

+			return newImage(wicketId, "file_php_16x16.png");

+		} else if (filename.endsWith(".cs")) {

+			return newImage(wicketId, "file_cs_16x16.png");

+		} else if (filename.endsWith(".cpp")) {

+			return newImage(wicketId, "file_cpp_16x16.png");

+		} else if (filename.endsWith(".c")) {

+			return newImage(wicketId, "file_c_16x16.png");

+		} else if (filename.endsWith(".h")) {

+			return newImage(wicketId, "file_h_16x16.png");

+		} else if (filename.endsWith(".sln")) {

+			return newImage(wicketId, "file_vs_16x16.png");

+		} else if (filename.endsWith(".csv") || filename.endsWith(".xls") || filename.endsWith(".xlsx")) {

+			return newImage(wicketId, "file_excel_16x16.png");

+		} else if (filename.endsWith(".doc") || filename.endsWith(".docx")) {

+			return newImage(wicketId, "file_word_16x16.png");

+		} else if (filename.endsWith(".ppt")) {

+			return newImage(wicketId, "file_ppt_16x16.png");

+		} else if (filename.endsWith(".zip")) {

+			return newImage(wicketId, "file_zip_16x16.png");

+		} else if (filename.endsWith(".pdf")) {

+			return newImage(wicketId, "file_acrobat_16x16.png");

+		} else if (filename.endsWith(".htm") || filename.endsWith(".html")) {

+			return newImage(wicketId, "file_world_16x16.png");

+		} else if (filename.endsWith(".xml")) {

+			return newImage(wicketId, "file_code_16x16.png");

+		} else if (filename.endsWith(".properties")) {

+			return newImage(wicketId, "file_settings_16x16.png");

+		}

+

+		List<String> mdExtensions = GitBlit.self().settings().getStrings(Keys.web.markdownExtensions);

+		for (String ext : mdExtensions) {

+			if (filename.endsWith('.' + ext.toLowerCase())) {

+				return newImage(wicketId, "file_world_16x16.png");

+			}

+		}

+		return newImage(wicketId, "file_16x16.png");

+	}

+

 	public static ContextImage newClearPixel(String wicketId) {

 		return newImage(wicketId, "pixel.png");

 	}

-	

+

 	public static ContextImage newBlankImage(String wicketId) {

 		return newImage(wicketId, "blank.png");

 	}

@@ -102,7 +148,7 @@
 		}

 		return img;

 	}

-	

+

 	public static ContextRelativeResource getResource(String file) {

 		return new ContextRelativeResource("/com/gitblit/wicket/resources/" + file);

 	}

diff --git a/src/com/gitblit/wicket/pages/BlobDiffPage.html b/src/com/gitblit/wicket/pages/BlobDiffPage.html
index a20b24c..1227169 100644
--- a/src/com/gitblit/wicket/pages/BlobDiffPage.html
+++ b/src/com/gitblit/wicket/pages/BlobDiffPage.html
@@ -15,8 +15,8 @@
 		<span wicket:id="blameLink">[blame link]</span> | <a wicket:id="historyLink"><wicket:message key="gb.history"></wicket:message></a> | <a wicket:id="patchLink"><wicket:message key="gb.patch"></wicket:message></a> | <a wicket:id="commitLink"><wicket:message key="gb.commit"></wicket:message></a> | <a wicket:id="commitDiffLink"><wicket:message key="gb.commitdiff"></wicket:message></a>

 	</div>	

 	

-	<!-- shortlog header -->

-	<div class="header" wicket:id="shortlog">[shortlog header]</div>

+	<!-- commit header -->

+	<div wicket:id="commitHeader">[commit header]</div>

 

 	<!-- breadcrumbs -->

 	<div wicket:id="breadcrumbs">[breadcrumbs]</div>

diff --git a/src/com/gitblit/wicket/pages/BlobDiffPage.java b/src/com/gitblit/wicket/pages/BlobDiffPage.java
index 4bb281c..983b3c4 100644
--- a/src/com/gitblit/wicket/pages/BlobDiffPage.java
+++ b/src/com/gitblit/wicket/pages/BlobDiffPage.java
@@ -11,9 +11,9 @@
 import com.gitblit.utils.JGitUtils;

 import com.gitblit.utils.JGitUtils.DiffOutputType;

 import com.gitblit.utils.StringUtils;

-import com.gitblit.wicket.LinkPanel;

 import com.gitblit.wicket.RepositoryPage;

 import com.gitblit.wicket.WicketUtils;

+import com.gitblit.wicket.panels.CommitHeaderPanel;

 import com.gitblit.wicket.panels.PathBreadcrumbsPanel;

 

 public class BlobDiffPage extends RepositoryPage {

@@ -48,7 +48,7 @@
 		add(new Label("blameLink", getString("gb.blame")));

 		add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));

 

-		add(new LinkPanel("shortlog", "title", commit.getShortMessage(), CommitPage.class, newCommitParameter()));

+		add(new CommitHeaderPanel("commitHeader", repositoryName, commit));

 

 		add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, blobPath, objectId));

 

diff --git a/src/com/gitblit/wicket/pages/BlobPage.html b/src/com/gitblit/wicket/pages/BlobPage.html
index 2ca76e3..80ff059 100644
--- a/src/com/gitblit/wicket/pages/BlobPage.html
+++ b/src/com/gitblit/wicket/pages/BlobPage.html
@@ -24,8 +24,8 @@
 			<span wicket:id="blameLink">[blame link]</span> | <a wicket:id="historyLink"><wicket:message key="gb.history"></wicket:message></a> | <a wicket:id="rawLink"><wicket:message key="gb.raw"></wicket:message></a> | <a wicket:id="headLink"><wicket:message key="gb.head"></wicket:message></a>

 		</div>	

 	

-		<!-- shortlog header -->

-		<div class="header" wicket:id="shortlog">[shortlog header]</div>

+		<!-- commit header -->

+		<div wicket:id="commitHeader">[commit header]</div>

 

 		<!-- breadcrumbs -->

 		<div wicket:id="breadcrumbs">[breadcrumbs]</div>

diff --git a/src/com/gitblit/wicket/pages/BlobPage.java b/src/com/gitblit/wicket/pages/BlobPage.java
index 335d25a..ca2afe9 100644
--- a/src/com/gitblit/wicket/pages/BlobPage.java
+++ b/src/com/gitblit/wicket/pages/BlobPage.java
@@ -14,9 +14,9 @@
 import com.gitblit.GitBlit;

 import com.gitblit.Keys;

 import com.gitblit.utils.JGitUtils;

-import com.gitblit.wicket.LinkPanel;

 import com.gitblit.wicket.RepositoryPage;

 import com.gitblit.wicket.WicketUtils;

+import com.gitblit.wicket.panels.CommitHeaderPanel;

 import com.gitblit.wicket.panels.PathBreadcrumbsPanel;

 

 public class BlobPage extends RepositoryPage {

@@ -49,7 +49,7 @@
 		add(new BookmarkablePageLink<Void>("rawLink", RawPage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));

 		add(new BookmarkablePageLink<Void>("headLink", BlobPage.class, WicketUtils.newPathParameter(repositoryName, Constants.HEAD, blobPath)));

 

-		add(new LinkPanel("shortlog", "title", commit.getShortMessage(), CommitPage.class, newCommitParameter()));

+		add(new CommitHeaderPanel("commitHeader", repositoryName, commit));

 

 		add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, blobPath, objectId));

 

diff --git a/src/com/gitblit/wicket/pages/CommitDiffPage.html b/src/com/gitblit/wicket/pages/CommitDiffPage.html
index cc7404a..4e3a268 100644
--- a/src/com/gitblit/wicket/pages/CommitDiffPage.html
+++ b/src/com/gitblit/wicket/pages/CommitDiffPage.html
@@ -14,14 +14,17 @@
 	<div class="page_nav2">

 		<wicket:message key="gb.parent"></wicket:message>: <span wicket:id="parentLink">[parent link]</span> | <a wicket:id="patchLink"><wicket:message key="gb.patch"></wicket:message></a> | <a wicket:id="commitLink"><wicket:message key="gb.commit"></wicket:message></a>

 	</div>	

-

-	<!-- commit legend -->

-	<div style="text-align:right;" wicket:id="commitLegend"></div>

 	

-	<!-- shortlog header -->

-	<div class="header" wicket:id="shortlog">[shortlog header]</div>

+	<!-- commit header -->

+	<div wicket:id="commitHeader">[commit header]</div>

 

 	<!-- changed paths -->

+	<div style="padding-top:15px;">

+		<!-- commit legend -->

+		<div style="text-align:right;" wicket:id="commitLegend"></div>

+	

+		<div class="header"><wicket:message key="gb.changedFiles">[changed files]</wicket:message></div>

+	</div>

 	<table class="pretty">

 		<tr wicket:id="changedPath">

 			<td class="changeType"><span wicket:id="changeType">[change type]</span></td>		

diff --git a/src/com/gitblit/wicket/pages/CommitDiffPage.java b/src/com/gitblit/wicket/pages/CommitDiffPage.java
index 0d4867a..eb30e08 100644
--- a/src/com/gitblit/wicket/pages/CommitDiffPage.java
+++ b/src/com/gitblit/wicket/pages/CommitDiffPage.java
@@ -20,6 +20,7 @@
 import com.gitblit.wicket.RepositoryPage;

 import com.gitblit.wicket.WicketUtils;

 import com.gitblit.wicket.models.PathModel.PathChangeModel;

+import com.gitblit.wicket.panels.CommitHeaderPanel;

 import com.gitblit.wicket.panels.CommitLegendPanel;

 

 public class CommitDiffPage extends RepositoryPage {

@@ -48,7 +49,7 @@
 		add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));

 		add(new BookmarkablePageLink<Void>("commitLink", CommitPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));

 

-		add(new LinkPanel("shortlog", "title", commit.getShortMessage(), CommitPage.class, newCommitParameter()));

+		add(new CommitHeaderPanel("commitHeader", repositoryName, commit));

 

 		// changed paths list

 		List<PathChangeModel> paths = JGitUtils.getFilesInCommit(r, commit);

diff --git a/src/com/gitblit/wicket/pages/CommitPage.html b/src/com/gitblit/wicket/pages/CommitPage.html
index 2e1f47c..2601303 100644
--- a/src/com/gitblit/wicket/pages/CommitPage.html
+++ b/src/com/gitblit/wicket/pages/CommitPage.html
@@ -15,8 +15,8 @@
 		<wicket:message key="gb.parent"></wicket:message>: <span wicket:id="parentLink">[parent link]</span> | <a wicket:id="patchLink"><wicket:message key="gb.patch"></wicket:message></a> | <span wicket:id="commitdiffLink">[commitdiff link]</span>

 	</div>	

 	

-	<!-- shortlog header -->

-	<div class="header" wicket:id="shortlog">[shortlog header]</div>

+	<!-- commit header -->

+	<div wicket:id="commitHeader">[commit header]</div>

 	

 	<!-- commit info -->

 	<table class="plain">

diff --git a/src/com/gitblit/wicket/pages/CommitPage.java b/src/com/gitblit/wicket/pages/CommitPage.java
index cae500f..e724ca1 100644
--- a/src/com/gitblit/wicket/pages/CommitPage.java
+++ b/src/com/gitblit/wicket/pages/CommitPage.java
@@ -19,6 +19,7 @@
 import com.gitblit.wicket.RepositoryPage;

 import com.gitblit.wicket.WicketUtils;

 import com.gitblit.wicket.models.PathModel.PathChangeModel;

+import com.gitblit.wicket.panels.CommitHeaderPanel;

 import com.gitblit.wicket.panels.CommitLegendPanel;

 

 public class CommitPage extends RepositoryPage {

@@ -46,7 +47,7 @@
 		}

 		add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));

 

-		add(new LinkPanel("shortlog", "title", c.getShortMessage(), CommitDiffPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));

+		add(new CommitHeaderPanel("commitHeader", repositoryName, c));

 

 		addRefs(r, c);

 

diff --git a/src/com/gitblit/wicket/pages/DocsPage.html b/src/com/gitblit/wicket/pages/DocsPage.html
new file mode 100644
index 0000000..c098bcf
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/DocsPage.html
@@ -0,0 +1,31 @@
+<!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>

+	

+	<!-- header -->

+	<div style="margin-top:5px;" class="header"><span wicket:id="header">[header]</span></div>

+	

+	<!-- documents -->	

+	<table style="width:100%" class="pretty">

+		<tr wicket:id="document">

+			<td class="icon"><img wicket:id="docIcon" /></td>

+			<td><span wicket:id="docName"></span></td>			

+			<td class="size"><span wicket:id="docSize">[doc size]</span></td>

+			<td class="treeLinks">

+				<span class="link">

+					<a wicket:id="view"><wicket:message key="gb.view"></wicket:message></a> | <a wicket:id="raw"><wicket:message key="gb.raw"></wicket:message></a> | <a wicket:id="blame"><wicket:message key="gb.blame"></wicket:message></a> | <a wicket:id="history"><wicket:message key="gb.history"></wicket:message></a>

+				</span>	

+			</td>

+		</tr>

+	</table>	

+</wicket:extend>	

+</body>

+</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/pages/DocsPage.java b/src/com/gitblit/wicket/pages/DocsPage.java
new file mode 100644
index 0000000..302d29d
--- /dev/null
+++ b/src/com/gitblit/wicket/pages/DocsPage.java
@@ -0,0 +1,63 @@
+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.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;

+import org.eclipse.jgit.lib.Repository;

+

+import com.gitblit.GitBlit;

+import com.gitblit.Keys;

+import com.gitblit.utils.ByteFormat;

+import com.gitblit.utils.JGitUtils;

+import com.gitblit.wicket.LinkPanel;

+import com.gitblit.wicket.RepositoryPage;

+import com.gitblit.wicket.WicketUtils;

+import com.gitblit.wicket.models.PathModel;

+

+public class DocsPage extends RepositoryPage {

+

+	public DocsPage(PageParameters params) {

+		super(params);

+

+		Repository r = getRepository();

+		List<String> extensions = GitBlit.self().settings().getStrings(Keys.web.markdownExtensions);

+		List<PathModel> paths = JGitUtils.getDocuments(r, extensions);

+

+		final ByteFormat byteFormat = new ByteFormat();

+

+		add(new Label("header", getString("gb.docs")));

+		

+		// documents list

+		ListDataProvider<PathModel> pathsDp = new ListDataProvider<PathModel>(paths);

+		DataView<PathModel> pathsView = new DataView<PathModel>("document", pathsDp) {

+			private static final long serialVersionUID = 1L;

+			int counter = 0;

+

+			public void populateItem(final Item<PathModel> item) {

+				PathModel entry = item.getModelObject();

+				item.add(WicketUtils.newImage("docIcon", "file_world_16x16.png"));

+				item.add(new Label("docSize", byteFormat.format(entry.size)));

+				item.add(new LinkPanel("docName", "list", entry.name, BlobPage.class, newPathParameter(entry.path)));

+

+				// links

+				item.add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));

+				item.add(new BookmarkablePageLink<Void>("raw", RawPage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));

+				item.add(new BookmarkablePageLink<Void>("blame", BlobPage.class).setEnabled(false));

+				item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));				

+				WicketUtils.setAlternatingBackground(item, counter);

+				counter++;

+			}

+		};

+		add(pathsView);

+	}

+

+	@Override

+	protected String getPageName() {

+		return getString("gb.docs");

+	}

+}

diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.html b/src/com/gitblit/wicket/pages/EditRepositoryPage.html
index f202e91..4aebef3 100644
--- a/src/com/gitblit/wicket/pages/EditRepositoryPage.html
+++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.html
@@ -13,12 +13,12 @@
 	<form wicket:id="editForm">

 		<table class="plain">

 			<tbody>

-				<tr><th>Name</th><td class="edit"><input type="text" wicket:id="name" size="30" tabindex="1" /></td></tr>

-				<tr><th>Description</th><td class="edit"><input type="text" wicket:id="description" size="80" tabindex="2" /></td></tr>

-				<tr><th>Owner</th><td class="edit"><input type="text" wicket:id="owner" size="30" tabindex="3" /></td></tr>

-				<tr><th>Group</th><td class="edit"><input type="text" wicket:id="group" size="30" tabindex="4" /></td></tr>

-				<tr><th>Enable Tickets</th><td class="edit"><input type="checkbox" wicket:id="useTickets" tabindex="5" /> <i>distributed Ticgit ticketing</i></td></tr>

-				<tr><th>Enable Docs</th><td class="edit"><input type="checkbox" wicket:id="useDocs" tabindex="6" /> <i>distributed Markdown documentation</i></td></tr>

+				<tr><th><wicket:message key="gb.name"></wicket:message></th><td class="edit"><input type="text" wicket:id="name" size="30" tabindex="1" /></td></tr>

+				<tr><th><wicket:message key="gb.description"></wicket:message></th><td class="edit"><input type="text" wicket:id="description" size="80" tabindex="2" /></td></tr>

+				<tr><th><wicket:message key="gb.owner"></wicket:message></th><td class="edit"><input type="text" wicket:id="owner" size="30" tabindex="3" /></td></tr>

+				<tr><th><wicket:message key="gb.group"></wicket:message></th><td class="edit"><input type="text" wicket:id="group" size="30" tabindex="4" /></td></tr>

+				<tr><th><wicket:message key="gb.enableTickets"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useTickets" tabindex="5" /> &nbsp;<i>distributed Ticgit issues</i></td></tr>

+				<tr><th><wicket:message key="gb.enableDocs"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useDocs" tabindex="6" /> &nbsp;<i>enumerates repository Markdown documentation</i></td></tr>

 				<tr><td class="edit" colspan="2"><input type="submit" value="Submit" tabindex="7" /></td></tr>

 			</tbody>

 		</table>

diff --git a/src/com/gitblit/wicket/pages/HistoryPage.html b/src/com/gitblit/wicket/pages/HistoryPage.html
index a77933e..f132e59 100644
--- a/src/com/gitblit/wicket/pages/HistoryPage.html
+++ b/src/com/gitblit/wicket/pages/HistoryPage.html
@@ -11,7 +11,7 @@
 	<div wicket:id="pageLinks">[page links]</div>

 

 	<!-- pager links -->

-	<div style="padding-top:5px;padding-bottom:5px;">

+	<div style="padding-top:5px;">

 		<a wicket:id="firstPageTop"><wicket:message key="gb.pageFirst"></wicket:message></a> | <a wicket:id="prevPageTop"><wicket:message key="gb.pagePrevious"></wicket:message></a> | <a wicket:id="nextPageTop"><wicket:message key="gb.pageNext"></wicket:message></a> 

 	</div>

 	

diff --git a/src/com/gitblit/wicket/pages/LogPage.html b/src/com/gitblit/wicket/pages/LogPage.html
index 325e751..ad39b77 100644
--- a/src/com/gitblit/wicket/pages/LogPage.html
+++ b/src/com/gitblit/wicket/pages/LogPage.html
@@ -11,7 +11,7 @@
 	<div wicket:id="pageLinks">[page links]</div>

 

 	<!-- pager links -->

-	<div style="padding-top:5px;padding-bottom:5px;">

+	<div style="padding-top:5px;">

 		<a wicket:id="firstPageTop"><wicket:message key="gb.pageFirst"></wicket:message></a> | <a wicket:id="prevPageTop"><wicket:message key="gb.pagePrevious"></wicket:message></a> | <a wicket:id="nextPageTop"><wicket:message key="gb.pageNext"></wicket:message></a> 

 	</div>

 	

diff --git a/src/com/gitblit/wicket/pages/SearchPage.html b/src/com/gitblit/wicket/pages/SearchPage.html
index 7d2a537..246601a4 100644
--- a/src/com/gitblit/wicket/pages/SearchPage.html
+++ b/src/com/gitblit/wicket/pages/SearchPage.html
@@ -11,7 +11,7 @@
 	<div wicket:id="pageLinks">[page links]</div>

 

 	<!-- pager links -->

-	<div style="padding-top:5px;padding-bottom:5px;">

+	<div style="padding-top:5px;">

 		<a wicket:id="firstPageTop"><wicket:message key="gb.pageFirst"></wicket:message></a> | <a wicket:id="prevPageTop"><wicket:message key="gb.pagePrevious"></wicket:message></a> | <a wicket:id="nextPageTop"><wicket:message key="gb.pageNext"></wicket:message></a> 

 	</div>

 	

diff --git a/src/com/gitblit/wicket/pages/TreePage.html b/src/com/gitblit/wicket/pages/TreePage.html
index f180c9d..90ca62b 100644
--- a/src/com/gitblit/wicket/pages/TreePage.html
+++ b/src/com/gitblit/wicket/pages/TreePage.html
@@ -15,8 +15,8 @@
 		<a wicket:id="historyLink"><wicket:message key="gb.history"></wicket:message></a> | <a wicket:id="headLink"><wicket:message key="gb.head"></wicket:message></a>

 	</div>	

 	

-	<!-- shortlog header -->

-	<div class="header" wicket:id="shortlog">[shortlog header]</div>

+	<!-- commit header -->

+	<div wicket:id="commitHeader">[commit header]</div>

 

 	<!-- breadcrumbs -->

 	<div wicket:id="breadcrumbs">[breadcrumbs]</div>

@@ -28,7 +28,7 @@
 			<td><span wicket:id="pathName"></span></td>			

 			<td class="size"><span wicket:id="pathSize">[path size]</span></td>

 			<td class="mode"><span wicket:id="pathPermissions">[path permissions]</span></td>

-			<td class="rightAlign"><span wicket:id="pathLinks">[path links]</span></td>

+			<td class="treeLinks"><span wicket:id="pathLinks">[path links]</span></td>

 		</tr>

 	</table>

 

diff --git a/src/com/gitblit/wicket/pages/TreePage.java b/src/com/gitblit/wicket/pages/TreePage.java
index 9022d44..56f96d6 100644
--- a/src/com/gitblit/wicket/pages/TreePage.java
+++ b/src/com/gitblit/wicket/pages/TreePage.java
@@ -19,6 +19,7 @@
 import com.gitblit.wicket.RepositoryPage;

 import com.gitblit.wicket.WicketUtils;

 import com.gitblit.wicket.models.PathModel;

+import com.gitblit.wicket.panels.CommitHeaderPanel;

 import com.gitblit.wicket.panels.PathBreadcrumbsPanel;

 

 public class TreePage extends RepositoryPage {

@@ -36,7 +37,7 @@
 		add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, path)));

 		add(new BookmarkablePageLink<Void>("headLink", TreePage.class, WicketUtils.newPathParameter(repositoryName, Constants.HEAD, path)));

 

-		add(new LinkPanel("shortlog", "title", commit == null ? "" : commit.getShortMessage(), CommitPage.class, newCommitParameter()));

+		add(new CommitHeaderPanel("commitHeader", repositoryName, commit));

 

 		// breadcrumbs

 		add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, path, objectId));

@@ -66,7 +67,7 @@
 						// folder/tree link

 						item.add(WicketUtils.newImage("pathIcon", "folder_16x16.png"));

 						item.add(new Label("pathSize", ""));

-						item.add(new LinkPanel("pathName", null, entry.name, TreePage.class, newPathParameter(entry.path)));

+						item.add(new LinkPanel("pathName", "list", entry.name, TreePage.class, newPathParameter(entry.path)));

 

 						// links

 						Fragment links = new Fragment("pathLinks", "treeLinks", this);

@@ -75,7 +76,7 @@
 						item.add(links);

 					} else {

 						// blob link

-						item.add(WicketUtils.newImage("pathIcon", "file_16x16.png"));

+						item.add(WicketUtils.getFileImage("pathIcon", entry.name));

 						item.add(new Label("pathSize", byteFormat.format(entry.size)));

 						item.add(new LinkPanel("pathName", "list", entry.name, BlobPage.class, newPathParameter(entry.path)));

 

diff --git a/src/com/gitblit/wicket/panels/CommitHeaderPanel.html b/src/com/gitblit/wicket/panels/CommitHeaderPanel.html
new file mode 100644
index 0000000..e02fc25
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/CommitHeaderPanel.html
@@ -0,0 +1,15 @@
+<!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="commitHeader">

+		<div style="float:right;">

+			<span wicket:id="author">[author]</span> &nbsp; &nbsp;<span wicket:id="date">[date]</span>

+		</div>

+		<span wicket:id="shortmessage">[short message]</span> <span wicket:id="commitid">[commit id]</span>

+	</div>

+</wicket:panel>

+</html>
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/CommitHeaderPanel.java b/src/com/gitblit/wicket/panels/CommitHeaderPanel.java
new file mode 100644
index 0000000..da72a7c
--- /dev/null
+++ b/src/com/gitblit/wicket/panels/CommitHeaderPanel.java
@@ -0,0 +1,23 @@
+package com.gitblit.wicket.panels;

+

+import java.util.Date;

+

+import org.apache.wicket.markup.html.basic.Label;

+import org.eclipse.jgit.revwalk.RevCommit;

+

+import com.gitblit.wicket.LinkPanel;

+import com.gitblit.wicket.WicketUtils;

+import com.gitblit.wicket.pages.CommitPage;

+

+public class CommitHeaderPanel extends BasePanel {

+

+	private static final long serialVersionUID = 1L;

+

+	public CommitHeaderPanel(String id, String repositoryName, RevCommit c) {

+		super(id);

+		add(new LinkPanel("shortmessage", "title", c == null ? "" : c.getShortMessage(), CommitPage.class, WicketUtils.newObjectParameter(repositoryName, c == null ? "" : c.getName())));

+		add(new Label("commitid", "(" + c.getName().substring(0, 8) + ")"));		

+		add(new Label("author", c == null ? "" : c.getAuthorIdent().getName()));

+		add(WicketUtils.createDateLabel("date", c == null ? new Date(0) : c.getAuthorIdent().getWhen(), getTimeZone()));

+	}

+}
\ No newline at end of file
diff --git a/src/com/gitblit/wicket/panels/HistoryPanel.html b/src/com/gitblit/wicket/panels/HistoryPanel.html
index 3fa2262..9589d14 100644
--- a/src/com/gitblit/wicket/panels/HistoryPanel.html
+++ b/src/com/gitblit/wicket/panels/HistoryPanel.html
@@ -7,8 +7,8 @@
 <body>

 <wicket:panel>

 

-	<!-- header -->	

-	<div class="header" wicket:id="header">[history header]</div>

+	<!-- commit header -->

+	<div wicket:id="commitHeader">[commit header]</div>

 

 	<!-- breadcrumbs -->

 	<div wicket:id="breadcrumbs">[breadcrumbs]</div>

diff --git a/src/com/gitblit/wicket/panels/HistoryPanel.java b/src/com/gitblit/wicket/panels/HistoryPanel.java
index 234e00b..71ab930 100644
--- a/src/com/gitblit/wicket/panels/HistoryPanel.java
+++ b/src/com/gitblit/wicket/panels/HistoryPanel.java
@@ -29,7 +29,6 @@
 import com.gitblit.wicket.pages.CommitDiffPage;

 import com.gitblit.wicket.pages.CommitPage;

 import com.gitblit.wicket.pages.HistoryPage;

-import com.gitblit.wicket.pages.LogPage;

 import com.gitblit.wicket.pages.SearchPage;

 import com.gitblit.wicket.pages.TreePage;

 

@@ -73,16 +72,7 @@
 		// works unless commits.size() represents the exact end.

 		hasMore = commits.size() >= itemsPerPage;

 

-		// header

-		if (pageResults) {

-			// history page

-			// show commit page link

-			add(new LinkPanel("header", "title", commit == null ? "" : commit.getShortMessage(), CommitPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));

-		} else {

-			// summary page

-			// show history page link

-			add(new LinkPanel("header", "title", new StringResourceModel("gb.history", this, null), LogPage.class, WicketUtils.newRepositoryParameter(repositoryName)));

-		}

+		add(new CommitHeaderPanel("commitHeader", repositoryName, commit));

 

 		// breadcrumbs

 		add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, path, objectId));

diff --git a/src/com/gitblit/wicket/panels/PageLinksPanel.java b/src/com/gitblit/wicket/panels/PageLinksPanel.java
index c2bae8f..0f33501 100644
--- a/src/com/gitblit/wicket/panels/PageLinksPanel.java
+++ b/src/com/gitblit/wicket/panels/PageLinksPanel.java
@@ -27,6 +27,7 @@
 import com.gitblit.wicket.LinkPanel;

 import com.gitblit.wicket.WicketUtils;

 import com.gitblit.wicket.pages.BranchesPage;

+import com.gitblit.wicket.pages.DocsPage;

 import com.gitblit.wicket.pages.LogPage;

 import com.gitblit.wicket.pages.SearchPage;

 import com.gitblit.wicket.pages.SummaryPage;

@@ -72,7 +73,7 @@
 

 		// Get the repository docs setting

 		boolean checkDocs = JGitUtils.getRepositoryUseDocs(r);

-		if (checkDocs && JGitUtils.getDocumentsBranch(r) != null) {

+		if (checkDocs) {

 			extras.add("docs");

 		}

 

@@ -87,7 +88,7 @@
 					item.add(new LinkPanel("extraLink", null, getString("gb.tickets"), TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));

 				} else if (extra.equals("docs")) {

 					item.add(new Label("extraSeparator", " | "));

-					item.add(new LinkPanel("extraLink", null, getString("gb.docs"), TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));

+					item.add(new LinkPanel("extraLink", null, getString("gb.docs"), DocsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));

 				}

 			}

 		};

diff --git a/src/com/gitblit/wicket/resources/file_acrobat_16x16.png b/src/com/gitblit/wicket/resources/file_acrobat_16x16.png
new file mode 100644
index 0000000..f162783
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_acrobat_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_c_16x16.png b/src/com/gitblit/wicket/resources/file_c_16x16.png
new file mode 100644
index 0000000..44045a9
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_c_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_code_16x16.png b/src/com/gitblit/wicket/resources/file_code_16x16.png
new file mode 100644
index 0000000..931b0d6
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_code_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_cpp_16x16.png b/src/com/gitblit/wicket/resources/file_cpp_16x16.png
new file mode 100644
index 0000000..d3f55ee
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_cpp_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_cs_16x16.png b/src/com/gitblit/wicket/resources/file_cs_16x16.png
new file mode 100644
index 0000000..8013020
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_cs_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_doc_16x16.png b/src/com/gitblit/wicket/resources/file_doc_16x16.png
new file mode 100644
index 0000000..225c3b0
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_doc_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_excel_16x16.png b/src/com/gitblit/wicket/resources/file_excel_16x16.png
new file mode 100644
index 0000000..04e0332
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_excel_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_h_16x16.png b/src/com/gitblit/wicket/resources/file_h_16x16.png
new file mode 100644
index 0000000..3f7f539
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_h_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_java_16x16.png b/src/com/gitblit/wicket/resources/file_java_16x16.png
new file mode 100644
index 0000000..16620e5
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_java_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_php_16x16.png b/src/com/gitblit/wicket/resources/file_php_16x16.png
new file mode 100644
index 0000000..4ac5618
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_php_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_ppt_16x16.png b/src/com/gitblit/wicket/resources/file_ppt_16x16.png
new file mode 100644
index 0000000..44bbf26
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_ppt_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_ruby_16x16.png b/src/com/gitblit/wicket/resources/file_ruby_16x16.png
new file mode 100644
index 0000000..f29349d
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_ruby_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_settings_16x16.png b/src/com/gitblit/wicket/resources/file_settings_16x16.png
new file mode 100644
index 0000000..92953fe
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_settings_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_vs_16x16.png b/src/com/gitblit/wicket/resources/file_vs_16x16.png
new file mode 100644
index 0000000..645fa7a
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_vs_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_world_16x16.png b/src/com/gitblit/wicket/resources/file_world_16x16.png
new file mode 100644
index 0000000..0a4fa8b
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_world_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/file_zip_16x16.png b/src/com/gitblit/wicket/resources/file_zip_16x16.png
new file mode 100644
index 0000000..1584592
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/file_zip_16x16.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/gitblit.css b/src/com/gitblit/wicket/resources/gitblit.css
index 3200381..ce3be67 100644
--- a/src/com/gitblit/wicket/resources/gitblit.css
+++ b/src/com/gitblit/wicket/resources/gitblit.css
@@ -72,20 +72,27 @@
 	line-height: inherit;

 }

 

-div.header {

+div.header, div.commitHeader {

 	background-color: #D2C3AF;

 	padding: 3px;

 	border: 1px solid #808080;

+}

+

+div.header {

 	border-radius: 3px 3px 0 0;

 }

 

-div.header a {

+div.commitHeader {

+	border-radius: 3px;

+}

+

+div.header a, div.commitHeader a {

 	color: black;

 	text-decoration: none;

 	font-weight: bold;

 }

 

-div.header a:hover {

+div.header a:hover, div.commitHeader a:hover {

 	text-decoration: underline;

 }

 

@@ -558,14 +565,15 @@
 }

 

 td.mode {

+	text-align: right;

 	font-family: monospace;

-	width:90px;

+	width: 8em;

 	padding-right:15px;

 }

 

 td.size {

 	text-align: right;

-	width:100px;	

+	width: 8em;	

 	padding-right:15px;

 }

 

@@ -573,6 +581,11 @@
 	text-align: right;

 }

 

+td.treeLinks {

+	text-align: right;

+	width: 13em;

+}

+

 span .tagRef, span .headRef, span .remoteRef, span .otherRef {	

 	padding: 0px 3px;

 	margin-right:2px;

diff --git a/src/com/gitblit/wicket/resources/welcome.mkd b/src/com/gitblit/wicket/resources/welcome.mkd
index a38cbb5..7f74406 100644
--- a/src/com/gitblit/wicket/resources/welcome.mkd
+++ b/src/com/gitblit/wicket/resources/welcome.mkd
@@ -2,4 +2,4 @@
 

 A quick and easy way to host your own Git repositories.

 

-Built with [JGit](http://eclipse.org/jgit) [Wicket](http://wicket.apache.org) [WicketStuff GoogleCharts](https://github.com/wicketstuff/core/wiki/GoogleCharts) [MarkdownPapers](http://markdown.tautua.org) [Jetty](http://eclipse.org/jetty) [SLF4J](http://www.slf4j.org) [Log4j](http://logging.apache.org/log4j) [google-code-prettify](http://code.google.com/p/google-code-prettify) [JCommander](http://jcommander.org)
\ No newline at end of file
+Built with [JGit](http://eclipse.org/jgit), [Wicket](http://wicket.apache.org), [WicketStuff GoogleCharts](https://github.com/wicketstuff/core/wiki/GoogleCharts), [markitup](http://markitup.jaysalvat.com), [MarkdownPapers](http://markdown.tautua.org), [Jetty](http://eclipse.org/jetty), [SLF4J](http://www.slf4j.org), [Log4j](http://logging.apache.org/log4j), [google-code-prettify](http://code.google.com/p/google-code-prettify), [JCommander](http://jcommander.org), Most icons courtesy of [FatCow Hosting](http://www.fatcow.com/free-icons)
\ No newline at end of file