From 7b33c045ddb7c16317ec9c84c418776973f6d287 Mon Sep 17 00:00:00 2001 From: pertsevpv Date: Mon, 9 Dec 2024 17:11:32 +0300 Subject: [PATCH 1/3] Fix Folders disappear after refresh --- .../diff/RemoteFolderDiffWindow.java | 6 ++-- .../protocol/FrontendTreeNode.java | 4 ++- .../experiments/update/RemoteCollector.java | 35 ++++++++++++++----- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/demo-edit-es-module/src/main/java/org/sudu/experiments/diff/RemoteFolderDiffWindow.java b/demo-edit-es-module/src/main/java/org/sudu/experiments/diff/RemoteFolderDiffWindow.java index ca579f571..337746288 100644 --- a/demo-edit-es-module/src/main/java/org/sudu/experiments/diff/RemoteFolderDiffWindow.java +++ b/demo-edit-es-module/src/main/java/org/sudu/experiments/diff/RemoteFolderDiffWindow.java @@ -202,7 +202,7 @@ private void onFiltersApplied(JsArray jsResult) { private void onRefresh(JsArray jsResult) { var msg = BackendMessage.deserialize(jsResult); - lastSendFrontendMsg.openedFolders.updateWithModel(msg.root); + lastSendFrontendMsg.openedFolders.updateDeepWithModel(msg.root); } private void updateNodes() { @@ -228,7 +228,9 @@ private void updateNodes( RemoteFolderDiffModel model, FrontendTreeNode treeNode ) { - if (model.children == null || treeNode == null || !treeNode.isOpened()) return; + if (model == null || model.children == null || + treeNode == null || !treeNode.isOpened() + ) return; left.doOpen(); right.doOpen(); diff --git a/filediff-node-module/src/main/java/org/sudu/experiments/protocol/FrontendTreeNode.java b/filediff-node-module/src/main/java/org/sudu/experiments/protocol/FrontendTreeNode.java index 710154aa5..84a3f815c 100644 --- a/filediff-node-module/src/main/java/org/sudu/experiments/protocol/FrontendTreeNode.java +++ b/filediff-node-module/src/main/java/org/sudu/experiments/protocol/FrontendTreeNode.java @@ -38,6 +38,8 @@ public void updateDeepWithModel(RemoteFolderDiffModel model) { var nodeChild = child(i, modelChild.path, modelChild.isFile()); if (nodeChild == null) { nodeChild = new FrontendTreeNode(); + nodeChild.name = modelChild.path; + nodeChild.isFile = modelChild.isFile(); } else { nodeChild.updateDeepWithModel(modelChild); } @@ -93,7 +95,7 @@ public void deleteItem(FrontendTreeNode node) { } public FrontendTreeNode child(int i, String path, boolean isFile) { - if (0 < i && i < children.length) { + if (0 <= i && i < children.length) { var child = children[i]; if (child.name.equals(path) && child.isFile == isFile) return child; } diff --git a/filediff-node-module/src/main/java/org/sudu/experiments/update/RemoteCollector.java b/filediff-node-module/src/main/java/org/sudu/experiments/update/RemoteCollector.java index db8ad7b3a..c2f838498 100644 --- a/filediff-node-module/src/main/java/org/sudu/experiments/update/RemoteCollector.java +++ b/filediff-node-module/src/main/java/org/sudu/experiments/update/RemoteCollector.java @@ -5,6 +5,7 @@ import org.sudu.experiments.arrays.ArrayWriter; import org.sudu.experiments.diff.DiffTypes; import org.sudu.experiments.diff.SizeScanner; +import org.sudu.experiments.diff.folder.FolderDiffModel; import org.sudu.experiments.diff.folder.ItemFolderDiffModel; import org.sudu.experiments.diff.folder.RemoteFolderDiffModel; import org.sudu.experiments.editor.worker.ArgsCast; @@ -80,12 +81,11 @@ public void beginCompare() { public void refresh() { LoggingJs.info("RemoteCollector.Refresh"); - var items = root.items; firstMessageSent = lastMessageSent = false; isRefresh = true; startTime = lastMessageSentTime = Performance.now(); - root = new ItemFolderDiffModel(null, ""); - root.setItems(items[0], items[1]); + root.setCompared(false); + root.childrenComparedCnt = 0; sendToWorkerQueue.clear(); beginCompare(); } @@ -233,6 +233,21 @@ private void onError(String error) { LoggingJs.error(error); } + private ItemFolderDiffModel oldOrNull( + FolderDiffModel[] oldChildren, + ItemFolderDiffModel parent, + FsItem item + ) { + String path = item.getName(); + boolean isFile = item instanceof FileHandle; + if (oldChildren == null) return new ItemFolderDiffModel(parent, path); + for (var oldChild: oldChildren) + if (oldChild instanceof ItemFolderDiffModel itemChild && + path.equals(itemChild.path) && isFile == itemChild.isFile() + ) return itemChild; + return new ItemFolderDiffModel(parent, path); + } + private void compare(ItemFolderDiffModel model) { ++inComparing; if (model.left() instanceof DirectoryHandle leftDir && @@ -275,8 +290,9 @@ private void onFoldersCompared( FsItem[] rightItem = Arrays.copyOfRange(result, 1 + leftLen, 1 + leftLen + rightLen, FsItem[].class); int len = diffs.length; - model.children = new ItemFolderDiffModel[len]; + var oldChildren = model.children; model.childrenComparedCnt = 0; + model.children = new ItemFolderDiffModel[len]; int lP = 0, rP = 0; int mP = 0; @@ -286,7 +302,8 @@ private void onFoldersCompared( int kind = kinds[mP]; if (diffs[mP] == DiffTypes.DELETED) { edited = true; - model.children[mP] = new ItemFolderDiffModel(model, leftItem[lP].getName()); + model.children[mP] = oldOrNull(oldChildren, model, leftItem[lP]); + model.child(mP).setCompared(false); model.child(mP).posInParent = mP; model.child(mP).setItemKind(kind); model.child(mP).setDiffType(DiffTypes.DELETED); @@ -296,7 +313,8 @@ private void onFoldersCompared( lP++; } else if (diffs[mP] == DiffTypes.INSERTED) { edited = true; - model.children[mP] = new ItemFolderDiffModel(model, rightItem[rP].getName()); + model.children[mP] = oldOrNull(oldChildren, model, rightItem[rP]); + model.child(mP).setCompared(false); model.child(mP).posInParent = mP; model.child(mP).setItemKind(kind); model.child(mP).setDiffType(DiffTypes.INSERTED); @@ -305,7 +323,8 @@ private void onFoldersCompared( mP++; rP++; } else { - model.children[mP] = new ItemFolderDiffModel(model, leftItem[lP].getName()); + model.children[mP] = oldOrNull(oldChildren, model, leftItem[lP]); + model.child(mP).setCompared(false); model.child(mP).posInParent = mP; model.child(mP).setItemKind(kind); model.child(mP).setItems(leftItem[lP], rightItem[rP]); @@ -397,7 +416,7 @@ private void onFolderRead( private void onItemCompared() { if (--inComparing < 0) throw new IllegalStateException("inComparing cannot be negative"); - if (--sentToWorker < 0) throw new IllegalStateException("inComparing cannot be negative"); + if (--sentToWorker < 0) throw new IllegalStateException("sentToWorker cannot be negative"); if (isShutdown) shutdown(); else if (inComparing == 0) onComplete(); else { From 7cd398c1a24c974849c02bf2ea333dada63d0019 Mon Sep 17 00:00:00 2001 From: pertsevpv Date: Thu, 12 Dec 2024 15:57:10 +0300 Subject: [PATCH 2/3] Fix Folders don't expand --- .../org/sudu/experiments/diff/RemoteFolderDiffWindow.java | 2 ++ .../org/sudu/experiments/protocol/FrontendTreeNode.java | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/demo-edit-es-module/src/main/java/org/sudu/experiments/diff/RemoteFolderDiffWindow.java b/demo-edit-es-module/src/main/java/org/sudu/experiments/diff/RemoteFolderDiffWindow.java index 337746288..ce470f93c 100644 --- a/demo-edit-es-module/src/main/java/org/sudu/experiments/diff/RemoteFolderDiffWindow.java +++ b/demo-edit-es-module/src/main/java/org/sudu/experiments/diff/RemoteFolderDiffWindow.java @@ -234,6 +234,7 @@ private void updateNodes( left.doOpen(); right.doOpen(); + if (treeNode.children.length != model.children.length) treeNode.updateWithModel(model); int lp = 0, rp = 0; for (int i = 0; i < model.children.length; i++) { var child = model.child(i); @@ -262,6 +263,7 @@ private void updateNode( if (model.children == null || treeNode == null || !treeNode.isOpened()) return; node.doOpen(); + if (treeNode.children.length != model.children.length) treeNode.updateWithModel(model); for (int i = 0; i < model.children.length; i++) { var child = model.child(i); var childNode = treeNode.child(i, child.path, child.isFile()); diff --git a/filediff-node-module/src/main/java/org/sudu/experiments/protocol/FrontendTreeNode.java b/filediff-node-module/src/main/java/org/sudu/experiments/protocol/FrontendTreeNode.java index 84a3f815c..b27289193 100644 --- a/filediff-node-module/src/main/java/org/sudu/experiments/protocol/FrontendTreeNode.java +++ b/filediff-node-module/src/main/java/org/sudu/experiments/protocol/FrontendTreeNode.java @@ -55,7 +55,11 @@ public void updateWithModel(RemoteFolderDiffModel model) { for (int i = 0; i < model.children.length; i++) { var modelChild = model.child(i); var nodeChild = child(i, modelChild.path, modelChild.isFile()); - if (nodeChild == null) nodeChild = new FrontendTreeNode(); + if (nodeChild == null) { + nodeChild = new FrontendTreeNode(); + nodeChild.name = modelChild.path; + nodeChild.isFile = modelChild.isFile(); + } newChildren[i] = nodeChild; } children = newChildren; From 0813d85a8069c5842f1625bf9f8961bfd521b189 Mon Sep 17 00:00:00 2001 From: pertsevpv Date: Thu, 12 Dec 2024 16:40:39 +0300 Subject: [PATCH 3/3] Reworked line diff --- .../editor/worker/diff/DiffUtils.java | 32 +++++++++++-------- .../experiments/editor/DiffModelTest.java | 4 +-- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/demo-edit/src/main/java/org/sudu/experiments/editor/worker/diff/DiffUtils.java b/demo-edit/src/main/java/org/sudu/experiments/editor/worker/diff/DiffUtils.java index 7b8b6c66d..96fad5db8 100644 --- a/demo-edit/src/main/java/org/sudu/experiments/editor/worker/diff/DiffUtils.java +++ b/demo-edit/src/main/java/org/sudu/experiments/editor/worker/diff/DiffUtils.java @@ -95,26 +95,32 @@ public static void rereadFolder( leftReader.beginRead(); } - public static int[] makeIntervals(Document document, int fromLine, int toLine) { + public static int[] makeIntervals(Document document, int fromLine, int toLine, boolean cmpOnlyLines) { ArrayWriter writer = new ArrayWriter(); writer.write(toLine - fromLine); int offset = 0; for (int i = fromLine; i < toLine; i++) { CodeLine line = document.line(i); - int Mi = line.length(); - writer.write(Mi); - for (int j = 0; j < Mi; j++) { - var elem = line.get(j); - writer.write(offset, elem.length()); - offset += elem.length(); + if (cmpOnlyLines) { + writer.write(1); + writer.write(offset, line.totalStrLength); + offset += line.totalStrLength; + } else { + int Mi = line.length(); + writer.write(Mi); + for (int j = 0; j < Mi; j++) { + var elem = line.get(j); + writer.write(offset, elem.length()); + offset += elem.length(); + } } offset++; } return writer.getInts(); } - public static int[] makeIntervals(Document document) { - return makeIntervals(document, 0, document.length()); + public static int[] makeIntervals(Document document, boolean cmpOnlyLines) { + return makeIntervals(document, 0, document.length(), cmpOnlyLines); } public static DiffInfo readDiffInfo(int[] ints) { @@ -197,8 +203,8 @@ public static void findDiffs( ) { char[] chars1 = document1.getChars(); char[] chars2 = document2.getChars(); - int[] intervals1 = makeIntervals(document1); - int[] intervals2 = makeIntervals(document2); + int[] intervals1 = makeIntervals(document1, cmpOnlyLines); + int[] intervals2 = makeIntervals(document2, cmpOnlyLines); window.sendToWorker(true, r -> { @@ -219,8 +225,8 @@ public static void findIntervalDiffs( ) { char[] chars1 = document1.getChars(fromL, toL); char[] chars2 = document2.getChars(fromR, toR); - int[] intervals1 = makeIntervals(document1, fromL, toL); - int[] intervals2 = makeIntervals(document2, fromR, toR); + int[] intervals1 = makeIntervals(document1, fromL, toL, false); + int[] intervals2 = makeIntervals(document2, fromR, toR, false); window.sendToWorker(true, r -> { int[] reply = ((ArrayView) r[0]).ints(); diff --git a/demo-edit/src/test/java/org/sudu/experiments/editor/DiffModelTest.java b/demo-edit/src/test/java/org/sudu/experiments/editor/DiffModelTest.java index a327c0693..512ab27a2 100644 --- a/demo-edit/src/test/java/org/sudu/experiments/editor/DiffModelTest.java +++ b/demo-edit/src/test/java/org/sudu/experiments/editor/DiffModelTest.java @@ -29,9 +29,9 @@ public void compareDocuments(boolean printResults) { DiffModel model = new DiffModel(); char[] charsL = docL.getChars(); - int[] intsL = DiffUtils.makeIntervals(docL); + int[] intsL = DiffUtils.makeIntervals(docL, true); char[] charsR = docR.getChars(); - int[] intsR = DiffUtils.makeIntervals(docR); + int[] intsR = DiffUtils.makeIntervals(docR, true); int[] res = model.findDiffs(charsL, intsL, charsR, intsR);