Merge "SideBySide2: Defer syntax highlighting on large files"
This commit is contained in:
@@ -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() {
|
||||
}
|
||||
|
@@ -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() {
|
||||
@Override
|
||||
public void run() {
|
||||
cmA.setOption("mode", b ? getContentType(diff.meta_a()) : null);
|
||||
cmB.setOption("mode", b ? getContentType(diff.meta_b()) : null);
|
||||
}
|
||||
});
|
||||
void setSyntaxHighlighting(boolean b) {
|
||||
if (b) {
|
||||
injectMode(diff, new AsyncCallback<Void>() {
|
||||
@Override
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user