Skip to content

Commit

Permalink
Don't show arrows on not compared items & fix undoing file diff opera…
Browse files Browse the repository at this point in the history
…tions (#164)

* Don't show merge arrows if not compared

* Make ctrl+z return initial state

* Fix apply change issues
  • Loading branch information
pertsevpv authored Nov 7, 2024
1 parent 918aefb commit 531512a
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 22 deletions.
49 changes: 33 additions & 16 deletions demo-edit/src/main/java/org/sudu/experiments/editor/Document.java
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ public void concatLines(int caretLine) {
}

private void concatLinesOp(int caretLine) {
if (caretLine + 1 >= length()) return;
CodeLine newLine = CodeLine.concat(document[caretLine], document[caretLine + 1]);
deleteLineOp(caretLine);
document[caretLine] = newLine;
Expand All @@ -155,8 +156,18 @@ public void deleteLine(int caretLine) {
}

public void applyChange(int fromLine, int toLine, CodeLine[] newLines) {
deleteLines(fromLine, toLine);
if (newLines.length == 0) return;
Diff deleteDiff = deleteLines(fromLine, toLine);
if (newLines.length == 0) {
if (deleteDiff != null) diffs.add(ArrayOp.array(deleteDiff));
currentVersion++;
return;
}

String inserted = Arrays.stream(newLines)
.map(CodeLine::makeString)
.collect(Collectors.joining("\n", "", fromLine == length() ? "" : "\n"));
Diff insertDiff = new Diff(fromLine, 0, false, inserted);
makeDiffOp(insertDiff);

CodeLine[] newDocument = new CodeLine[document.length + newLines.length];
System.arraycopy(document, 0, newDocument, 0, fromLine);
Expand All @@ -165,15 +176,17 @@ public void applyChange(int fromLine, int toLine, CodeLine[] newLines) {

this.document = newDocument;

String inserted = Arrays.stream(newLines)
.map(CodeLine::makeString)
.collect(Collectors.joining("\n", "", "\n"));
Diff diff = new Diff(fromLine, 0, false, inserted);
makeDiff(diff);
var changeDiffs = deleteDiff == null
? ArrayOp.array(insertDiff)
: ArrayOp.array(insertDiff, deleteDiff);
diffs.add(changeDiffs);
currentVersion++;
}

public CodeLine[] getLines(int fromLine, int toLine) {
return Arrays.copyOfRange(document, fromLine, toLine);
return Arrays.stream(Arrays.copyOfRange(document, fromLine, toLine))
.map(line -> new CodeLine(line.makeString()))
.toArray(CodeLine[]::new);
}

public String copyLine(int caretLine) {
Expand All @@ -187,14 +200,18 @@ private void deleteLineOp(int caretLine) {
document = doc;
}

public void deleteLines(int fromLine, int toLine) {
if (fromLine >= toLine) return;
public Diff deleteLines(int fromLine, int toLine) {
if (fromLine >= toLine) return null;
StringBuilder deletedSB = new StringBuilder();
if (fromLine != 0) deletedSB.append(newLine);
deletedSB.append(new String(getChars(fromLine, toLine)));
if (toLine == length()) deletedSB.append(newLine);
Diff diff = new Diff(fromLine, 0, true, deletedSB.toString());
if (toLine != length()) deletedSB.deleteCharAt(deletedSB.length() - 1);
int deleteLine = fromLine != 0 ? fromLine - 1 : fromLine;
int deletePos = fromLine != 0 ? line(fromLine - 1).totalStrLength : 0;
Diff diff = new Diff(deleteLine, deletePos, true, deletedSB.toString());
deleteLinesOp(fromLine, toLine);
makeDiff(diff);
makeDiffOp(diff);
return diff;
}

private void deleteLinesOp(int fromLine, int toLine) {
Expand Down Expand Up @@ -307,7 +324,7 @@ private void deleteSelectedOp(Selection selection) {
document[leftPos.line].delete(leftPos.charInd, rightPos.charInd);
} else {
document[leftPos.line].delete(leftPos.charInd);
document[rightPos.line].delete(0, rightPos.charInd);
if (rightPos.charInd != 0) document[rightPos.line].delete(0, rightPos.charInd);
deleteLinesOp(leftPos.line + 1, rightPos.line);
concatLinesOp(leftPos.line);
}
Expand Down Expand Up @@ -609,7 +626,7 @@ public void onResolve(int[] resolveInts, boolean highlightErrors) {
}
}

private void onDiffMade(Diff diff, boolean isDelete) {
if (this.onDiffMade != null) onDiffMade.accept(diff, isDelete);
private void onDiffMade(Diff diff, boolean isUndo) {
if (this.onDiffMade != null) onDiffMade.accept(diff, isUndo);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,17 @@ public static MergeButtonsModel[] getFolderModels(

if (!rightReadonly) {
int n = 0;
for (var line: diffInfo.lineDiffsL) if (line.type != DiffTypes.DEFAULT) n++;
for (int i = 0; i < diffInfo.lineDiffsL.length; i++) {
var line = diffInfo.lineDiffsL[i];
var model = leftDiffs[i];
if (line.type != DiffTypes.DEFAULT && model.isCompared()) n++;
}
left = new MergeButtonsModel(n);
for (int lineInd = 0, modelInd = 0; lineInd < diffInfo.lineDiffsL.length; lineInd++) {
var leftLine = diffInfo.lineDiffsL[lineInd];
if (leftLine.type == DiffTypes.DEFAULT) continue;
left.lines[modelInd] = line(lineInd, diffInfo.lineDiffsL.length);
var leftModel = leftDiffs[lineInd];
if (leftLine.type == DiffTypes.DEFAULT || !leftModel.isCompared()) continue;
left.lines[modelInd] = line(lineInd, diffInfo.lineDiffsL.length);
left.actions[modelInd] = () -> applyDiff(leftModel, true, applyDiff);
leftColors[lineInd] = (byte) diffInfo.lineDiffsL[lineInd].type; //DiffTypes.FOLDER_ALIGN_DIFF_TYPE;
modelInd++;
Expand All @@ -76,13 +80,17 @@ public static MergeButtonsModel[] getFolderModels(

if (!leftReadonly) {
int m = 0;
for (var line: diffInfo.lineDiffsR) if (line.type != DiffTypes.DEFAULT) m++;
for (int i = 0; i < diffInfo.lineDiffsR.length; i++) {
var line = diffInfo.lineDiffsR[i];
var model = rightDiffs[i];
if (line.type != DiffTypes.DEFAULT && model.isCompared()) m++;
}
right = new MergeButtonsModel(m);
for (int lineInd = 0, modelInd = 0; lineInd < diffInfo.lineDiffsR.length; lineInd++) {
var rightLine = diffInfo.lineDiffsR[lineInd];
if (rightLine.type == DiffTypes.DEFAULT) continue;
right.lines[modelInd] = line(lineInd, diffInfo.lineDiffsR.length);
var rightModel = rightDiffs[lineInd];
if (rightLine.type == DiffTypes.DEFAULT || !rightModel.isCompared()) continue;
right.lines[modelInd] = line(lineInd, diffInfo.lineDiffsR.length);
right.actions[modelInd] = () -> applyDiff(rightModel, false, applyDiff);
rightColors[lineInd] = (byte) diffInfo.lineDiffsR[lineInd].type; //DiffTypes.FOLDER_ALIGN_DIFF_TYPE;
modelInd++;
Expand Down

0 comments on commit 531512a

Please sign in to comment.