165 lines
5.2 KiB
JavaScript
165 lines
5.2 KiB
JavaScript
/** @license
|
|
jSignature v2 jSignature's Undo Button and undo functionality plugin
|
|
|
|
*/
|
|
/**
|
|
Copyright (c) 2011 Willow Systems Corp http://willow-systems.com
|
|
MIT License <http://www.opensource.org/licenses/mit-license.php>
|
|
*/
|
|
|
|
;(function(){
|
|
|
|
var apinamespace = 'jSignature'
|
|
|
|
function attachHandlers(buttonRenderer, apinamespace, extensionName) {
|
|
var $undoButton = buttonRenderer.call(this)
|
|
|
|
;(function(jSignatureInstance, $undoButton, apinamespace) {
|
|
jSignatureInstance.events.subscribe(
|
|
apinamespace + '.change'
|
|
, function(){
|
|
if (jSignatureInstance.dataEngine.data.length) {
|
|
$undoButton.show()
|
|
} else {
|
|
$undoButton.hide()
|
|
}
|
|
}
|
|
)
|
|
})( this, $undoButton, apinamespace )
|
|
|
|
;(function(jSignatureInstance, $undoButton, apinamespace) {
|
|
|
|
var eventName = apinamespace + '.undo'
|
|
|
|
$undoButton.bind('click', function(){
|
|
jSignatureInstance.events.publish(eventName)
|
|
})
|
|
|
|
// This one creates new "undo" event listener to jSignature instance
|
|
// It handles the actual undo-ing.
|
|
jSignatureInstance.events.subscribe(
|
|
eventName
|
|
, function(){
|
|
var data = jSignatureInstance.dataEngine.data
|
|
if (data.length) {
|
|
data.pop()
|
|
jSignatureInstance.resetCanvas(data)
|
|
}
|
|
}
|
|
)
|
|
})(
|
|
this
|
|
, $undoButton
|
|
, this.events.topics.hasOwnProperty( apinamespace + '.undo' ) ?
|
|
// oops, seems some other plugin or code has already claimed "jSignature.undo" event
|
|
// we will use this extension's name for event name prefix
|
|
extensionName :
|
|
// Great! we will use 'jSignature' for event name prefix.
|
|
apinamespace
|
|
)
|
|
}
|
|
|
|
function ExtensionInitializer(extensionName){
|
|
// we are called very early in instance's life.
|
|
// right after the settings are resolved and
|
|
// jSignatureInstance.events is created
|
|
// and right before first ("jSignature.initializing") event is called.
|
|
// You don't really need to manupilate
|
|
// jSignatureInstance directly, just attach
|
|
// a bunch of events to jSignatureInstance.events
|
|
// (look at the source of jSignatureClass to see when these fire)
|
|
// and your special pieces of code will attach by themselves.
|
|
|
|
// this function runs every time a new instance is set up.
|
|
// this means every var you create will live only for one instance
|
|
// unless you attach it to something outside, like "window."
|
|
// and pick it up later from there.
|
|
|
|
// when globalEvents' events fire, 'this' is globalEvents object
|
|
// when jSignatureInstance's events fire, 'this' is jSignatureInstance
|
|
|
|
// Here,
|
|
// this = is new jSignatureClass's instance.
|
|
|
|
// The way you COULD approch setting this up is:
|
|
// if you have multistep set up, attach event to "jSignature.initializing"
|
|
// that attaches other events to be fired further lower the init stream.
|
|
// Or, if you know for sure you rely on only one jSignatureInstance's event,
|
|
// just attach to it directly
|
|
|
|
var apinamespace = 'jSignature'
|
|
|
|
this.events.subscribe(
|
|
// name of the event
|
|
apinamespace + '.attachingEventHandlers'
|
|
// event handlers, can pass args too, but in majority of cases,
|
|
// 'this' which is jSignatureClass object instance pointer is enough to get by.
|
|
, function(){
|
|
|
|
// hooking up "undo" button to lower edge of Canvas.
|
|
// but only when options passed to jSignature('init', options)
|
|
// contain "undoButton":renderingFunction pair.
|
|
// or "undoButton":true (in which case default, internal rendering fn is used)
|
|
if (this.settings[extensionName]) {
|
|
var oursettings = this.settings[extensionName]
|
|
if (typeof oursettings !== 'function') {
|
|
// we make it a function.
|
|
|
|
// we allow people to override the button rendering code,
|
|
// but when developler is OK with default look (and just passes "truthy" value)
|
|
// this defines default look for the button:
|
|
// centered against canvas, hanging on its lower side.
|
|
oursettings = function(){
|
|
// this === jSignatureInstance
|
|
var undoButtonSytle = 'position:absolute;display:none;margin:0 !important;top:auto'
|
|
, $undoButton = $('<input type="button" value="撤销" style="'+undoButtonSytle+'" />')
|
|
.appendTo(this.$controlbarLower)
|
|
|
|
// this centers the button against the canvas.
|
|
var buttonWidth = $undoButton.width()
|
|
$undoButton.css(
|
|
'left'
|
|
, Math.round(( this.canvas.width - buttonWidth ) / 2)
|
|
)
|
|
// IE 7 grows the button. Correcting for that.
|
|
if ( buttonWidth !== $undoButton.width() ) {
|
|
$undoButton.width(buttonWidth)
|
|
}
|
|
|
|
return $undoButton
|
|
}
|
|
}
|
|
|
|
attachHandlers.call(
|
|
this
|
|
, oursettings
|
|
, apinamespace
|
|
, extensionName
|
|
)
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
var ExtensionAttacher = function(){
|
|
$.fn[apinamespace](
|
|
'addPlugin'
|
|
,'instance' // type of plugin
|
|
,'UndoButton' // extension name
|
|
,ExtensionInitializer
|
|
)
|
|
}
|
|
|
|
|
|
// //Because plugins are minified together with jSignature, multiple defines per (minified) file blow up and dont make sense
|
|
// //Need to revisit this later.
|
|
|
|
// if ( typeof define === "function" && define.amd != null) {
|
|
// // AMD-loader compatible resource declaration
|
|
// // you need to call this one with jQuery as argument.
|
|
// define(function(){return Initializer} )
|
|
// } else {
|
|
ExtensionAttacher()
|
|
// }
|
|
|
|
})(); |