Unified: Handle "showLineNumbers" preference

Make Unified respect the "showLineNumbers" preference. To make the UI
consistent with SideBySide, also show the same red bar on placeholder
gutters (those without line numbers) for diff gaps. Again for
consistency with SideBySide, show an extra pair of line numbers at the
end of the file representing the trailing newline.

Change-Id: I1eb56cb1d53e95adadc070b16f31caf16284f7a9
This commit is contained in:
Michael Zhou
2016-03-27 03:25:12 -04:00
parent 07b72b3a4c
commit b337f6a8fb
10 changed files with 68 additions and 29 deletions

View File

@@ -576,7 +576,15 @@ abstract class DiffScreen extends Screen {
getChunkManager().render(diff); getChunkManager().render(diff);
} }
abstract void setShowLineNumbers(boolean b); void setShowLineNumbers(boolean b) {
if (b) {
getDiffTable().addStyleName(
Resources.I.diffTableStyle().showLineNumbers());
} else {
getDiffTable().removeStyleName(
Resources.I.diffTableStyle().showLineNumbers());
}
}
void setShowIntraline(boolean b) { void setShowIntraline(boolean b) {
if (b && getIntraLineStatus() == DiffInfo.IntraLineStatus.OFF) { if (b && getIntraLineStatus() == DiffInfo.IntraLineStatus.OFF) {
@@ -905,8 +913,8 @@ abstract class DiffScreen extends Screen {
private GutterClickHandler onGutterClick(final CodeMirror cm) { private GutterClickHandler onGutterClick(final CodeMirror cm) {
return new GutterClickHandler() { return new GutterClickHandler() {
@Override @Override
public void handle(CodeMirror instance, final int line, final String gutterClass, public void handle(CodeMirror instance, final int line,
NativeEvent clickEvent) { final String gutterClass, NativeEvent clickEvent) {
if (clickEvent.getButton() == NativeEvent.BUTTON_LEFT if (clickEvent.getButton() == NativeEvent.BUTTON_LEFT
&& !clickEvent.getMetaKey() && !clickEvent.getMetaKey()
&& !clickEvent.getAltKey() && !clickEvent.getAltKey()
@@ -916,7 +924,8 @@ abstract class DiffScreen extends Screen {
Scheduler.get().scheduleDeferred(new ScheduledCommand() { Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override @Override
public void execute() { public void execute() {
getCommentManager().newDraftOnGutterClick(cm, gutterClass, line + 1); getCommentManager().newDraftOnGutterClick(
cm, gutterClass, line + 1);
} }
}); });
} }

View File

@@ -35,6 +35,7 @@
margin: 0 0 3px 0; margin: 0 0 3px 0;
} }
@external .dark, .noIntraline; @external .dark, .noIntraline, .showLineNumbers;
.dark {} .dark {}
.noIntraline {} .noIntraline {}
.showLineNumbers {}

View File

@@ -46,6 +46,7 @@ abstract class DiffTable extends Composite {
String range(); String range();
String rangeHighlight(); String rangeHighlight();
String diffHeader(); String diffHeader();
String showLineNumbers();
} }
@UiField Element patchSetNavRow; @UiField Element patchSetNavRow;

View File

@@ -185,7 +185,7 @@ public class SideBySide extends DiffScreen {
setThemeStyles(prefs.theme().isDark()); setThemeStyles(prefs.theme().isDark());
setShowIntraline(prefs.intralineDifference()); setShowIntraline(prefs.intralineDifference());
if (prefs.showLineNumbers()) { if (prefs.showLineNumbers()) {
diffTable.addStyleName(SideBySideTable.style.showLineNumbers()); diffTable.addStyleName(Resources.I.diffTableStyle().showLineNumbers());
} }
cmA = newCm(diff.metaA(), diff.textA(), diffTable.cmA); cmA = newCm(diff.metaA(), diff.textA(), diffTable.cmA);
@@ -260,13 +260,10 @@ public class SideBySide extends DiffScreen {
@Override @Override
void setShowLineNumbers(boolean b) { void setShowLineNumbers(boolean b) {
super.setShowLineNumbers(b);
cmA.setOption("lineNumbers", b); cmA.setOption("lineNumbers", b);
cmB.setOption("lineNumbers", b); cmB.setOption("lineNumbers", b);
if (b) {
diffTable.addStyleName(SideBySideTable.style.showLineNumbers());
} else {
diffTable.removeStyleName(SideBySideTable.style.showLineNumbers());
}
} }
@Override @Override

View File

@@ -34,7 +34,6 @@ class SideBySideTable extends DiffTable {
interface DiffTableStyle extends CssResource { interface DiffTableStyle extends CssResource {
String intralineBg(); String intralineBg();
String diff(); String diff();
String showLineNumbers();
String hideA(); String hideA();
String hideB(); String hideB();
String padding(); String padding();

View File

@@ -25,7 +25,7 @@ limitations under the License.
@external .CodeMirror-dialog-bottom; @external .CodeMirror-dialog-bottom;
@external .CodeMirror-cursor; @external .CodeMirror-cursor;
@external .dark, .noIntraline; @external .dark, .noIntraline, .showLineNumbers;
.difftable .patchSetNav, .difftable .patchSetNav,
.difftable .CodeMirror { .difftable .CodeMirror {

View File

@@ -41,7 +41,7 @@ import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.ImageResourceRenderer; import com.google.gwt.user.client.ui.ImageResourceRenderer;
import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.InlineHTML;
import com.google.gwtexpui.globalkey.client.GlobalKey; import com.google.gwtexpui.globalkey.client.GlobalKey;
import net.codemirror.lib.CodeMirror; import net.codemirror.lib.CodeMirror;
@@ -174,7 +174,9 @@ public class Unified extends DiffScreen {
final DiffInfo diff = getDiff(); final DiffInfo diff = getDiff();
setThemeStyles(prefs.theme().isDark()); setThemeStyles(prefs.theme().isDark());
setShowIntraline(prefs.intralineDifference()); setShowIntraline(prefs.intralineDifference());
// TODO: Handle showLineNumbers preference if (prefs.showLineNumbers()) {
diffTable.addStyleName(Resources.I.diffTableStyle().showLineNumbers());
}
cm = newCm( cm = newCm(
diff.metaA() == null ? diff.metaB() : diff.metaA(), diff.metaA() == null ? diff.metaB() : diff.metaA(),
@@ -248,18 +250,31 @@ public class Unified extends DiffScreen {
@Override @Override
void setShowLineNumbers(boolean b) { void setShowLineNumbers(boolean b) {
// TODO: Implement this super.setShowLineNumbers(b);
cm.refresh();
} }
LineHandle setLineNumber(DisplaySide side, final int cmLine, int line) { private void setLineNumber(DisplaySide side, int cmLine, String html,
Label gutter = new Label(String.valueOf(line)); String styleName) {
InlineHTML gutter = new InlineHTML(html);
diffTable.add(gutter); diffTable.add(gutter);
gutter.setStyleName(UnifiedTable.style.unifiedLineNumber()); gutter.setStyleName(styleName);
return cm.setGutterMarker(cmLine, cm.setGutterMarker(cmLine, side == DisplaySide.A
side == DisplaySide.A ? UnifiedTable.style.lineNumbersLeft() ? UnifiedTable.style.lineNumbersLeft()
: UnifiedTable.style.lineNumbersRight(), gutter.getElement()); : UnifiedTable.style.lineNumbersRight(), gutter.getElement());
} }
void setLineNumber(DisplaySide side, int cmLine, int line) {
setLineNumber(side, cmLine, String.valueOf(line),
UnifiedTable.style.unifiedLineNumber());
}
void setLineNumberEmpty(DisplaySide side, int cmLine) {
setLineNumber(side, cmLine, " ",
UnifiedTable.style.unifiedLineNumberEmpty());
}
@Override @Override
void setSyntaxHighlighting(boolean b) { void setSyntaxHighlighting(boolean b) {
final DiffInfo diff = getDiff(); final DiffInfo diff = getDiff();

View File

@@ -109,6 +109,8 @@ class UnifiedChunkManager extends ChunkManager {
cmLine += render(current, cmLine, useIntralineBg); cmLine += render(current, cmLine, useIntralineBg);
} }
} }
host.setLineNumber(DisplaySide.A, cmLine, lineMapper.getLineA() + 1);
host.setLineNumber(DisplaySide.B, cmLine, lineMapper.getLineB() + 1);
} }
private int render(Region region, int cmLine, boolean useIntralineBg) { private int render(Region region, int cmLine, boolean useIntralineBg) {
@@ -141,11 +143,13 @@ class UnifiedChunkManager extends ChunkManager {
addDiffChunk(DisplaySide.A, endA, endB, aLen, cmLine, bLen > 0); addDiffChunk(DisplaySide.A, endA, endB, aLen, cmLine, bLen > 0);
for (int j = 0; j < aLen; j++) { for (int j = 0; j < aLen; j++) {
host.setLineNumber(DisplaySide.A, cmLine + j, startA + j + 1); host.setLineNumber(DisplaySide.A, cmLine + j, startA + j + 1);
host.setLineNumberEmpty(DisplaySide.B, cmLine + j);
} }
} }
if (bLen > 0) { if (bLen > 0) {
addDiffChunk(DisplaySide.B, endB, endA, bLen, cmLine + aLen, aLen > 0); addDiffChunk(DisplaySide.B, endB, endA, bLen, cmLine + aLen, aLen > 0);
for (int j = 0; j < bLen; j++) { for (int j = 0; j < bLen; j++) {
host.setLineNumberEmpty(DisplaySide.A, cmLine + aLen + j);
host.setLineNumber(DisplaySide.B, cmLine + aLen + j, startB + j + 1); host.setLineNumber(DisplaySide.B, cmLine + aLen + j, startB + j + 1);
} }
} }

View File

@@ -36,6 +36,7 @@ class UnifiedTable extends DiffTable {
String diffInsert(); String diffInsert();
String diffDelete(); String diffDelete();
String unifiedLineNumber(); String unifiedLineNumber();
String unifiedLineNumberEmpty();
String lineNumbersLeft(); String lineNumbersLeft();
String lineNumbersRight(); String lineNumbersRight();
} }

View File

@@ -24,7 +24,7 @@ limitations under the License.
@external .CodeMirror-dialog-bottom; @external .CodeMirror-dialog-bottom;
@external .CodeMirror-cursor; @external .CodeMirror-cursor;
@external .dark, .unifiedLineNumber, .noIntraline; @external .dark, .unifiedLineNumber, .noIntraline, .showLineNumbers;
.difftable .patchSetNav, .difftable .patchSetNav,
.difftable .CodeMirror { .difftable .CodeMirror {
@@ -94,21 +94,33 @@ limitations under the License.
bottom: auto; bottom: auto;
left: auto; left: auto;
} }
.showLineNumbers .lineNumbersLeft, .showLineNumbers .lineNumbersRight {
.lineNumbersLeft, .lineNumbersRight {
min-width: 20px; min-width: 20px;
width: 3em; /* TODO: This needs to be set based on number of lines */ width: 3em; /* TODO: This needs to be set based on number of lines */
} }
.lineNumbersLeft { .showLineNumbers .lineNumbersLeft {
border-right: 1px solid #ddd; border-right: 1px solid #ddd;
} }
.unifiedLineNumber { .unifiedLineNumber {
display: none;
}
.showLineNumbers .unifiedLineNumber {
display: block;
cursor: pointer; cursor: pointer;
padding: 0 3px 0 5px; padding: 0 3px 0 5px;
min-width: 20px; min-width: 20px;
text-align: right; text-align: right;
color: #999; color: #999;
} }
.unifiedLineNumberEmpty {
display: none;
}
.showLineNumbers .unifiedLineNumberEmpty {
display: block;
margin-left: 28px;
border-left: 2px solid #d64040;
padding-bottom: 1px;
}
</ui:style> </ui:style>
<g:HTMLPanel styleName='{style.difftable}'> <g:HTMLPanel styleName='{style.difftable}'>
<table class='{style.table}'> <table class='{style.table}'>