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);
}
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) {
if (b && getIntraLineStatus() == DiffInfo.IntraLineStatus.OFF) {
@@ -905,8 +913,8 @@ abstract class DiffScreen extends Screen {
private GutterClickHandler onGutterClick(final CodeMirror cm) {
return new GutterClickHandler() {
@Override
public void handle(CodeMirror instance, final int line, final String gutterClass,
NativeEvent clickEvent) {
public void handle(CodeMirror instance, final int line,
final String gutterClass, NativeEvent clickEvent) {
if (clickEvent.getButton() == NativeEvent.BUTTON_LEFT
&& !clickEvent.getMetaKey()
&& !clickEvent.getAltKey()
@@ -916,7 +924,8 @@ abstract class DiffScreen extends Screen {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
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;
}
@external .dark, .noIntraline;
@external .dark, .noIntraline, .showLineNumbers;
.dark {}
.noIntraline {}
.noIntraline {}
.showLineNumbers {}

View File

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

View File

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

View File

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

View File

@@ -17,15 +17,15 @@ limitations under the License.
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:d='urn:import:com.google.gerrit.client.diff'>
<ui:with field='res' type='com.google.gerrit.client.diff.Resources'/>
<ui:with field='res' type='com.google.gerrit.client.diff.Resources'/>
<ui:style gss='false' type='com.google.gerrit.client.diff.SideBySideTable.DiffTableStyle'>
@external .CodeMirror, .CodeMirror-selectedtext;
@external .CodeMirror-linenumber;
@external .CodeMirror-overlayscroll-vertical, .CodeMirror-scroll;
@external .CodeMirror-dialog-bottom;
@external .CodeMirror-cursor;
@external .dark, .noIntraline;
@external .dark, .noIntraline, .showLineNumbers;
.difftable .patchSetNav,
.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.ui.FlowPanel;
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 net.codemirror.lib.CodeMirror;
@@ -174,7 +174,9 @@ public class Unified extends DiffScreen {
final DiffInfo diff = getDiff();
setThemeStyles(prefs.theme().isDark());
setShowIntraline(prefs.intralineDifference());
// TODO: Handle showLineNumbers preference
if (prefs.showLineNumbers()) {
diffTable.addStyleName(Resources.I.diffTableStyle().showLineNumbers());
}
cm = newCm(
diff.metaA() == null ? diff.metaB() : diff.metaA(),
@@ -248,16 +250,29 @@ public class Unified extends DiffScreen {
@Override
void setShowLineNumbers(boolean b) {
// TODO: Implement this
super.setShowLineNumbers(b);
cm.refresh();
}
LineHandle setLineNumber(DisplaySide side, final int cmLine, int line) {
Label gutter = new Label(String.valueOf(line));
private void setLineNumber(DisplaySide side, int cmLine, String html,
String styleName) {
InlineHTML gutter = new InlineHTML(html);
diffTable.add(gutter);
gutter.setStyleName(UnifiedTable.style.unifiedLineNumber());
return cm.setGutterMarker(cmLine,
side == DisplaySide.A ? UnifiedTable.style.lineNumbersLeft()
: UnifiedTable.style.lineNumbersRight(), gutter.getElement());
gutter.setStyleName(styleName);
cm.setGutterMarker(cmLine, side == DisplaySide.A
? UnifiedTable.style.lineNumbersLeft()
: 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, "&nbsp;",
UnifiedTable.style.unifiedLineNumberEmpty());
}
@Override

View File

@@ -109,6 +109,8 @@ class UnifiedChunkManager extends ChunkManager {
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) {
@@ -141,11 +143,13 @@ class UnifiedChunkManager extends ChunkManager {
addDiffChunk(DisplaySide.A, endA, endB, aLen, cmLine, bLen > 0);
for (int j = 0; j < aLen; j++) {
host.setLineNumber(DisplaySide.A, cmLine + j, startA + j + 1);
host.setLineNumberEmpty(DisplaySide.B, cmLine + j);
}
}
if (bLen > 0) {
addDiffChunk(DisplaySide.B, endB, endA, bLen, cmLine + aLen, aLen > 0);
for (int j = 0; j < bLen; j++) {
host.setLineNumberEmpty(DisplaySide.A, cmLine + aLen + j);
host.setLineNumber(DisplaySide.B, cmLine + aLen + j, startB + j + 1);
}
}

View File

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

View File

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