Merge "SideBySide2: Defer syntax highlighting on large files"

This commit is contained in:
Shawn Pearce
2013-12-09 16:47:54 +00:00
committed by Gerrit Code Review
4 changed files with 74 additions and 20 deletions

View File

@@ -2311,11 +2311,13 @@ As response a link:#diff-info[DiffInfo] entity is returned that describes the di
{
"meta_a": {
"name": "gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java",
"content_type": "text/x-java-source"
"content_type": "text/x-java-source",
"lines": 372
},
"meta_b": {
"name": "gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java",
"content_type": "text/x-java-source"
"content_type": "text/x-java-source",
"lines": 578
},
"change_type": "MODIFIED",
"diff_header": [
@@ -2379,11 +2381,13 @@ If the `intraline` parameter is specified, intraline differences are included in
{
"meta_a": {
"name": "gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java",
"content_type": "text/x-java-source"
"content_type": "text/x-java-source",
"lines": 372
},
"meta_b": {
"name": "gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java",
"content_type": "text/x-java-source"
"content_type": "text/x-java-source",
"lines": 578
},
"change_type": "MODIFIED",
"diff_header": [
@@ -2431,11 +2435,13 @@ be generated.
{
"meta_a": {
"name": "gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java",
"content_type": "text/x-java-source"
"content_type": "text/x-java-source",
"lines": 578
},
"meta_b": {
"name": "gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java",
"content_type": "text/x-java-source"
"content_type": "text/x-java-source",
"lines": 578
},
"change_type": "MODIFIED",
"content": [
@@ -3008,6 +3014,7 @@ The `DiffFileMetaInfo` entity contains meta information about a file diff.
|Field Name |Description
|`name` |The name of the file.
|`content_type`|The content type of the file.
|`lines` |The total number of lines in the file.
|==========================
[[diff-info]]

View File

@@ -99,6 +99,7 @@ public class DiffInfo extends JavaScriptObject {
public static class FileMeta extends JavaScriptObject {
public final native String name() /*-{ return this.name; }-*/;
public final native String content_type() /*-{ return this.content_type; }-*/;
public final native int lines() /*-{ return this.lines || 0 }-*/;
protected FileMeta() {
}

View File

@@ -49,6 +49,7 @@ import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.RepeatingCommand;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
@@ -122,6 +123,7 @@ public class SideBySide2 extends Screen {
private JsArray<CommentInfo> draftsBase;
private JsArray<CommentInfo> draftsRevision;
private DiffInfo diff;
private boolean largeFile;
private LineMapper mapper;
private List<TextMarker> markers;
private List<Runnable> undoLineClass;
@@ -188,10 +190,16 @@ public class SideBySide2 extends Screen {
@Override
public void onSuccess(DiffInfo diffInfo) {
diff = diffInfo;
new ModeInjector()
.add(getContentType(diff.meta_a()))
.add(getContentType(diff.meta_b()))
.inject(modeInjectorCb);
if (prefs.syntaxHighlighting()) {
largeFile = isLargeFile(diffInfo);
if (largeFile) {
modeInjectorCb.onSuccess(null);
} else {
injectMode(diffInfo, modeInjectorCb);
}
} else {
modeInjectorCb.onSuccess(null);
}
}
}));
@@ -524,6 +532,18 @@ public class SideBySide2 extends Screen {
resizeCodeMirror();
}
});
if (largeFile && prefs.syntaxHighlighting()) {
Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
@Override
public boolean execute() {
if (prefs.syntaxHighlighting() && isAttached()) {
setSyntaxHighlighting(prefs.syntaxHighlighting());
}
return false;
}
}, 250);
}
}
private CodeMirror createCodeMirror(
@@ -536,7 +556,7 @@ public class SideBySide2 extends Screen {
.set("cursorHeight", 0.85)
.set("lineNumbers", true)
.set("tabSize", prefs.tabSize())
.set("mode", getContentType(meta))
.set("mode", largeFile ? null : getContentType(meta))
.set("lineWrapping", false)
.set("styleSelectedText", true)
.set("showTrailingSpace", prefs.showWhitespaceErrors())
@@ -573,14 +593,26 @@ public class SideBySide2 extends Screen {
prefsAction.update();
}
void setSyntaxHighlighting(final boolean b) {
operation(new Runnable() {
void setSyntaxHighlighting(boolean b) {
if (b) {
injectMode(diff, new AsyncCallback<Void>() {
@Override
public void run() {
cmA.setOption("mode", b ? getContentType(diff.meta_a()) : null);
cmB.setOption("mode", b ? getContentType(diff.meta_b()) : null);
public void onSuccess(Void result) {
if (prefs.syntaxHighlighting()) {
cmA.setOption("mode", getContentType(diff.meta_a()));
cmB.setOption("mode", getContentType(diff.meta_b()));
}
}
@Override
public void onFailure(Throwable caught) {
prefs.syntaxHighlighting(false);
}
});
} else {
cmA.setOption("mode", (String) null);
cmB.setOption("mode", (String) null);
}
}
void setContext(final int context) {
@@ -1547,6 +1579,13 @@ public class SideBySide2 extends Screen {
: null;
}
private void injectMode(DiffInfo diffInfo, AsyncCallback<Void> cb) {
new ModeInjector()
.add(getContentType(diffInfo.meta_a()))
.add(getContentType(diffInfo.meta_b()))
.inject(cb);
}
DiffPreferences getPrefs() {
return prefs;
}
@@ -1624,4 +1663,9 @@ public class SideBySide2 extends Screen {
}
});
}
private static boolean isLargeFile(DiffInfo diffInfo) {
return (diffInfo.meta_a() != null && diffInfo.meta_a().lines() > 500)
|| (diffInfo.meta_b() != null && diffInfo.meta_b().lines() > 500);
}
}

View File

@@ -132,12 +132,14 @@ public class GetDiff implements RestReadView<FileResource> {
result.metaA = new FileMeta();
result.metaA.name = Objects.firstNonNull(ps.getOldName(), ps.getNewName());
result.metaA.setContentType(ps.getFileModeA(), ps.getMimeTypeA());
result.metaA.lines = ps.getA().size();
}
if (ps.getDisplayMethodB() != DisplayMethod.NONE) {
result.metaB = new FileMeta();
result.metaB.name = ps.getNewName();
result.metaB.setContentType(ps.getFileModeB(), ps.getMimeTypeB());
result.metaB.lines = ps.getB().size();
}
if (intraline) {
@@ -179,7 +181,7 @@ public class GetDiff implements RestReadView<FileResource> {
static class FileMeta {
String name;
String contentType;
String url;
Integer lines;
void setContentType(FileMode fileMode, String mimeType) {
switch (fileMode) {