package edu.purdue.pivot.skwiki.client.text; import java.util.ArrayList; import edu.purdue.pivot.skwiki.client.sketch.AttachedPanel; import edu.purdue.pivot.skwiki.shared.DataPack; import edu.purdue.pivot.skwiki.shared.Patch; import edu.purdue.pivot.skwiki.shared.TextPack; public class MyTextEditor extends RichTextEditor implements AttachedPanel { private String textEditorID = ""; String tag = "text"; private String nameHead = "Text"; private int textEditorNumber = 0; ArrayList<Patch> patches = new ArrayList<Patch>(); Patch tempPatch = new Patch(); String oldHtml = ""; public MyTextEditor(String uuid, String uid) { super(uuid, uid); textEditorID = uuid; } public MyTextEditor(String uuid, String uid, float scaleWidth, float scaleHeight) { super(uuid, uid, scaleWidth, scaleHeight); textEditorID = uuid; } public void commitOnSuccess(TextPack returnPack) { this.oldHtml = returnPack.updateHtml; } public void updateEditor(DataPack data) { String key = textEditorID; TextPack tempPack = (TextPack) data.updateHtmlMap.get(key); patches.clear(); for (Patch tempPatch : tempPack.patches) { patches.add(tempPatch); } String updateText = patch_apply(); oldHtml = updateText; setHtml(updateText); tag = data.textTaglMap.get(key); } public void newTempPatch() { tempPatch = new Patch(); } public void addDiffToTempPatch(int operation, String text) { tempPatch.addDiff(operation, text); } private void addTempPatchToPatches() { patches.add(tempPatch); } public void getChange(DataPack pack) { String key = textEditorID; diff_main(oldHtml, getHtml()); TextPack returnPack = new TextPack(); returnPack.addPatch(tempPatch); returnPack.updateHtml = getHtml(); pack.updateHtmlMap.put(key, returnPack); pack.textTaglMap.put(key, tag); } public int getSize() { return patches.size(); } public int getDiffs_size(int patchIndex) { return patches.get(patchIndex).diffs.size(); } public String getDiffText(int patchIndex, int diffIndex) { return patches.get(patchIndex).diffs.get(diffIndex).text; } public int getDiffOperation(int patchIndex, int diffIndex) { return patches.get(patchIndex).diffs.get(diffIndex).operation; } private native String patch_apply() /*-{ var dmp = new $wnd.diff_match_patch(); var patches = new Array(); for ( var i = 0; i < this.@edu.purdue.pivot.skwiki.client.text.MyTextEditor::getSize()(); i++) { var tempPatch = new $wnd.diff_match_patch.patch_obj(); for ( var j = 0; j < this.@edu.purdue.pivot.skwiki.client.text.MyTextEditor::getDiffs_size(I)(i); j++) { var text = this.@edu.purdue.pivot.skwiki.client.text.MyTextEditor::getDiffText(II)(i,j); var operation = this.@edu.purdue.pivot.skwiki.client.text.MyTextEditor::getDiffOperation(II)(i,j); var diff = [ operation, text ] tempPatch.diffs[j] = diff; } patches[i] = tempPatch } var returnText = dmp.patch_apply(patches, ''); return returnText[0]; }-*/; private native void diff_main(String text1, String text2) /*-{ var dmp = new $wnd.diff_match_patch(); var instance = this; var result = dmp.diff_main(text1, text2, false) instance.@edu.purdue.pivot.skwiki.client.text.MyTextEditor::newTempPatch()(); for(var i= 0; i < result.length; i++) { //$wnd.alert(result[i]+" "+text1+" "+text2); this.@edu.purdue.pivot.skwiki.client.text.MyTextEditor::addDiffToTempPatch(ILjava/lang/String;)((result[i])[0], (result[i])[1]); } this.@edu.purdue.pivot.skwiki.client.text.MyTextEditor::addTempPatchToPatches()(); var size = instance.@edu.purdue.pivot.skwiki.client.text.MyTextEditor::getSize()(); //$wnd.alert(size); }-*/; public String getEditorKey() { return textEditorID; } @Override public String getID() { return getEditorKey(); } @Override public String toString() { return textEditorID; } }