// Copyright (C) 2013 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.gerrit.client.diff; import com.google.gerrit.client.DiffWebLinkInfo; import com.google.gerrit.client.info.WebLinkInfo; import com.google.gerrit.client.rpc.Natives; import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DiffView; import com.google.gerrit.reviewdb.client.Patch.ChangeType; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayString; import java.util.ArrayList; import java.util.List; public class DiffInfo extends JavaScriptObject { public final native FileMeta metaA() /*-{ return this.meta_a; }-*/; public final native FileMeta metaB() /*-{ return this.meta_b; }-*/; public final native JsArrayString diffHeader() /*-{ return this.diff_header; }-*/; public final native JsArray<Region> content() /*-{ return this.content; }-*/; public final native JsArray<DiffWebLinkInfo> webLinks() /*-{ return this.web_links; }-*/; public final native boolean binary() /*-{ return this.binary || false; }-*/; public final List<WebLinkInfo> sideBySideWebLinks() { return filterWebLinks(DiffView.SIDE_BY_SIDE); } public final List<WebLinkInfo> unifiedWebLinks() { return filterWebLinks(DiffView.UNIFIED_DIFF); } private List<WebLinkInfo> filterWebLinks(DiffView diffView) { List<WebLinkInfo> filteredDiffWebLinks = new ArrayList<>(); List<DiffWebLinkInfo> allDiffWebLinks = Natives.asList(webLinks()); if (allDiffWebLinks != null) { for (DiffWebLinkInfo webLink : allDiffWebLinks) { if (diffView == DiffView.SIDE_BY_SIDE && webLink.showOnSideBySideDiffView()) { filteredDiffWebLinks.add(webLink); } if (diffView == DiffView.UNIFIED_DIFF && webLink.showOnUnifiedDiffView()) { filteredDiffWebLinks.add(webLink); } } } return filteredDiffWebLinks; } public final ChangeType changeType() { return ChangeType.valueOf(changeTypeRaw()); } private native String changeTypeRaw() /*-{ return this.change_type }-*/; public final IntraLineStatus intralineStatus() { String s = intralineStatusRaw(); return s != null ? IntraLineStatus.valueOf(s) : IntraLineStatus.OFF; } private native String intralineStatusRaw() /*-{ return this.intraline_status }-*/; public final boolean hasSkip() { JsArray<Region> c = content(); for (int i = 0; i < c.length(); i++) { if (c.get(i).skip() != 0) { return true; } } return false; } public final String textA() { StringBuilder s = new StringBuilder(); JsArray<Region> c = content(); for (int i = 0; i < c.length(); i++) { Region r = c.get(i); if (r.ab() != null) { append(s, r.ab()); } else if (r.a() != null) { append(s, r.a()); } // TODO skip may need to be handled } return s.toString(); } public final String textB() { StringBuilder s = new StringBuilder(); JsArray<Region> c = content(); for (int i = 0; i < c.length(); i++) { Region r = c.get(i); if (r.ab() != null) { append(s, r.ab()); } else if (r.b() != null) { append(s, r.b()); } // TODO skip may need to be handled } return s.toString(); } public final String textUnified() { StringBuilder s = new StringBuilder(); JsArray<Region> c = content(); for (int i = 0; i < c.length(); i++) { Region r = c.get(i); if (r.ab() != null) { append(s, r.ab()); } else { if (r.a() != null) { append(s, r.a()); } if (r.b() != null) { append(s, r.b()); } } // TODO skip may need to be handled } return s.toString(); } private static void append(StringBuilder s, JsArrayString lines) { for (int i = 0; i < lines.length(); i++) { s.append(lines.get(i)).append('\n'); } } protected DiffInfo() {} public enum IntraLineStatus { OFF, OK, TIMEOUT, FAILURE } public static class FileMeta extends JavaScriptObject { public final native String name() /*-{ return this.name; }-*/; public final native String contentType() /*-{ return this.content_type; }-*/; public final native int lines() /*-{ return this.lines || 0 }-*/; public final native JsArray<WebLinkInfo> webLinks() /*-{ return this.web_links; }-*/; protected FileMeta() {} } public static class Region extends JavaScriptObject { public final native JsArrayString ab() /*-{ return this.ab; }-*/; public final native JsArrayString a() /*-{ return this.a; }-*/; public final native JsArrayString b() /*-{ return this.b; }-*/; public final native int skip() /*-{ return this.skip || 0; }-*/; public final native boolean common() /*-{ return this.common || false; }-*/; public final native JsArray<Span> editA() /*-{ return this.edit_a }-*/; public final native JsArray<Span> editB() /*-{ return this.edit_b }-*/; protected Region() {} } public static class Span extends JavaScriptObject { public final native int skip() /*-{ return this[0]; }-*/; public final native int mark() /*-{ return this[1]; }-*/; protected Span() {} } }