summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn O. Pearce <sop@google.com>2009-01-27 11:35:18 -0800
committerShawn O. Pearce <sop@google.com>2009-01-27 11:35:23 -0800
commitecd2cb62fd4cd89d5e1e9c70166c8aed47232934 (patch)
treeb46a2faf491ef41be691f5547b70a2f289e90e0a
parent51e313d48f41121af3fb7169b16c06f5bb5f20f4 (diff)
Line wrap the side by side tables at 100 columns
Excessively long lines force the file to be very hard to read in a side-by-side presentation as it makes one (or both) columns too wide for many common display devices, especially laptops. Forcing our own line wrapping at some reasonable limit (e.g. 100) ensures that even if the project's style standards permit very long lines the page is still at least readable on a smaller monitor. Signed-off-by: Shawn O. Pearce <sop@google.com>
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/patches/PatchUtil.java51
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java10
-rw-r--r--appjar/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java7
3 files changed, 58 insertions, 10 deletions
diff --git a/appjar/src/main/java/com/google/gerrit/client/patches/PatchUtil.java b/appjar/src/main/java/com/google/gerrit/client/patches/PatchUtil.java
index 69ea33b0ef..0f7f175a21 100644
--- a/appjar/src/main/java/com/google/gerrit/client/patches/PatchUtil.java
+++ b/appjar/src/main/java/com/google/gerrit/client/patches/PatchUtil.java
@@ -22,18 +22,63 @@ public class PatchUtil {
public static final PatchConstants C = GWT.create(PatchConstants.class);
public static final PatchMessages M = GWT.create(PatchMessages.class);
public static final PatchDetailService DETAIL_SVC;
+ public static final int DEFAULT_LINE_LENGTH = 100;
static {
DETAIL_SVC = GWT.create(PatchDetailService.class);
JsonUtil.bind(DETAIL_SVC, "rpc/PatchDetailService");
}
- public static String lineToHTML(final String src) {
- String html = DomUtil.escape(src);
- html = expandTabs(html);
+ public static String lineToHTML(final String src, final int lineLength) {
+ final boolean hasTab = src.indexOf('\t') >= 0;
+ String brokenSrc = wrapLines(src, hasTab, lineLength);
+ String html = DomUtil.escape(brokenSrc);
+ if (brokenSrc != src) {
+ // If we had line breaks inserted into the source text we need
+ // to expand the line breaks into <br> tags in HTML, so the
+ // line will wrap around.
+ //
+ html = expandLFs(html);
+ }
+ if (hasTab) {
+ // We had at least one horizontal tab, so we should expand it out.
+ //
+ html = expandTabs(html);
+ }
return html;
}
+ private static String wrapLines(final String src, final boolean hasTabs,
+ final int lineLength) {
+ if (lineLength <= 0) {
+ // Caller didn't request for line wrapping; use it unmodified.
+ //
+ return src;
+ }
+ if (src.length() < lineLength && !hasTabs) {
+ // We're too short and there are no horizontal tabs, line is fine
+ // as-is so bypass the longer line wrapping code below.
+ return src;
+ }
+
+ final StringBuilder r = new StringBuilder();
+ int lineLen = 0;
+ for (int i = 0; i < src.length(); i++) {
+ final char c = src.charAt(i);
+ final int cLen = c == '\t' ? 8 : 1;
+ if (lineLen >= lineLength) {
+ r.append('\n');
+ lineLen = 0;
+ }
+ r.append(c);
+ lineLen += cLen;
+ }
+ return r.toString();
+ }
+
private native static String expandTabs(String src)
/*-{ return src.replace(/\t/g, '<span title="Visual Tab" class="gerrit-visualtab">&raquo;</span>\t'); }-*/;
+
+ private native static String expandLFs(String src)
+ /*-{ return src.replace(/\n/g, '<br>'); }-*/;
}
diff --git a/appjar/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java b/appjar/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java
index 03271618b1..e818bb9ddf 100644
--- a/appjar/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java
+++ b/appjar/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java
@@ -293,7 +293,7 @@ public class SideBySideTable extends AbstractPatchContentTable {
private void appendFileLine(final StringBuilder nc,
final List<SideBySideLine> line) {
- nc.append("<tr>");
+ nc.append("<tr valign=\"top\">");
nc.append("<td class=\"" + S_ICON_CELL + "\">&nbsp;</td>");
for (int fileId = 0; fileId < fileCnt; fileId++) {
@@ -306,10 +306,12 @@ public class SideBySideTable extends AbstractPatchContentTable {
nc.append("<td class=\"FileLine FileLine-");
nc.append(s.getType().name());
nc.append("\">");
- if (!"".equals(s.getText()))
- nc.append(PatchUtil.lineToHTML(s.getText()));
- else
+ if (!"".equals(s.getText())) {
+ nc.append(PatchUtil.lineToHTML(s.getText(),
+ PatchUtil.DEFAULT_LINE_LENGTH));
+ } else {
nc.append("&nbsp;");
+ }
nc.append("</td>");
} else {
nc.append("<td class=\"LineNumber\">&nbsp;</td>");
diff --git a/appjar/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java b/appjar/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java
index b475092a21..b2d6682c3d 100644
--- a/appjar/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java
+++ b/appjar/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java
@@ -109,10 +109,11 @@ public class UnifiedDiffTable extends AbstractPatchContentTable {
nc.append("<td class=\"DiffText DiffText-");
nc.append(line.getType().name());
nc.append("\">");
- if (!"".equals(line.getText()))
- nc.append(PatchUtil.lineToHTML(line.getText()));
- else
+ if (!"".equals(line.getText())) {
+ nc.append(PatchUtil.lineToHTML(line.getText(), 0));
+ } else {
nc.append("&nbsp;");
+ }
nc.append("</td>");
nc.append("</tr>");