From 4cc313f6961bcf72e5b4892da89b61601fd09f67 Mon Sep 17 00:00:00 2001 From: Pouryafard75 Date: Fri, 5 Jul 2024 04:31:33 -0400 Subject: [PATCH] ASTDiff GUI: Beta version of SinglePageView --- .../java/gui/webdiff/DirectoryDiffView.java | 64 ++++-- .../java/gui/webdiff/MonacoDiffViewCore.java | 201 ++++++++++++++++++ src/main/java/gui/webdiff/MonacoPage.java | 192 ++--------------- src/main/java/gui/webdiff/SinglePageView.java | 78 +++---- src/main/java/gui/webdiff/WebDiff.java | 13 +- src/main/resources/web/dist/monaco.css | 5 + src/main/resources/web/dist/single.css | 9 + src/main/resources/web/dist/single.js | 21 ++ src/main/resources/web/dist/style.css | 9 +- 9 files changed, 338 insertions(+), 254 deletions(-) create mode 100644 src/main/java/gui/webdiff/MonacoDiffViewCore.java create mode 100644 src/main/resources/web/dist/single.css create mode 100644 src/main/resources/web/dist/single.js diff --git a/src/main/java/gui/webdiff/DirectoryDiffView.java b/src/main/java/gui/webdiff/DirectoryDiffView.java index d2009d3da..9cdf889bc 100644 --- a/src/main/java/gui/webdiff/DirectoryDiffView.java +++ b/src/main/java/gui/webdiff/DirectoryDiffView.java @@ -14,9 +14,16 @@ public class DirectoryDiffView implements Renderable { protected final DirComparator comparator; + private final boolean external; public DirectoryDiffView(DirComparator comparator) { this.comparator = comparator; + this.external = false; + } + + public DirectoryDiffView(DirComparator comparator, boolean external) { + this.comparator = comparator; + this.external = external; } protected boolean isMovedCode(TreeNodeInfo info) { @@ -37,14 +44,16 @@ public void renderOn(HtmlCanvas html) throws IOException { .html(lang("en")) .render(new Header()) .body() - .div(class_("container-fluid")) + .div(class_("container-fluid").style("padding: 0;")) .div(class_("row")) .render(new MenuBar()) ._div() - .div(class_("row justify-content-center")) - .button(class_("btn btn-primary col-6").style("height: 50px;").onClick("window.location.href='/singleView'")) - .content("Single Page View (Beta)") - ._div() + .if_(!external) + .div(class_("row justify-content-center")) + .button(class_("btn btn-primary col-6").style("height: 50px;").onClick("window.location.href='/singleView'")) + .content("Single Page View (Beta)") + ._div() + ._if() .div(class_("row mt-3 mb-3")) .div(class_("col")) .div(class_("card")) @@ -58,6 +67,7 @@ public void renderOn(HtmlCanvas html) throws IOException { ._div() ._div() ._div() + .if_(!external) .div(class_("row mb-3")) .div(class_("col")) .div(class_("card")) @@ -68,7 +78,7 @@ public void renderOn(HtmlCanvas html) throws IOException { ._h4() ._div() .render_if(new AddedOrDeletedFiles(comparator.getRemovedFilesName()), - comparator.getRemovedFilesName().size() > 0) + !comparator.getRemovedFilesName().isEmpty()) ._div() ._div() .div(class_("col")) @@ -80,10 +90,11 @@ public void renderOn(HtmlCanvas html) throws IOException { ._h4() ._div() .render_if(new AddedOrDeletedFiles(comparator.getAddedFilesName()), - comparator.getAddedFilesName().size() > 0) + !comparator.getAddedFilesName().isEmpty()) ._div() ._div() ._div() + ._if() ._div() ._body() ._html(); @@ -100,7 +111,6 @@ private void renderNode(HtmlCanvas ul, DefaultMutableTreeNode node) throws IOExc if (node == null) { return; } - // Start a list item for this node HtmlCanvas li = null; if (!node.isLeaf()) @@ -150,17 +160,23 @@ else if(isMovedCode(nodeInfo)) { } } ul.tr() - //.td().content(nodeInfo.getName()) - .td().a(href("/monaco-page/" + nodeInfo.getId())).img(src(iconPath).width(iconWidth).height(iconHeight)).write(" " + description)._a()._td() + .td(style("white-space: normal; word-wrap: break-word; word-break: break-all;")) + .a(href("/monaco-page/" + nodeInfo.getId())) + .img(src(iconPath).width(iconWidth).height(iconHeight)) + .write(" " + description) + ._a() + ._td() + .if_(!external) .td() .div(class_("btn-toolbar justify-content-end")) .div(class_("btn-group")) .a(class_("btn btn-primary btn-sm").href("/monaco-page/" + nodeInfo.getId())).content("MonacoDiff") .a(class_("btn btn-primary btn-sm").href("/vanilla-diff/" + nodeInfo.getId())).content("ClassicDiff") - ._div() - ._div() + ._div() // Close btn-group + ._div() // Close btn-toolbar ._td() - ._tr(); + ._if() + ._tr(); } else { li.summary().content(nodeInfo.getName()); @@ -216,18 +232,22 @@ private AddedOrDeletedFiles(Set files) { @Override public void renderOn(HtmlCanvas html) throws IOException { - HtmlCanvas tbody = html - .table(class_("table card-table table-striped table-condensed mb-0")) - .tbody(); + html + .div(class_("row")) + .div(class_("col-md-12")) + .table(class_("table card-table table-striped table-condensed mb-0")) + .tbody(); for (String filename : files) { - tbody - .tr() + html + .tr() .td().content(filename) - ._tr(); + ._tr(); } - tbody - ._tbody() - ._table(); + html + ._tbody() + ._table() + ._div() + ._div(); } } diff --git a/src/main/java/gui/webdiff/MonacoDiffViewCore.java b/src/main/java/gui/webdiff/MonacoDiffViewCore.java new file mode 100644 index 000000000..43eb611ae --- /dev/null +++ b/src/main/java/gui/webdiff/MonacoDiffViewCore.java @@ -0,0 +1,201 @@ +package gui.webdiff; + +import com.github.gumtreediff.actions.Diff; +import com.github.gumtreediff.actions.TreeClassifier; +import com.github.gumtreediff.matchers.MappingStore; +import com.github.gumtreediff.tree.Tree; +import org.refactoringminer.astDiff.actions.classifier.ExtendedTreeClassifier; +import org.refactoringminer.astDiff.actions.model.MultiMove; +import org.refactoringminer.astDiff.models.ASTDiff; +import org.rendersnake.HtmlCanvas; + +import java.io.IOException; + +import static org.rendersnake.HtmlAttributesFactory.class_; +import static org.rendersnake.HtmlAttributesFactory.id; + +/* Created by pourya on 2024-07-05*/ +public class MonacoDiffViewCore { + public MonacoDiffViewCore(Diff diff, int id) { + this.diff = diff; + this.id = id; + if (diff instanceof ASTDiff){ + this.srcFileName = ((ASTDiff) diff).getSrcPath(); + this.dstFileName = ((ASTDiff) diff).getDstPath(); + } + } + + private final Diff diff; + private final int id; + private String srcFileName; + private String dstFileName; + + void addDiffContainers(HtmlCanvas html) throws IOException { + html + .div(class_("row h-100")) + .div(class_("col-6 h-100")) + .h6().content(srcFileName) + .div(id("left-container").style("height: calc(100% - 80px); border:1px solid grey;"))._div() + ._div() + .div(class_("col-6 h-100")) + .h6().content(dstFileName) + .div(id("right-container").style("height: calc(100% - 80px); border:1px solid grey;"))._div() + ._div(); + } + + String getLeftJsConfig() { + if (diff instanceof ASTDiff) { + ExtendedTreeClassifier c = (ExtendedTreeClassifier) diff.createRootNodesClassifier(); + StringBuilder b = new StringBuilder(); + b.append("{"); + b.append("url:").append("\"/left/" + id + "\"").append(","); + b.append("ranges: ["); + for (Tree t : diff.src.getRoot().preOrder()) { + if (c.getMovedSrcs().contains(t)) + appendRange(b, t, "moved", null); + if (c.getUpdatedSrcs().contains(t)) + appendRange(b, t, "updated", null); + if (c.getDeletedSrcs().contains(t)) + appendRange(b, t, "deleted", null); + if (c.getSrcMoveOutTreeMap().containsKey(t)) + appendRange(b, t, "moveOut", c.getSrcMoveOutTreeMap().get(t).toString()); + if (c.getMultiMapSrc().containsKey(t)) { + String tag = "mm"; + boolean _isUpdated = ((MultiMove) (c.getMultiMapSrc().get(t))).isUpdated(); + if (_isUpdated) { + tag += " updOnTop"; + } + appendRange(b, t, tag, null); + } + } + b.append("]").append(","); + b.append("}"); + return b.toString(); + } + else { + TreeClassifier c = diff.createRootNodesClassifier(); + StringBuilder b = new StringBuilder(); + b.append("{"); + b.append("url:").append("\"/left/" + id + "\"").append(","); + b.append("ranges: ["); + for (Tree t: diff.src.getRoot().preOrder()) { + if (c.getMovedSrcs().contains(t)) + appendRange(b, t, "moved",""); + if (c.getUpdatedSrcs().contains(t)) + appendRange(b, t, "updated",""); + if (c.getDeletedSrcs().contains(t)) + appendRange(b, t, "deleted",""); + } + b.append("]").append(","); + b.append("}"); + return b.toString(); + } + } + + String getRightJsConfig() { + if (diff instanceof ASTDiff) { + ExtendedTreeClassifier c = (ExtendedTreeClassifier) diff.createRootNodesClassifier(); + StringBuilder b = new StringBuilder(); + b.append("{"); + b.append("url:").append("\"/right/" + id + "\"").append(","); + b.append("ranges: ["); + for (Tree t : diff.dst.getRoot().preOrder()) { + if (c.getMovedDsts().contains(t)) + appendRange(b, t, "moved", null); + if (c.getUpdatedDsts().contains(t)) + appendRange(b, t, "updated", null); + if (c.getInsertedDsts().contains(t)) + appendRange(b, t, "inserted", null); + if (c.getDstMoveInTreeMap().containsKey(t)) + appendRange(b, t, "moveIn", c.getDstMoveInTreeMap().get(t).toString()); + if (c.getMultiMapDst().containsKey(t)) { + String tag = "mm"; + boolean _isUpdated = ((MultiMove) (c.getMultiMapDst().get(t))).isUpdated(); + if (_isUpdated) { + tag += " updOnTop"; + } + appendRange(b, t, tag, null); + } + } + b.append("]").append(","); + b.append("}"); + return b.toString(); + } + else{ + TreeClassifier c = diff.createRootNodesClassifier(); + StringBuilder b = new StringBuilder(); + b.append("{"); + b.append("url:").append("\"/right/" + id + "\"").append(","); + b.append("ranges: ["); + for (Tree t: diff.dst.getRoot().preOrder()) { + if (c.getMovedDsts().contains(t)) + appendRange(b, t, "moved",""); + if (c.getUpdatedDsts().contains(t)) + appendRange(b, t, "updated",""); + if (c.getInsertedDsts().contains(t)) + appendRange(b, t, "inserted",""); + } + b.append("]").append(","); + b.append("}"); + return b.toString(); + } + } + + String getMappingsJsConfig() { + if (diff instanceof ASTDiff) { + ASTDiff astDiff = (ASTDiff) diff; + MappingStore monoMappingStore = astDiff.getAllMappings().getMonoMappingStore(); + ExtendedTreeClassifier c = (ExtendedTreeClassifier) diff.createRootNodesClassifier(); + StringBuilder b = new StringBuilder(); + b.append("["); + for (Tree t : diff.src.getRoot().preOrder()) { + if (c.getMovedSrcs().contains(t) || c.getUpdatedSrcs().contains(t)) { + Tree d = ((ASTDiff)diff).getAllMappings().getDsts(t).iterator().next(); + b.append(String.format("[%s, %s, %s, %s], ", t.getPos(), t.getEndPos(), d.getPos(), d.getEndPos())); + } + else { + if (monoMappingStore.isSrcMapped(t)) { + b.append(String.format("[%s, %s, %s, %s], ", + t.getPos(), + t.getEndPos(), + monoMappingStore.getDstForSrc(t).getPos(), + monoMappingStore.getDstForSrc(t).getEndPos())); + } + } + } + b.append("]").append(","); + return b.toString(); + } + else { + TreeClassifier c = diff.createRootNodesClassifier(); + StringBuilder b = new StringBuilder(); + b.append("["); + for (Tree t: diff.src.getRoot().preOrder()) { + if (c.getMovedSrcs().contains(t) || c.getUpdatedSrcs().contains(t)) { + + Tree d = diff.mappings.getDstForSrc(t); + b.append(String.format("[%s, %s, %s, %s], ", t.getPos(), t.getEndPos(), d.getPos(), d.getEndPos())); + } + } + b.append("]").append(","); + return b.toString(); + } + } + + private void appendRange(StringBuilder b, Tree t, String kind, String tip) { + String tooltip = tooltip(t); + if (tip != null) tooltip = tip; + b.append("{") + .append("from: ").append(t.getPos()) + .append(",").append("to: ").append(t.getEndPos()).append(",") + .append("index: ").append(t.getMetrics().depth).append(",") + .append("kind: ").append("\"" + kind + "\"").append(",") + .append("tooltip: ").append("\"" + tooltip + "\"").append(",") + .append("}").append(","); + } + + private static String tooltip(Tree t) { + return (t.getParent() != null) + ? t.getParent().getType() + "/" + t.getType() + "/" + t.getPos() + "/" + t.getEndPos() : t.getType().toString() + t.getPos() + t.getEndPos(); + } +} diff --git a/src/main/java/gui/webdiff/MonacoPage.java b/src/main/java/gui/webdiff/MonacoPage.java index a55132150..86e934149 100644 --- a/src/main/java/gui/webdiff/MonacoPage.java +++ b/src/main/java/gui/webdiff/MonacoPage.java @@ -1,12 +1,6 @@ package gui.webdiff; import com.github.gumtreediff.actions.Diff; -import com.github.gumtreediff.actions.TreeClassifier; -import com.github.gumtreediff.matchers.MappingStore; -import com.github.gumtreediff.tree.Tree; -import org.refactoringminer.astDiff.models.ASTDiff; -import org.refactoringminer.astDiff.actions.classifier.ExtendedTreeClassifier; -import org.refactoringminer.astDiff.actions.model.MultiMove; import org.rendersnake.DocType; import org.rendersnake.HtmlCanvas; import org.rendersnake.Renderable; @@ -16,18 +10,28 @@ import static org.rendersnake.HtmlAttributesFactory.*; public class MonacoPage extends AbstractDiffView implements Renderable { + final MonacoDiffViewCore core; + public MonacoPage(String toolName, String srcFileName, String dstFileName, Diff diff, int id, int numOfDiffs, String routePath, boolean isMovedDiff) { super(toolName, srcFileName, dstFileName, diff, id, numOfDiffs, routePath, isMovedDiff); + core = new MonacoDiffViewCore(diff, id); + } + boolean decorate = true; + + public void setDecorate(boolean decorate) { + this.decorate = decorate; } @Override public void renderOn(HtmlCanvas html) throws IOException { + html .render(DocType.HTML5) .html(lang("en").class_("h-100")) .render(new Header()) .body(class_("h-100").style("overflow: hidden;")) .div(class_("container-fluid h-100")) + .if_(decorate) .div(class_("row")) .render(new AbstractMenuBar(toolName, routePath, id, numOfDiffs, isMovedDiff){ @Override @@ -42,186 +46,20 @@ public String getLegendValue() { + "   updated
"; } }) - ._div(); - addDiffContainers(html); + ._div()._if(); + core.addDiffContainers(html); html ._div() ._div() - .macros().script("config = { moved: " + isMovedDiff + ", file: \"" + srcFileName + "\", left: " + getLeftJsConfig() - + ", right: " + getRightJsConfig() - + ", mappings: " + getMappingsJsConfig() + "};") + .macros().script("config = { moved: " + isMovedDiff + ", file: \"" + srcFileName + "\", left: " + core.getLeftJsConfig() + + ", right: " + core.getRightJsConfig() + + ", mappings: " + core.getMappingsJsConfig() + "};") .macros().javascript("/monaco/min/vs/loader.js") .macros().javascript("/dist/monaco.js") .macros().javascript("/dist/shortcuts.js") ._body() ._html(); } - - private void addDiffContainers(HtmlCanvas html) throws IOException { - html - .div(class_("row h-100")) - .div(class_("col-6 h-100")).h5().content(srcFileName) - .div(id("left-container").style("height: calc(100% - 80px); border:1px solid grey;"))._div() - ._div() - .div(class_("col-6 h-100")).h5().content(dstFileName) - .div(id("right-container").style("height: calc(100% - 80px); border:1px solid grey;"))._div() - ._div(); - } - - private String getLeftJsConfig() { - if (diff instanceof ASTDiff) { - ExtendedTreeClassifier c = (ExtendedTreeClassifier) diff.createRootNodesClassifier(); - StringBuilder b = new StringBuilder(); - b.append("{"); - b.append("url:").append("\"/left/" + id + "\"").append(","); - b.append("ranges: ["); - for (Tree t : diff.src.getRoot().preOrder()) { - if (c.getMovedSrcs().contains(t)) - appendRange(b, t, "moved", null); - if (c.getUpdatedSrcs().contains(t)) - appendRange(b, t, "updated", null); - if (c.getDeletedSrcs().contains(t)) - appendRange(b, t, "deleted", null); - if (c.getSrcMoveOutTreeMap().containsKey(t)) - appendRange(b, t, "moveOut", c.getSrcMoveOutTreeMap().get(t).toString()); - if (c.getMultiMapSrc().containsKey(t)) { - String tag = "mm"; - boolean _isUpdated = ((MultiMove) (c.getMultiMapSrc().get(t))).isUpdated(); - if (_isUpdated) { - tag += " updOnTop"; - } - appendRange(b, t, tag, null); - } - } - b.append("]").append(","); - b.append("}"); - return b.toString(); - } - else { - TreeClassifier c = diff.createRootNodesClassifier(); - StringBuilder b = new StringBuilder(); - b.append("{"); - b.append("url:").append("\"/left/" + id + "\"").append(","); - b.append("ranges: ["); - for (Tree t: diff.src.getRoot().preOrder()) { - if (c.getMovedSrcs().contains(t)) - appendRange(b, t, "moved",""); - if (c.getUpdatedSrcs().contains(t)) - appendRange(b, t, "updated",""); - if (c.getDeletedSrcs().contains(t)) - appendRange(b, t, "deleted",""); - } - b.append("]").append(","); - b.append("}"); - return b.toString(); - } - } - - private String getRightJsConfig() { - if (diff instanceof ASTDiff) { - ExtendedTreeClassifier c = (ExtendedTreeClassifier) diff.createRootNodesClassifier(); - StringBuilder b = new StringBuilder(); - b.append("{"); - b.append("url:").append("\"/right/" + id + "\"").append(","); - b.append("ranges: ["); - for (Tree t : diff.dst.getRoot().preOrder()) { - if (c.getMovedDsts().contains(t)) - appendRange(b, t, "moved", null); - if (c.getUpdatedDsts().contains(t)) - appendRange(b, t, "updated", null); - if (c.getInsertedDsts().contains(t)) - appendRange(b, t, "inserted", null); - if (c.getDstMoveInTreeMap().containsKey(t)) - appendRange(b, t, "moveIn", c.getDstMoveInTreeMap().get(t).toString()); - if (c.getMultiMapDst().containsKey(t)) { - String tag = "mm"; - boolean _isUpdated = ((MultiMove) (c.getMultiMapDst().get(t))).isUpdated(); - if (_isUpdated) { - tag += " updOnTop"; - } - appendRange(b, t, tag, null); - } - } - b.append("]").append(","); - b.append("}"); - return b.toString(); - } - else{ - TreeClassifier c = diff.createRootNodesClassifier(); - StringBuilder b = new StringBuilder(); - b.append("{"); - b.append("url:").append("\"/right/" + id + "\"").append(","); - b.append("ranges: ["); - for (Tree t: diff.dst.getRoot().preOrder()) { - if (c.getMovedDsts().contains(t)) - appendRange(b, t, "moved",""); - if (c.getUpdatedDsts().contains(t)) - appendRange(b, t, "updated",""); - if (c.getInsertedDsts().contains(t)) - appendRange(b, t, "inserted",""); - } - b.append("]").append(","); - b.append("}"); - return b.toString(); - } - } - - private String getMappingsJsConfig() { - if (diff instanceof ASTDiff) { - ASTDiff astDiff = (ASTDiff) diff; - MappingStore monoMappingStore = astDiff.getAllMappings().getMonoMappingStore(); - ExtendedTreeClassifier c = (ExtendedTreeClassifier) diff.createRootNodesClassifier(); - StringBuilder b = new StringBuilder(); - b.append("["); - for (Tree t : diff.src.getRoot().preOrder()) { - if (c.getMovedSrcs().contains(t) || c.getUpdatedSrcs().contains(t)) { - Tree d = ((ASTDiff)diff).getAllMappings().getDsts(t).iterator().next(); - b.append(String.format("[%s, %s, %s, %s], ", t.getPos(), t.getEndPos(), d.getPos(), d.getEndPos())); - } - else { - if (monoMappingStore.isSrcMapped(t)) { - b.append(String.format("[%s, %s, %s, %s], ", - t.getPos(), - t.getEndPos(), - monoMappingStore.getDstForSrc(t).getPos(), - monoMappingStore.getDstForSrc(t).getEndPos())); - } - } - } - b.append("]").append(","); - return b.toString(); - } - else { - TreeClassifier c = diff.createRootNodesClassifier(); - StringBuilder b = new StringBuilder(); - b.append("["); - for (Tree t: diff.src.getRoot().preOrder()) { - if (c.getMovedSrcs().contains(t) || c.getUpdatedSrcs().contains(t)) { - Tree d = diff.mappings.getDstForSrc(t); - b.append(String.format("[%s, %s, %s, %s], ", t.getPos(), t.getEndPos(), d.getPos(), d.getEndPos())); - } - } - b.append("]").append(","); - return b.toString(); - } - } - - private void appendRange(StringBuilder b, Tree t, String kind, String tip) { - String tooltip = tooltip(t); - if (tip != null) tooltip = tip; - b.append("{") - .append("from: ").append(t.getPos()) - .append(",").append("to: ").append(t.getEndPos()).append(",") - .append("index: ").append(t.getMetrics().depth).append(",") - .append("kind: ").append("\"" + kind + "\"").append(",") - .append("tooltip: ").append("\"" + tooltip + "\"").append(",") - .append("}").append(","); - } - - private static String tooltip(Tree t) { - return (t.getParent() != null) - ? t.getParent().getType() + "/" + t.getType() + "/" + t.getPos() + "/" + t.getEndPos() : t.getType().toString() + t.getPos() + t.getEndPos(); - } private static class Header implements Renderable { @Override public void renderOn(HtmlCanvas html) throws IOException { diff --git a/src/main/java/gui/webdiff/SinglePageView.java b/src/main/java/gui/webdiff/SinglePageView.java index fd1f323cf..dbd07176d 100644 --- a/src/main/java/gui/webdiff/SinglePageView.java +++ b/src/main/java/gui/webdiff/SinglePageView.java @@ -4,13 +4,6 @@ import org.rendersnake.DocType; import org.rendersnake.HtmlCanvas; import org.rendersnake.Renderable; -import spark.Response; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; import static org.rendersnake.HtmlAttributesFactory.*; @@ -26,15 +19,18 @@ public void renderOn(HtmlCanvas html) { int n = comparator.getNumOfDiffs(); try { html + .head() + .meta(charset("utf8")) + .meta(name("viewport").content("width=device-width, initial-scale=1.0")) + .macros().stylesheet("/dist/single.css") + ._head() .render(DocType.HTML5) .html(lang("en")).render(new Header()) .body() .div(class_("container-fluid")) .div(class_("row h-100")) - // DirDiffComperator 1/5 width .div(class_("col-2 bg-light dir-diff")) - .h3().content("DirDiffComperator") - // Content for DirDiffComperator (add your content here) + .render(new DirectoryDiffView(comparator, true)) ._div() // Monaco editors 4/5 width .div(class_("col-10 monaco-panel")) @@ -42,33 +38,27 @@ public void renderOn(HtmlCanvas html) { // Generate panels for /monaco-0 to /monaco-n for (int i = 0; i < n; i++) { -// int id = i; -// ASTDiff astDiff = comparator.getASTDiff(id); -// MonacoDiffView monacoDiffView = new MonacoDiffView( -// "", astDiff.getSrcPath(), astDiff.getDstPath(), -// astDiff, id, comparator.getNumOfDiffs(), "", -// comparator.isMoveDiff(id) -// ); - html.div(class_("card")) - .div(class_("card-header").id("heading-" + i)) - .h5(class_("mb-0")) - .button(class_("btn btn-link") - .data("toggle", "collapse") - .data("target", "#collapse-" + i) -// .aria("expanded", "false") // Initially false -// .aria("controls", "collapse-" + i) - ) - .content("Monaco Editor " + i) - ._h5() - ._div() +// .div(class_("card-header").id("heading-" + i)) +// .h5(class_("mb-0")) +// .button(class_("btn btn-link") +// .data("toggle", "collapse") +// .data("target", "#collapse-" + i) +//// .aria("expanded", "false") // Initially false +//// .aria("controls", "collapse-" + i) +// ) +// .content("Monaco Editor " + i) +// ._h5() +// ._div() .div(id("collapse-" + i) // .class_("collapse") // .aria("labelledby", "heading-" + i) .data("parent", "#accordion")) - .div(class_("card-body")) - .iframe(src("/monaco-page/" + i) - .style("width: 100%; height: 500px; border: none;")) + .div(class_("card-body").style("padding: 0;")) + +// html.render(monacoPage); + .iframe(src("/monaco-diff/" + i) + .style("width: 100%; height: 500px; border: none;")) ._iframe() ._div() ._div() @@ -80,7 +70,9 @@ public void renderOn(HtmlCanvas html) { ._div() // Close row div ._div(); // Close container-fluid div - html._body() + + html.macros().javascript("/dist/single.js") + ._body() ._html(); } catch (Exception e) { @@ -89,24 +81,4 @@ public void renderOn(HtmlCanvas html) { } } - - // Method to fetch content from a URL using HttpURLConnection - private String fetchContentFromUrl(String urlString) throws IOException { - URL url = new URL(urlString); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - conn.setRequestMethod("GET"); - - // Read the response into a StringBuilder - StringBuilder content = new StringBuilder(); - try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { - String line; - while ((line = in.readLine()) != null) { - content.append(line); - } - } finally { - conn.disconnect(); - } - - return content.toString(); - } } diff --git a/src/main/java/gui/webdiff/WebDiff.java b/src/main/java/gui/webdiff/WebDiff.java index 8bfd6b267..cc1b146a6 100644 --- a/src/main/java/gui/webdiff/WebDiff.java +++ b/src/main/java/gui/webdiff/WebDiff.java @@ -57,7 +57,7 @@ public void configureSpark(final DirComparator comparator, int port) { return ""; }); get("/list", (request, response) -> { - Renderable view = new DirectoryDiffView(comparator); + Renderable view = new DirectoryDiffView(comparator, false); return render(view); }); get("/vanilla-diff/:id", (request, response) -> { @@ -82,6 +82,17 @@ public void configureSpark(final DirComparator comparator, int port) { ); return render(view); }); + get("/monaco-diff/:id", (request, response) -> { + int id = Integer.parseInt(request.params(":id")); + ASTDiff astDiff = comparator.getASTDiff(id); + MonacoPage view = new MonacoPage( + toolName, astDiff.getSrcPath(), astDiff.getDstPath(), + astDiff, id, comparator.getNumOfDiffs(), request.pathInfo().split("/")[0], + comparator.isMoveDiff(id) + ); + view.setDecorate(false); + return render(view); + }); get("/left/:id", (request, response) -> { int id = Integer.parseInt(request.params(":id")); // String id = (request.params(":id")); diff --git a/src/main/resources/web/dist/monaco.css b/src/main/resources/web/dist/monaco.css index f297b9d1a..6936bb6d0 100644 --- a/src/main/resources/web/dist/monaco.css +++ b/src/main/resources/web/dist/monaco.css @@ -93,6 +93,11 @@ div { color: #666666 !important; border-color: #cccccc !important; } + +.row>* { + padding-right: 0; + padding-left: 0; +} /*.deleted {*/ /* background-color: IndianRed;*/ /*}*/ diff --git a/src/main/resources/web/dist/single.css b/src/main/resources/web/dist/single.css new file mode 100644 index 000000000..aeebd728d --- /dev/null +++ b/src/main/resources/web/dist/single.css @@ -0,0 +1,9 @@ +.monaco-panel { + overflow-y: auto; /* Enable scrollbar for Monaco panel */ + height: 100%; /* Ensure it fills the available height */ +} + +#accordion { + overflow-y: auto; /* Enable scrollbar for accordion */ + height: 100%; /* Ensure it fills the available height */ +} \ No newline at end of file diff --git a/src/main/resources/web/dist/single.js b/src/main/resources/web/dist/single.js new file mode 100644 index 000000000..f21e7fa1b --- /dev/null +++ b/src/main/resources/web/dist/single.js @@ -0,0 +1,21 @@ +$(document).ready(function() { + // Function to resize all iframes based on their content + console.log("single.js loaded"); + + function resizeAllIframes() { + console.log("resizeAllIframes"); + $('iframe').each(function() { + var iframe = this; + iframe.style.height = iframe.contentWindow.document.body.scrollHeight + 'px'; + }); + } + + // Call resizeAllIframes when each iframe is loaded and when the window is resized + $('iframe').on('load', function() { + resizeAllIframes(); + }); + + $(window).resize(function() { + resizeAllIframes(); + }); +}); diff --git a/src/main/resources/web/dist/style.css b/src/main/resources/web/dist/style.css index b8173cf6f..c4fe87a14 100644 --- a/src/main/resources/web/dist/style.css +++ b/src/main/resources/web/dist/style.css @@ -30,4 +30,11 @@ ul li { ul li:last-child { border-color : transparent; -} \ No newline at end of file +} +ul +{ + padding-inline-start: 1px; +} +.row>*{ + padding-right: 0; +}