From e93407e837d950b76179dc2836c5fc9b6ca21f19 Mon Sep 17 00:00:00 2001 From: suVene Date: Thu, 8 Jan 2009 12:24:31 +0000 Subject: rename. git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@28169 d0d07461-0603-4401-acd4-de1884942a52 --- resizable_textarea.js | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 resizable_textarea.js (limited to 'resizable_textarea.js') diff --git a/resizable_textarea.js b/resizable_textarea.js new file mode 100644 index 0000000..398e4bf --- /dev/null +++ b/resizable_textarea.js @@ -0,0 +1,112 @@ +/*** BEGIN LICENSE BLOCK {{{ + Copyright (c) 2009 suVene + + distributable under the terms of an MIT-style license. + http://www.opensource.jp/licenses/mit-license.html +}}} END LICENSE BLOCK ***/ +// PLUGIN_INFO//{{{ +var PLUGIN_INFO = + + {NAME} + Allows you to resize textareas. + テキストエリアをリサイズ可能にする。 + suVene + 0.1.0 + MIT + 2.0pre + 2.0α2 + http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/resizeble_textarea.js + || +:textareaResize + or +:tr +||< + ]]> +; +//}}} +(function() { + +var TextResizer = function() { + this.initialize.apply(this, arguments); +}; +TextResizer.prototype = { + initialize: function(doc) { + this.doc = doc; + this.handler = { + initResize: this._bind(this, this.initResize), + resize: this._bind(this, this.resize), + stopResize: this._bind(this, this.stopResize) + }; + }, + resizable: function(args) { + this.changeCursor(false); + this.doc.addEventListener("mousedown", this.handler.initResize, false); + }, + initResize: function(event) { + var target = this.target = event.target; + if (!target || + (target.nodeName.toLowerCase() != "textarea" && + (target.nodeName.toLowerCase() != "input" || target.type != "text"))) + return; + + this.target.startWidth = this.target.clientWidth; + this.target.startHeight = this.target.clientHeight; + this.target.startX = event.clientX; + this.target.startY = event.clientY; + + this.doc.addEventListener("mousemove", this.handler.resize, false); + this.doc.addEventListener("mouseup", this.handler.stopResize, false); + + try{ + event.preventDefault(); + } catch (e) {} + }, + resize: function(event) { + try{ + this.target.style.width = event.clientX - this.target.startX + this.target.startWidth + "px"; + } catch (e) {} + + if (this.target.nodeName.toLowerCase() == "textarea") + this.target.style.height = event.clientY - this.target.startY + this.target.startHeight + "px"; + }, + stopResize:function(event) { + this.doc.removeEventListener("mousedown", this.handler.initResize, false); + this.doc.removeEventListener("mousemove", this.handler.resize, false); + setTimeout(function(self) self.doc.removeEventListener("mouseup", self.handler.stopResize, false), 10, this); + this.changeCursor(true); + }, + changeCursor: function(normal) { + for (let [,elem] in Iterator(this.doc.getElementsByTagName("textarea"))) + elem.style.cursor = normal ? "text" : "se-resize"; + + for (let [,elem] in Iterator(this.doc.getElementsByTagName("input"))) { + if (elem.type == "text") + elem.style.cursor = normal ? "text" : "e-resize"; + } + }, + _bind: function() { + var obj = Array.prototype.shift.apply(arguments); + var func = Array.prototype.shift.apply(arguments); + var args = []; + for (let i = 0, len = arguments.length; i < len; args.push(arguments[i++])); + return function(event) { + return func.apply(obj, [ event ].concat(args)); + }; + } +}; + +commands.addUserCommand( + [ "textareaResize", "tr" ], "resizable textarea.", + function() { + var instance = new TextResizer(window.content.document); + instance.resizable.apply(instance, arguments); + }, + null, + true +); + +})(); +// vim: set fdm=marker sw=2 ts=2 sts=0 et: + -- cgit v1.2.3