org.apache.myfaces.custom.inputHtml.resource.kupuundo.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tomahawk12 Show documentation
Show all versions of tomahawk12 Show documentation
JSF components and utilities that can be used with any JSF implementation.
This library is based on the JSF1.1 version of Tomahawk, but with minor source code and build
changes to take advantage of JSF1.2 features. A JSF1.2 implementation is required to use this
version of the Tomahawk library.
The newest version!
/* Improved undo support for Kupu
This uses the 'diff-match-patch' library from Neil Fraser to make patches
between edits, and saves those patches in an undo buffer.
The diff-match-patch lib is distributed under terms of the LGPL license,
for more information see doc/LICENSE_DIFFMATCHPATH.txt.
For more information about the library itself, see
http://code.google.com/p/google-diff-match-patch/
*/
function KupuUndoTool() {
if (arguments.length) {
this._init.apply(this, arguments);
};
};
KupuUndoTool.prototype = new KupuTool;
KupuUndoTool.prototype._init =
function _init(undobuttonid, redobuttonid, maxbufsize) {
this.undobutton = document.getElementById(undobuttonid);
this.redobutton = document.getElementById(redobuttonid);
this._content = null;
this._buffer = [];
this._rev_buffer = [];
this._maximum_buffer_size = maxbufsize || 100;
};
KupuUndoTool.prototype.initialize = function initialize(editor) {
this.editor = editor;
addEventHandler(this.undobutton, 'click', this.undo, this);
addEventHandler(this.redobutton, 'click', this.redo, this);
this.dmp = new diff_match_patch();
this._content = this._get_content();
};
KupuUndoTool.prototype.updateState = function updateState(selNode, event) {
var new_content = this._get_content();
var patch = this.dmp.patch_make(new_content, this._content);
if (!patch.toString()) {
return;
};
var revpatch = this.dmp.patch_make(this._content, new_content);
this._buffer.push([patch, revpatch]);
this._rev_buffer = []; // discard redo information
this._content = new_content;
while (this._buffer.length > this._maximum_buffer_size) {
this._buffer.shift();
};
};
KupuUndoTool.prototype.undo = function undo() {
this.updateState();
var patchset = this._buffer.pop();
if (!patchset) {
return;
};
this._apply_patch(patchset[0]);
this._rev_buffer.push(patchset);
};
KupuUndoTool.prototype.redo = function redo() {
var patchset = this._rev_buffer.pop();
if (!patchset) {
return;
};
this._apply_patch(patchset[1]);
this._buffer.push(patchset);
};
KupuUndoTool.prototype._apply_patch = function _apply_patch(patch) {
var ret = this.dmp.patch_apply(patch, this._content);
var results = ret[1];
var failures = false;
for (var i=0; i < results.length; i++) {
if (!results[i]) {
failures = true;
break;
};
};
if (failures) {
throw('there were errors applying undo buffer patch! ' +
'cancelling undo action...');
};
var new_content = ret[0];
this._set_content(new_content);
this._content = new_content;
};
KupuUndoTool.prototype._get_content = function _get_content() {
var body = this.editor.document.document.getElementsByTagName('body')[0];
return body.innerHTML;
};
KupuUndoTool.prototype._set_content = function _set_content(content) {
var body = this.editor.document.document.getElementsByTagName('body')[0];
body.innerHTML = content;
};
KupuUndoTool.prototype.debug = function debug(msg) {
var body = document.getElementsByTagName('body')[0];
var div = document.createElement('div');
div.appendChild(document.createTextNode(msg));
body.appendChild(div);
div.style.border = '1px solid red';
};