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

@@ -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() {
@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);
}
}