You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
3.4 KiB

/*
* Released under BSD License
* Copyright (c) 2014-2015 hizzgdev@163.com
*
* Project Home:
* https://github.com/hizzgdev/jsmind/
*/
(function($w){
'use strict';
var $d = $w.document;
var __name__ = 'jsMind';
var jsMind = $w[__name__];
if(!jsMind){return;}
if(typeof(jsMind.shell)!='undefined'){return;}
var options = {
play_delay : 1000
};
jsMind.shell = function(jm){
this.jm = jm;
this.step = 0;
this.commands = []; //version
this.delay_handle = 0;
this.playing = false;
this.jm_editable = this.jm.get_editable();
};
jsMind.shell.prototype = {
init:function(){
this.playing = false;
},
record:function(action,obj){
if(!this.playing){
var command = {action:action,data:obj.data,node:obj.node};
var prev_command = this.commands[this.step-1];
if(command.action === 'update_node' && prev_command.action === 'add_node' && prev_command.data[2]==='New Node'){
prev_command.data[2] = command.data[1];
this.commands[this.step-1] = prev_command;
}else{
this.step = this.commands.push(command);
}
}
},
execute:function(command){
var func = this.jm[command.action];
var node = command.node;
this.jm.enable_edit();
func.apply(this.jm,command.data);
this.jm.disable_edit();
if(!!node){
this.jm.select_node(node);
}
},
add_command:function(command){
this.commands.push(command);
play();
},
replay:function(){
this.step = 0;
this.play();
},
play:function(){
this.jm.disable_edit();
this.playing = true;
this._play_stepbystep();
},
_play_stepbystep:function(){
if(this.delay_handle != 0){
$w.clearTimeout(this.delay_handle);
this.delay_handle = 0;
}
if(this.step<this.commands.length){
this.execute(this.commands[this.step]);
this.step ++;
var js = this;
this.delay_handle = $w.setTimeout(function(){
js.play.call(js);
},options.play_delay);
}else{
this._play_end();
}
},
_play_end:function(){
this.playing = false;
if(this.jm_editable){
this.jm.enable_edit();
}else{
this.jm.disable_edit();
}
},
jm_event_handle:function(type, data){
if(type === jsMind.event_type.show){
this.record('show',data);
}
if(type === jsMind.event_type.edit){
var action=data.evt;
delete data.evt;
this.record(action,data);
}
}
};
var shell_plugin = new jsMind.plugin('shell',function(jm){
var js = new jsMind.shell(jm);
jm.shell = js;
js.init();
jm.add_event_listener(function(type,data){
js.jm_event_handle.call(js,type,data);
});
});
jsMind.register_plugin(shell_plugin);
})(window);