From 994abeddc6f20228f6fc6a98153beda934599fe6 Mon Sep 17 00:00:00 2001 From: u338_steven Date: Fri, 28 Mar 2014 01:22:05 +0900 Subject: [PATCH] add CaretMode --- coffee/command.coffee | 1 + coffee/mode.coffee | 42 ++++++++++++++++++++++++++++++++++++++++-- coffee/model.coffee | 7 ++++++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/coffee/command.coffee b/coffee/command.coffee index 3b7b03e..2ac6611 100644 --- a/coffee/command.coffee +++ b/coffee/command.coffee @@ -86,6 +86,7 @@ class g.CommandExecuter GoFMode : triggerInsideContent GoExtFMode : triggerInsideContent GoEmergencyMode : triggerInsideContent + GoCaretMode : triggerInsideContent FocusOnFirstInput : triggerInsideContent BackToPageMark : triggerInsideContent RestoreTab : sendToBackground diff --git a/coffee/mode.coffee b/coffee/mode.coffee index db59a56..df2de3c 100644 --- a/coffee/mode.coffee +++ b/coffee/mode.coffee @@ -121,6 +121,7 @@ class g.Mode reqGoSearchModeBackward : -> g.model.enterSearchMode( true ) reqGoLinkTextSearchMode : -> g.model.enterSearchMode( false, new g.LinkTextSearcher ) reqGoEmergencyMode : -> g.model.enterEmergencyMode() + reqGoCaretMode : -> g.model.enterCaretMode() reqBackToPageMark : -> # TODO:enable to go any pagemark, not only unnamed. @@ -146,6 +147,7 @@ class g.Mode when "--yank" then opt.mode='yank' when "--open" then opt.mode ='open' when "--opentab" then opt.mode= 'opentab' + when "--caret" then opt.mode= 'caret' if opt.mode? g.model.enterFMode(opt) @@ -375,6 +377,9 @@ class g.FMode extends g.Mode if text? (new g.CommandExecuter).set("Copy #{text}").parse().execute() g.model.enterNormalMode() + + caret: (target) -> + g.model.enterCaretMode(target) } getName : -> "FMode" @@ -420,7 +425,7 @@ class g.FMode extends g.Mode if @opt.continuous @currentInput = "" g.view.setStatusLineText(@statusLineHeader()) - else + else if @opt.mode != 'caret' g.view.hideStatusLine() prePostKeyEvent : (key, ctrl, alt, meta) -> @@ -509,7 +514,10 @@ class g.FMode extends g.Mode @showFunc = $.fn.show @hideFunc = $.fn.hide - links = $('a:_visible,*:input:_visible,.button:_visible') + if @opt.mode == 'caret' + links = $('*:_visible') + else + links = $('a:_visible,*:input:_visible,.button:_visible') $('img[usemap^="#"]:_visible').each(-> offset = this._offset_ mapName = $(this).attr('usemap').slice(1) @@ -549,6 +557,7 @@ class g.ExtFMode extends g.Mode 'O': 'opentab' 'y': 'yank' 'Y': 'yanktext' + 'c': 'caret' } getName : -> "ExtFMode" setOption : (@opt) -> this @@ -573,6 +582,35 @@ class g.ExtFMode extends g.Mode $('span#vichromehint').remove() $('.vichrome-fModeTarget').removeClass('vichrome-fModeTarget') +class g.CaretMode extends g.Mode + getName : -> "CaretMode" + setTarget : (@target) -> this + getKeyMapping : -> g.model.getIMap() + prePostKeyEvent : (key, ctrl, alt, meta) -> true + + blur : -> + g.model.enterNormalMode() + + enter : -> + @origin = { spellcheck : document.body.spellcheck, contentEditable : document.body.contentEditable } + document.body.spellcheck = false + document.body.contentEditable = true + range = document.createRange() + if !@target + @target = document.body + range.setStart(@target, 0) + range.setEnd(@target, 0) + select = window.getSelection() + select.removeAllRanges() + select.addRange(range) + g.view.setStatusLineText 'caret mode' + + exit : -> + document.body.contentEditable = @origin.contentEditable + document.body.spellcheck = @origin.spellcheck + select = window.getSelection() + select.removeAllRanges() + g.view.hideStatusLine() $.extend( $.expr[':'], _visible : (elem) -> diff --git a/coffee/model.coffee b/coffee/model.coffee index f03b734..59856c6 100644 --- a/coffee/model.coffee +++ b/coffee/model.coffee @@ -149,12 +149,17 @@ g.model = g.logger.d "enterFMode" @changeMode( (new g.ExtFMode).setOption( opt || {} ) ) + enterCaretMode : (target) -> + g.logger.d "enterCaretMode" + @changeMode( (new g.CaretMode).setTarget( target ) ) + isInNormalMode : -> @curMode.getName() == "NormalMode" isInInsertMode : -> @curMode.getName() == "InsertMode" isInSearchMode : -> @curMode.getName() == "SearchMode" isInCommandMode : -> @curMode.getName() == "CommandMode" isInFMode : -> @curMode.getName() == "FMode" isInEmergencyMode : -> @curMode.getName() == "EmergencyMode" + isInCaretMode : -> @curMode.getName() == "CaretMode" goNextSearchResult : (reverse) -> unless @searcher? then return @@ -254,7 +259,7 @@ g.model = when "aliases" then @getAlias = getAliasFirst onFocus : (target) -> - if @isInCommandMode() or @isInSearchMode() or @isInEmergencyMode() + if @isInCommandMode() or @isInSearchMode() or @isInEmergencyMode() or @isInCaretMode() g.logger.d "onFocus:nothing should be done in the cur mode" return