From 7a1522578bdc4e1187b006fc29b8fb1da78c476f Mon Sep 17 00:00:00 2001 From: suVene Date: Thu, 8 Jan 2009 12:28:21 +0000 Subject: resizable current textarea using a keymap git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@28170 d0d07461-0603-4401-acd4-de1884942a52 --- resizable_textarea.js | 93 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 81 insertions(+), 12 deletions(-) (limited to 'resizable_textarea.js') diff --git a/resizable_textarea.js b/resizable_textarea.js index 398e4bf..e1e698e 100644 --- a/resizable_textarea.js +++ b/resizable_textarea.js @@ -11,18 +11,35 @@ var PLUGIN_INFO = Allows you to resize textareas. テキストエリアをリサイズ可能にする。 suVene - 0.1.0 + 0.2.0 MIT 2.0pre 2.0α2 - http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/resizeble_textarea.js + http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/resizable_textarea.js || -:textareaResize - or -:tr +:textareaResize or :tr ||< +you can resize textareas by using a mouse. + +=== INSERT MODE or TEXTAREA MODE === +>|| +"" or "" +||< +you can resize current component by using a keyboad. +=== keymap === +"k" or "up": + height more small. +"j" or "down": + height more large. +"h" or "left": + width more small. +"l" or "right": + width more large. +"escape" or "enter": + end of resize. ]]> ; //}}} @@ -37,24 +54,36 @@ TextResizer.prototype = { this.handler = { initResize: this._bind(this, this.initResize), resize: this._bind(this, this.resize), - stopResize: this._bind(this, this.stopResize) + stopResize: this._bind(this, this.stopResize), + currentResize: this._bind(this, this.currentResize) }; }, - resizable: function(args) { + resizable: function(focused) { + if (focused) { + this.initResize({ target: focused }, focused); + return; + } this.changeCursor(false); this.doc.addEventListener("mousedown", this.handler.initResize, false); }, - initResize: function(event) { + initResize: function(event, focused) { var target = this.target = event.target; if (!target || (target.nodeName.toLowerCase() != "textarea" && (target.nodeName.toLowerCase() != "input" || target.type != "text"))) return; + if (focused) { + this.target.startBgColor = this.target.style.backgroundColor; + this.target.style.backgroundColor = "#F4BC14"; + this.doc.addEventListener("keydown", this.handler.currentResize, false); + return; + } + this.target.startWidth = this.target.clientWidth; this.target.startHeight = this.target.clientHeight; - this.target.startX = event.clientX; - this.target.startY = event.clientY; + this.target.startX = event.clientX || event.target.offsetLeft; + this.target.startY = event.clientY || event.target.offsetTop; this.doc.addEventListener("mousemove", this.handler.resize, false); this.doc.addEventListener("mouseup", this.handler.stopResize, false); @@ -86,6 +115,36 @@ TextResizer.prototype = { elem.style.cursor = normal ? "text" : "e-resize"; } }, + currentResize: function(event) { + var nodeName = this.target.nodeName.toLowerCase(); + switch (event.keyCode) { + case KeyEvent.DOM_VK_UP: case KeyEvent.DOM_VK_K: + if (nodeName == "textarea") + this.target.style.height = this.target.clientHeight - 10 + "px"; + break; + case KeyEvent.DOM_VK_DOWN: case KeyEvent.DOM_VK_J: + if (nodeName == "textarea") + this.target.style.height = this.target.clientHeight + 15 + "px"; + break; + case KeyEvent.DOM_VK_LEFT: case KeyEvent.DOM_VK_H: + this.target.style.width = this.target.clientWidth - 10 + "px"; + break; + case KeyEvent.DOM_VK_RIGHT: case KeyEvent.DOM_VK_L: + this.target.style.width = this.target.clientWidth + 15 + "px"; + break; + case KeyEvent.DOM_VK_RETURN: case KeyEvent.DOM_VK_ENTER: case KeyEvent.DOM_VK_ESCAPE: + this.target.style.background = this.target.startBgColor; + setTimeout(function(self) { + self.doc.removeEventListener("keydown", self.handler.currentResize, false); + self.target.focus(); + }, 10, this + ); + break; + } + try{ + event.preventDefault(); + } catch (e) {} + }, _bind: function() { var obj = Array.prototype.shift.apply(arguments); var func = Array.prototype.shift.apply(arguments); @@ -98,15 +157,25 @@ TextResizer.prototype = { }; commands.addUserCommand( - [ "textareaResize", "tr" ], "resizable textarea.", + [ "textareaResize", "tr" ], "Allows you to resize textareas.", function() { var instance = new TextResizer(window.content.document); - instance.resizable.apply(instance, arguments); + instance.resizable.apply(instance); }, null, true ); +mappings.add( + [ modes.INSERT, modes.TEXTAREA ], + [ "", "" ], + "Allows you to resize current textarea.", + function() { + var instance = new TextResizer(window.content.document); + instance.resizable.apply(instance, [ document.commandDispatcher.focusedElement ]); + } +); + })(); // vim: set fdm=marker sw=2 ts=2 sts=0 et: -- cgit v1.2.3