Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
aa5866f1
V
vscode
项目概览
掘金者说
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
aa5866f1
编写于
1月 18, 2016
作者:
A
Alex Dima
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Remove /browser/ types from textAreaState
上级
25edb0c3
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
161 addition
and
101 deletion
+161
-101
src/vs/editor/browser/controller/keyboardHandler.ts
src/vs/editor/browser/controller/keyboardHandler.ts
+78
-19
src/vs/editor/browser/controller/textAreaHandler.ts
src/vs/editor/browser/controller/textAreaHandler.ts
+54
-56
src/vs/editor/browser/controller/textAreaState.ts
src/vs/editor/browser/controller/textAreaState.ts
+29
-26
未找到文件。
src/vs/editor/browser/controller/keyboardHandler.ts
浏览文件 @
aa5866f1
...
@@ -20,20 +20,79 @@ import {Position} from 'vs/editor/common/core/position';
...
@@ -20,20 +20,79 @@ import {Position} from 'vs/editor/common/core/position';
import
{
CommonKeybindings
}
from
'
vs/base/common/keyCodes
'
;
import
{
CommonKeybindings
}
from
'
vs/base/common/keyCodes
'
;
import
Event
,
{
Emitter
}
from
'
vs/base/common/event
'
;
import
Event
,
{
Emitter
}
from
'
vs/base/common/event
'
;
import
{
TextAreaHandler
}
from
'
vs/editor/browser/controller/textAreaHandler
'
;
import
{
TextAreaHandler
}
from
'
vs/editor/browser/controller/textAreaHandler
'
;
import
{
ITextAreaWrapper
,
ITextAreaStyle
,
ISimpleModel
}
from
'
vs/editor/browser/controller/textAreaState
'
;
import
{
ITextAreaWrapper
,
IClipboardEvent
,
IKeyboardEventWrapper
,
ITextAreaStyle
,
ISimpleModel
}
from
'
vs/editor/browser/controller/textAreaState
'
;
class
ClipboardEventWrapper
implements
IClipboardEvent
{
private
_event
:
ClipboardEvent
;
constructor
(
event
:
ClipboardEvent
)
{
this
.
_event
=
event
;
}
public
canUseTextData
():
boolean
{
if
(
this
.
_event
.
clipboardData
)
{
return
true
;
}
if
((
<
any
>
window
).
clipboardData
)
{
return
true
;
}
return
false
;
}
public
setTextData
(
text
:
string
):
void
{
if
(
this
.
_event
.
clipboardData
)
{
this
.
_event
.
clipboardData
.
setData
(
'
text/plain
'
,
text
);
this
.
_event
.
preventDefault
();
return
;
}
if
((
<
any
>
window
).
clipboardData
)
{
(
<
any
>
window
).
clipboardData
.
setData
(
'
Text
'
,
text
);
this
.
_event
.
preventDefault
();
return
;
}
throw
new
Error
(
'
ClipboardEventWrapper.setTextData: Cannot use text data!
'
);
}
public
getTextData
():
string
{
if
(
this
.
_event
.
clipboardData
)
{
this
.
_event
.
preventDefault
();
return
this
.
_event
.
clipboardData
.
getData
(
'
text/plain
'
);
}
if
((
<
any
>
window
).
clipboardData
)
{
this
.
_event
.
preventDefault
();
return
(
<
any
>
window
).
clipboardData
.
getData
(
'
Text
'
);
}
throw
new
Error
(
'
ClipboardEventWrapper.getTextData: Cannot use text data!
'
);
}
}
class
KeyboardEventWrapper
implements
IKeyboardEventWrapper
{
public
actual
:
DomUtils
.
IKeyboardEvent
;
constructor
(
actual
:
DomUtils
.
IKeyboardEvent
)
{
this
.
actual
=
actual
;
}
}
class
TextAreaWrapper
extends
Lifecycle
.
Disposable
implements
ITextAreaWrapper
{
class
TextAreaWrapper
extends
Lifecycle
.
Disposable
implements
ITextAreaWrapper
{
private
_textArea
:
HTMLTextAreaElement
;
private
_textArea
:
HTMLTextAreaElement
;
private
_onKeyDown
=
this
.
_register
(
new
Emitter
<
DomUtils
.
IKeyboardEvent
>
());
private
_onKeyDown
=
this
.
_register
(
new
Emitter
<
IKeyboardEventWrapper
>
());
public
onKeyDown
:
Event
<
DomUtils
.
IKeyboardEvent
>
=
this
.
_onKeyDown
.
event
;
public
onKeyDown
:
Event
<
IKeyboardEventWrapper
>
=
this
.
_onKeyDown
.
event
;
private
_onKeyUp
=
this
.
_register
(
new
Emitter
<
DomUtils
.
IKeyboardEvent
>
());
private
_onKeyUp
=
this
.
_register
(
new
Emitter
<
IKeyboardEventWrapper
>
());
public
onKeyUp
:
Event
<
DomUtils
.
IKeyboardEvent
>
=
this
.
_onKeyUp
.
event
;
public
onKeyUp
:
Event
<
IKeyboardEventWrapper
>
=
this
.
_onKeyUp
.
event
;
private
_onKeyPress
=
this
.
_register
(
new
Emitter
<
DomUtils
.
IKeyboardEvent
>
());
private
_onKeyPress
=
this
.
_register
(
new
Emitter
<
IKeyboardEventWrapper
>
());
public
onKeyPress
:
Event
<
DomUtils
.
IKeyboardEvent
>
=
this
.
_onKeyPress
.
event
;
public
onKeyPress
:
Event
<
IKeyboardEventWrapper
>
=
this
.
_onKeyPress
.
event
;
private
_onCompositionStart
=
this
.
_register
(
new
Emitter
<
void
>
());
private
_onCompositionStart
=
this
.
_register
(
new
Emitter
<
void
>
());
public
onCompositionStart
:
Event
<
void
>
=
this
.
_onCompositionStart
.
event
;
public
onCompositionStart
:
Event
<
void
>
=
this
.
_onCompositionStart
.
event
;
...
@@ -44,30 +103,30 @@ class TextAreaWrapper extends Lifecycle.Disposable implements ITextAreaWrapper {
...
@@ -44,30 +103,30 @@ class TextAreaWrapper extends Lifecycle.Disposable implements ITextAreaWrapper {
private
_onInput
=
this
.
_register
(
new
Emitter
<
void
>
());
private
_onInput
=
this
.
_register
(
new
Emitter
<
void
>
());
public
onInput
:
Event
<
void
>
=
this
.
_onInput
.
event
;
public
onInput
:
Event
<
void
>
=
this
.
_onInput
.
event
;
private
_onCut
=
this
.
_register
(
new
Emitter
<
ClipboardEvent
>
());
private
_onCut
=
this
.
_register
(
new
Emitter
<
I
ClipboardEvent
>
());
public
onCut
:
Event
<
ClipboardEvent
>
=
this
.
_onCut
.
event
;
public
onCut
:
Event
<
I
ClipboardEvent
>
=
this
.
_onCut
.
event
;
private
_onCopy
=
this
.
_register
(
new
Emitter
<
ClipboardEvent
>
());
private
_onCopy
=
this
.
_register
(
new
Emitter
<
I
ClipboardEvent
>
());
public
onCopy
:
Event
<
ClipboardEvent
>
=
this
.
_onCopy
.
event
;
public
onCopy
:
Event
<
I
ClipboardEvent
>
=
this
.
_onCopy
.
event
;
private
_onPaste
=
this
.
_register
(
new
Emitter
<
ClipboardEvent
>
());
private
_onPaste
=
this
.
_register
(
new
Emitter
<
I
ClipboardEvent
>
());
public
onPaste
:
Event
<
ClipboardEvent
>
=
this
.
_onPaste
.
event
;
public
onPaste
:
Event
<
I
ClipboardEvent
>
=
this
.
_onPaste
.
event
;
constructor
(
textArea
:
HTMLTextAreaElement
)
{
constructor
(
textArea
:
HTMLTextAreaElement
)
{
super
();
super
();
this
.
_textArea
=
textArea
;
this
.
_textArea
=
textArea
;
let
kbController
=
this
.
_register
(
new
keyboardController
.
KeyboardController
(
this
.
_textArea
));
let
kbController
=
this
.
_register
(
new
keyboardController
.
KeyboardController
(
this
.
_textArea
));
this
.
_register
(
kbController
.
addListener2
(
'
keydown
'
,
(
e
)
=>
this
.
_onKeyDown
.
fire
(
e
)));
this
.
_register
(
kbController
.
addListener2
(
'
keydown
'
,
(
e
)
=>
this
.
_onKeyDown
.
fire
(
new
KeyboardEventWrapper
(
e
)
)));
this
.
_register
(
kbController
.
addListener2
(
'
keyup
'
,
(
e
)
=>
this
.
_onKeyUp
.
fire
(
e
)));
this
.
_register
(
kbController
.
addListener2
(
'
keyup
'
,
(
e
)
=>
this
.
_onKeyUp
.
fire
(
new
KeyboardEventWrapper
(
e
)
)));
this
.
_register
(
kbController
.
addListener2
(
'
keypress
'
,
(
e
)
=>
this
.
_onKeyPress
.
fire
(
e
)));
this
.
_register
(
kbController
.
addListener2
(
'
keypress
'
,
(
e
)
=>
this
.
_onKeyPress
.
fire
(
new
KeyboardEventWrapper
(
e
)
)));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
compositionstart
'
,
(
e
)
=>
this
.
_onCompositionStart
.
fire
()));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
compositionstart
'
,
(
e
)
=>
this
.
_onCompositionStart
.
fire
()));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
compositionend
'
,
(
e
)
=>
this
.
_onCompositionEnd
.
fire
()));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
compositionend
'
,
(
e
)
=>
this
.
_onCompositionEnd
.
fire
()));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
input
'
,
(
e
)
=>
this
.
_onInput
.
fire
()));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
input
'
,
(
e
)
=>
this
.
_onInput
.
fire
()));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
cut
'
,
(
e
)
=>
this
.
_onCut
.
fire
(
e
)));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
cut
'
,
(
e
:
ClipboardEvent
)
=>
this
.
_onCut
.
fire
(
new
ClipboardEventWrapper
(
e
)
)));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
copy
'
,
(
e
)
=>
this
.
_onCopy
.
fire
(
e
)));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
copy
'
,
(
e
:
ClipboardEvent
)
=>
this
.
_onCopy
.
fire
(
new
ClipboardEventWrapper
(
e
)
)));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
paste
'
,
(
e
)
=>
this
.
_onPaste
.
fire
(
e
)));
this
.
_register
(
DomUtils
.
addDisposableListener
(
this
.
_textArea
,
'
paste
'
,
(
e
:
ClipboardEvent
)
=>
this
.
_onPaste
.
fire
(
new
ClipboardEventWrapper
(
e
)
)));
}
}
public
get
value
():
string
{
public
get
value
():
string
{
...
...
src/vs/editor/browser/controller/textAreaHandler.ts
浏览文件 @
aa5866f1
...
@@ -16,7 +16,7 @@ import {Range} from 'vs/editor/common/core/range';
...
@@ -16,7 +16,7 @@ import {Range} from 'vs/editor/common/core/range';
import
{
Position
}
from
'
vs/editor/common/core/position
'
;
import
{
Position
}
from
'
vs/editor/common/core/position
'
;
import
{
CommonKeybindings
}
from
'
vs/base/common/keyCodes
'
;
import
{
CommonKeybindings
}
from
'
vs/base/common/keyCodes
'
;
import
Event
,
{
Emitter
}
from
'
vs/base/common/event
'
;
import
Event
,
{
Emitter
}
from
'
vs/base/common/event
'
;
import
{
I
TextAreaWrapper
,
ITextAreaStyle
,
ISimpleModel
,
TextAreaState
}
from
'
vs/editor/browser/controller/textAreaState
'
;
import
{
I
KeyboardEventWrapper
,
ITextAreaWrapper
,
IClipboardEvent
,
ITextAreaStyle
,
ISimpleModel
,
TextAreaState
}
from
'
vs/editor/browser/controller/textAreaState
'
;
enum
ReadFromTextArea
{
enum
ReadFromTextArea
{
Type
,
Type
,
...
@@ -105,12 +105,12 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -105,12 +105,12 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
this
.
_toDispose
.
push
(
this
.
textArea
.
onKeyDown
((
e
)
=>
this
.
_onKeyDown
(
e
)));
this
.
_toDispose
.
push
(
this
.
textArea
.
onKeyDown
((
e
)
=>
this
.
_onKeyDown
(
e
)));
this
.
_toDispose
.
push
(
this
.
textArea
.
onKeyUp
((
e
)
=>
this
.
_onKeyUp
(
e
)));
this
.
_toDispose
.
push
(
this
.
textArea
.
onKeyUp
((
e
)
=>
this
.
_onKeyUp
(
e
)));
this
.
_toDispose
.
push
(
this
.
textArea
.
onKeyPress
((
e
)
=>
this
.
_onKeyPress
(
e
)));
this
.
_toDispose
.
push
(
this
.
textArea
.
onKeyPress
((
e
)
=>
this
.
_onKeyPress
()));
this
.
textareaIsShownAtCursor
=
false
;
this
.
textareaIsShownAtCursor
=
false
;
this
.
_toDispose
.
push
(
this
.
textArea
.
onCompositionStart
(()
=>
{
this
.
_toDispose
.
push
(
this
.
textArea
.
onCompositionStart
(()
=>
{
var
timeSinceLastCompositionEnd
=
(
new
Date
().
getTime
())
-
this
.
lastCompositionEndTime
;
let
timeSinceLastCompositionEnd
=
(
new
Date
().
getTime
())
-
this
.
lastCompositionEndTime
;
if
(
!
this
.
textareaIsShownAtCursor
)
{
if
(
!
this
.
textareaIsShownAtCursor
)
{
this
.
textareaIsShownAtCursor
=
true
;
this
.
textareaIsShownAtCursor
=
true
;
this
.
showTextAreaAtCursor
(
timeSinceLastCompositionEnd
>=
100
);
this
.
showTextAreaAtCursor
(
timeSinceLastCompositionEnd
>=
100
);
...
@@ -131,9 +131,9 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -131,9 +131,9 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
// so we leverage the input event instead
// so we leverage the input event instead
if
(
Browser
.
isIPad
)
{
if
(
Browser
.
isIPad
)
{
this
.
_toDispose
.
push
(
this
.
textArea
.
onInput
(()
=>
{
this
.
_toDispose
.
push
(
this
.
textArea
.
onInput
(()
=>
{
var
myTime
=
(
new
Date
()).
getTime
();
let
myTime
=
(
new
Date
()).
getTime
();
// A keypress will trigger an input event (very quickly)
// A keypress will trigger an input event (very quickly)
var
keyPressDeltaTime
=
myTime
-
this
.
lastKeyPressTime
;
let
keyPressDeltaTime
=
myTime
-
this
.
lastKeyPressTime
;
if
(
keyPressDeltaTime
<=
500
)
{
if
(
keyPressDeltaTime
<=
500
)
{
this
.
_scheduleReadFromTextArea
(
ReadFromTextArea
.
Type
);
this
.
_scheduleReadFromTextArea
(
ReadFromTextArea
.
Type
);
this
.
lastKeyPressTime
=
0
;
this
.
lastKeyPressTime
=
0
;
...
@@ -169,16 +169,16 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -169,16 +169,16 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
return
;
return
;
}
}
var
myTime
=
(
new
Date
()).
getTime
();
let
myTime
=
(
new
Date
()).
getTime
();
// A keypress will trigger an input event (very quickly)
// A keypress will trigger an input event (very quickly)
var
keyPressDeltaTime
=
myTime
-
this
.
lastKeyPressTime
;
let
keyPressDeltaTime
=
myTime
-
this
.
lastKeyPressTime
;
if
(
keyPressDeltaTime
<=
500
)
{
if
(
keyPressDeltaTime
<=
500
)
{
return
;
return
;
}
}
// A composition end will trigger an input event (very quickly)
// A composition end will trigger an input event (very quickly)
var
compositionEndDeltaTime
=
myTime
-
this
.
lastCompositionEndTime
;
let
compositionEndDeltaTime
=
myTime
-
this
.
lastCompositionEndTime
;
if
(
compositionEndDeltaTime
<=
500
)
{
if
(
compositionEndDeltaTime
<=
500
)
{
return
;
return
;
}
}
...
@@ -194,8 +194,8 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -194,8 +194,8 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
}
}
// In Chrome, only the first character gets replaced, while in Safari the entire line gets replaced
// In Chrome, only the first character gets replaced, while in Safari the entire line gets replaced
var
typedText
:
string
;
let
typedText
:
string
;
var
textAreaValue
=
this
.
textArea
.
value
;
let
textAreaValue
=
this
.
textArea
.
value
;
if
(
!
Browser
.
isChrome
)
{
if
(
!
Browser
.
isChrome
)
{
// TODO: Also check this on Safari & FF before removing this
// TODO: Also check this on Safari & FF before removing this
...
@@ -206,8 +206,8 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -206,8 +206,8 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
return
;
return
;
}
}
var
prefixLength
=
Strings
.
commonPrefixLength
(
this
.
lastValueWrittenToTheTextArea
,
textAreaValue
);
let
prefixLength
=
Strings
.
commonPrefixLength
(
this
.
lastValueWrittenToTheTextArea
,
textAreaValue
);
var
suffixLength
=
Strings
.
commonSuffixLength
(
this
.
lastValueWrittenToTheTextArea
,
textAreaValue
);
let
suffixLength
=
Strings
.
commonSuffixLength
(
this
.
lastValueWrittenToTheTextArea
,
textAreaValue
);
if
(
prefixLength
+
suffixLength
+
1
!==
textAreaValue
.
length
)
{
if
(
prefixLength
+
suffixLength
+
1
!==
textAreaValue
.
length
)
{
return
;
return
;
...
@@ -239,7 +239,7 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -239,7 +239,7 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
private
showTextAreaAtCursor
(
emptyIt
:
boolean
):
void
{
private
showTextAreaAtCursor
(
emptyIt
:
boolean
):
void
{
var
interestingLineNumber
:
number
,
let
interestingLineNumber
:
number
,
interestingColumn1
:
number
,
interestingColumn1
:
number
,
interestingColumn2
:
number
;
interestingColumn2
:
number
;
...
@@ -257,8 +257,8 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -257,8 +257,8 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
}
}
let
visibleRanges
=
this
.
editor
.
visibleRangeForPositionRelativeToEditor
(
interestingLineNumber
,
interestingColumn1
,
interestingColumn2
);
let
visibleRanges
=
this
.
editor
.
visibleRangeForPositionRelativeToEditor
(
interestingLineNumber
,
interestingColumn1
,
interestingColumn2
);
var
visibleRange1
=
visibleRanges
.
column1
;
let
visibleRange1
=
visibleRanges
.
column1
;
var
visibleRange2
=
visibleRanges
.
column2
;
let
visibleRange2
=
visibleRanges
.
column2
;
let
style
:
ITextAreaStyle
=
{
let
style
:
ITextAreaStyle
=
{
top
:
undefined
,
top
:
undefined
,
...
@@ -339,7 +339,7 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -339,7 +339,7 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
private
setTextAreaState
(
textAreaState
:
TextAreaState
,
select
:
boolean
):
void
{
private
setTextAreaState
(
textAreaState
:
TextAreaState
,
select
:
boolean
):
void
{
// IE doesn't like calling select on a hidden textarea and the textarea is hidden during the tests
// IE doesn't like calling select on a hidden textarea and the textarea is hidden during the tests
var
shouldSetSelection
=
select
&&
this
.
hasFocus
;
let
shouldSetSelection
=
select
&&
this
.
hasFocus
;
if
(
!
shouldSetSelection
)
{
if
(
!
shouldSetSelection
)
{
textAreaState
.
resetSelection
();
textAreaState
.
resetSelection
();
...
@@ -351,13 +351,14 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -351,13 +351,14 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
this
.
previousSetTextAreaState
=
textAreaState
;
this
.
previousSetTextAreaState
=
textAreaState
;
}
}
private
_onKeyDown
(
e
:
DomUtils
.
IKeyboardEvent
):
void
{
private
_onKeyDown
(
e
:
IKeyboardEventWrapper
):
void
{
if
(
e
.
equals
(
CommonKeybindings
.
ESCAPE
))
{
let
actual
=
<
DomUtils
.
IKeyboardEvent
>
e
.
actual
;
if
(
actual
.
equals
(
CommonKeybindings
.
ESCAPE
))
{
// Prevent default always for `Esc`, otherwise it will generate a keypress
// Prevent default always for `Esc`, otherwise it will generate a keypress
// See http://msdn.microsoft.com/en-us/library/ie/ms536939(v=vs.85).aspx
// See http://msdn.microsoft.com/en-us/library/ie/ms536939(v=vs.85).aspx
e
.
preventDefault
();
actual
.
preventDefault
();
}
}
this
.
editor
.
emitKeyDown
(
e
);
this
.
editor
.
emitKeyDown
(
actual
);
// Work around for issue spotted in electron on the mac
// Work around for issue spotted in electron on the mac
// TODO@alex: check if this issue exists after updating electron
// TODO@alex: check if this issue exists after updating electron
// Steps:
// Steps:
...
@@ -372,7 +373,7 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -372,7 +373,7 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
// => focus moves out while keydown is not finished
// => focus moves out while keydown is not finished
setTimeout
(()
=>
{
setTimeout
(()
=>
{
// cancel reading if previous keydown was canceled, but a keypress/input were still generated
// cancel reading if previous keydown was canceled, but a keypress/input were still generated
if
(
e
.
browserEvent
&&
e
.
browserEvent
.
defaultPrevented
)
{
if
(
actual
.
browserEvent
&&
actual
.
browserEvent
.
defaultPrevented
)
{
// this._scheduleReadFromTextArea
// this._scheduleReadFromTextArea
this
.
asyncReadFromTextArea
.
cancel
();
this
.
asyncReadFromTextArea
.
cancel
();
this
.
asyncSetSelectionToTextArea
.
schedule
();
this
.
asyncSetSelectionToTextArea
.
schedule
();
...
@@ -380,11 +381,11 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -380,11 +381,11 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
},
0
);
},
0
);
}
}
private
_onKeyUp
(
e
:
DomUtils
.
IKeyboardEvent
):
void
{
private
_onKeyUp
(
e
:
IKeyboardEventWrapper
):
void
{
this
.
editor
.
emitKeyUp
(
e
);
this
.
editor
.
emitKeyUp
(
<
DomUtils
.
IKeyboardEvent
>
e
.
actual
);
}
}
private
_onKeyPress
(
e
:
DomUtils
.
IKeyboardEvent
):
void
{
private
_onKeyPress
():
void
{
if
(
!
this
.
hasFocus
)
{
if
(
!
this
.
hasFocus
)
{
// Sometimes, when doing Alt-Tab, in FF, a 'keypress' is sent before a 'focus'
// Sometimes, when doing Alt-Tab, in FF, a 'keypress' is sent before a 'focus'
return
;
return
;
...
@@ -411,9 +412,9 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -411,9 +412,9 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
* Read text from textArea and trigger `command` on the editor
* Read text from textArea and trigger `command` on the editor
*/
*/
private
_readFromTextArea
(
command
:
ReadFromTextArea
):
void
{
private
_readFromTextArea
(
command
:
ReadFromTextArea
):
void
{
var
previousSelectionToken
=
this
.
previousSetTextAreaState
?
this
.
previousSetTextAreaState
.
getSelectionToken
()
:
0
;
let
previousSelectionToken
=
this
.
previousSetTextAreaState
?
this
.
previousSetTextAreaState
.
getSelectionToken
()
:
0
;
var
observedState
=
TextAreaState
.
fromTextArea
(
this
.
textArea
,
previousSelectionToken
);
let
observedState
=
TextAreaState
.
fromTextArea
(
this
.
textArea
,
previousSelectionToken
);
var
txt
=
observedState
.
extractNewText
(
this
.
previousSetTextAreaState
);
let
txt
=
observedState
.
extractNewText
(
this
.
previousSetTextAreaState
);
if
(
txt
!==
''
)
{
if
(
txt
!==
''
)
{
if
(
command
===
ReadFromTextArea
.
Type
)
{
if
(
command
===
ReadFromTextArea
.
Type
)
{
...
@@ -433,7 +434,7 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -433,7 +434,7 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
return
;
return
;
}
}
var
pasteOnNewLine
=
false
;
let
pasteOnNewLine
=
false
;
if
(
Browser
.
enableEmptySelectionClipboard
)
{
if
(
Browser
.
enableEmptySelectionClipboard
)
{
pasteOnNewLine
=
(
txt
===
this
.
lastCopiedValue
&&
this
.
lastCopiedValueIsFromEmptySelection
);
pasteOnNewLine
=
(
txt
===
this
.
lastCopiedValue
&&
this
.
lastCopiedValueIsFromEmptySelection
);
}
}
...
@@ -455,21 +456,23 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -455,21 +456,23 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
private
_writePlaceholderAndSelectTextArea
():
void
{
private
_writePlaceholderAndSelectTextArea
():
void
{
if
(
!
this
.
textareaIsShownAtCursor
)
{
if
(
!
this
.
textareaIsShownAtCursor
)
{
// Do not write to the textarea if it is visible.
// Do not write to the textarea if it is visible.
var
previousSelectionToken
=
this
.
previousSetTextAreaState
?
this
.
previousSetTextAreaState
.
getSelectionToken
()
:
0
;
let
previousSelectionToken
=
this
.
previousSetTextAreaState
?
this
.
previousSetTextAreaState
.
getSelectionToken
()
:
0
;
var
newState
=
TextAreaState
.
fromEditorSelectionAndPreviousState
(
this
.
editor
.
getModel
(),
this
.
selection
,
previousSelectionToken
);
let
newState
:
TextAreaState
;
if
(
Browser
.
isIPad
)
{
// Do not place anything in the textarea for the iPad
newState
=
new
TextAreaState
(
''
,
0
,
0
,
false
,
0
);
}
else
{
newState
=
TextAreaState
.
fromEditorSelectionAndPreviousState
(
this
.
editor
.
getModel
(),
this
.
selection
,
previousSelectionToken
);
}
this
.
setTextAreaState
(
newState
,
true
);
this
.
setTextAreaState
(
newState
,
true
);
}
}
}
}
// ------------- Clipboard operations
// ------------- Clipboard operations
private
_onPaste
(
e
:
ClipboardEvent
):
void
{
private
_onPaste
(
e
:
IClipboardEvent
):
void
{
if
(
e
&&
(
<
any
>
e
).
clipboardData
)
{
if
(
e
.
canUseTextData
())
{
e
.
preventDefault
();
this
.
executePaste
(
e
.
getTextData
());
this
.
executePaste
((
<
any
>
e
).
clipboardData
.
getData
(
'
text/plain
'
));
}
else
if
(
e
&&
(
<
any
>
window
).
clipboardData
)
{
e
.
preventDefault
();
this
.
executePaste
((
<
any
>
window
).
clipboardData
.
getData
(
'
Text
'
));
}
else
{
}
else
{
if
(
this
.
textArea
.
selectionStart
!==
this
.
textArea
.
selectionEnd
)
{
if
(
this
.
textArea
.
selectionStart
!==
this
.
textArea
.
selectionEnd
)
{
// Clean up the textarea, to get a clean paste
// Clean up the textarea, to get a clean paste
...
@@ -480,7 +483,7 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -480,7 +483,7 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
this
.
justHadAPaste
=
true
;
this
.
justHadAPaste
=
true
;
}
}
private
_onCopy
(
e
:
ClipboardEvent
):
void
{
private
_onCopy
(
e
:
I
ClipboardEvent
):
void
{
this
.
_ensureClipboardGetsEditorSelection
(
e
);
this
.
_ensureClipboardGetsEditorSelection
(
e
);
}
}
...
@@ -488,21 +491,16 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -488,21 +491,16 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
this
.
editor
.
cut
(
'
keyboard
'
);
this
.
editor
.
cut
(
'
keyboard
'
);
}
}
private
_onCut
(
e
:
ClipboardEvent
):
void
{
private
_onCut
(
e
:
I
ClipboardEvent
):
void
{
this
.
_ensureClipboardGetsEditorSelection
(
e
);
this
.
_ensureClipboardGetsEditorSelection
(
e
);
this
.
asyncTriggerCut
.
schedule
();
this
.
asyncTriggerCut
.
schedule
();
this
.
justHadACut
=
true
;
this
.
justHadACut
=
true
;
}
}
private
_ensureClipboardGetsEditorSelection
(
e
:
ClipboardEvent
):
void
{
private
_ensureClipboardGetsEditorSelection
(
e
:
IClipboardEvent
):
void
{
var
whatToCopy
=
this
.
_getPlainTextToCopy
();
let
whatToCopy
=
this
.
_getPlainTextToCopy
();
if
(
e
&&
(
<
any
>
e
).
clipboardData
)
{
if
(
e
.
canUseTextData
())
{
(
<
any
>
e
).
clipboardData
.
setData
(
'
text/plain
'
,
whatToCopy
);
e
.
setTextData
(
whatToCopy
);
// (<any>e).clipboardData.setData('text/html', this._getHTMLToCopy());
e
.
preventDefault
();
}
else
if
(
e
&&
(
<
any
>
window
).
clipboardData
)
{
(
<
any
>
window
).
clipboardData
.
setData
(
'
Text
'
,
whatToCopy
);
e
.
preventDefault
();
}
else
{
}
else
{
this
.
setTextAreaState
(
new
TextAreaState
(
whatToCopy
,
0
,
whatToCopy
.
length
,
false
,
0
),
true
);
this
.
setTextAreaState
(
new
TextAreaState
(
whatToCopy
,
0
,
whatToCopy
.
length
,
false
,
0
),
true
);
}
}
...
@@ -516,22 +514,22 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -516,22 +514,22 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
this
.
lastCopiedValue
=
whatToCopy
;
this
.
lastCopiedValue
=
whatToCopy
;
}
}
var
selections
=
this
.
selections
;
let
selections
=
this
.
selections
;
this
.
lastCopiedValueIsFromEmptySelection
=
(
selections
.
length
===
1
&&
selections
[
0
].
isEmpty
());
this
.
lastCopiedValueIsFromEmptySelection
=
(
selections
.
length
===
1
&&
selections
[
0
].
isEmpty
());
}
}
}
}
private
_getPlainTextToCopy
():
string
{
private
_getPlainTextToCopy
():
string
{
var
newLineCharacter
=
(
Platform
.
isWindows
?
'
\r\n
'
:
'
\n
'
);
let
newLineCharacter
=
(
Platform
.
isWindows
?
'
\r\n
'
:
'
\n
'
);
var
eolPref
=
(
Platform
.
isWindows
?
EditorCommon
.
EndOfLinePreference
.
CRLF
:
EditorCommon
.
EndOfLinePreference
.
LF
);
let
eolPref
=
(
Platform
.
isWindows
?
EditorCommon
.
EndOfLinePreference
.
CRLF
:
EditorCommon
.
EndOfLinePreference
.
LF
);
var
selections
=
this
.
selections
;
let
selections
=
this
.
selections
;
let
model
=
this
.
editor
.
getModel
();
let
model
=
this
.
editor
.
getModel
();
if
(
selections
.
length
===
1
)
{
if
(
selections
.
length
===
1
)
{
var
range
:
EditorCommon
.
IEditorRange
=
selections
[
0
];
let
range
:
EditorCommon
.
IEditorRange
=
selections
[
0
];
if
(
range
.
isEmpty
())
{
if
(
range
.
isEmpty
())
{
if
(
Browser
.
enableEmptySelectionClipboard
)
{
if
(
Browser
.
enableEmptySelectionClipboard
)
{
var
modelLineNumber
=
model
.
convertViewPositionToModelPosition
(
range
.
startLineNumber
,
1
).
lineNumber
;
let
modelLineNumber
=
model
.
convertViewPositionToModelPosition
(
range
.
startLineNumber
,
1
).
lineNumber
;
return
model
.
getModelLineContent
(
modelLineNumber
)
+
newLineCharacter
;
return
model
.
getModelLineContent
(
modelLineNumber
)
+
newLineCharacter
;
}
else
{
}
else
{
return
''
;
return
''
;
...
@@ -541,8 +539,8 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
...
@@ -541,8 +539,8 @@ export class TextAreaHandler implements Lifecycle.IDisposable {
return
model
.
getValueInRange
(
range
,
eolPref
);
return
model
.
getValueInRange
(
range
,
eolPref
);
}
else
{
}
else
{
selections
=
selections
.
slice
(
0
).
sort
(
Range
.
compareRangesUsingStarts
);
selections
=
selections
.
slice
(
0
).
sort
(
Range
.
compareRangesUsingStarts
);
var
result
:
string
[]
=
[];
let
result
:
string
[]
=
[];
for
(
var
i
=
0
;
i
<
selections
.
length
;
i
++
)
{
for
(
let
i
=
0
;
i
<
selections
.
length
;
i
++
)
{
result
.
push
(
model
.
getValueInRange
(
selections
[
i
],
eolPref
));
result
.
push
(
model
.
getValueInRange
(
selections
[
i
],
eolPref
));
}
}
...
...
src/vs/editor/browser/controller/textAreaState.ts
浏览文件 @
aa5866f1
...
@@ -4,11 +4,9 @@
...
@@ -4,11 +4,9 @@
*--------------------------------------------------------------------------------------------*/
*--------------------------------------------------------------------------------------------*/
'
use strict
'
;
'
use strict
'
;
import
EditorCommon
=
require
(
'
vs/editor/common/editorCommon
'
);
import
*
as
EditorCommon
from
'
vs/editor/common/editorCommon
'
;
import
DomUtils
=
require
(
'
vs/base/browser/dom
'
);
import
Browser
=
require
(
'
vs/base/browser/browser
'
);
import
{
Range
}
from
'
vs/editor/common/core/range
'
;
import
{
Range
}
from
'
vs/editor/common/core/range
'
;
import
Event
,
{
Emitter
}
from
'
vs/base/common/event
'
;
import
Event
from
'
vs/base/common/event
'
;
export
interface
ITextAreaStyle
{
export
interface
ITextAreaStyle
{
top
:
string
;
top
:
string
;
...
@@ -17,16 +15,26 @@ export interface ITextAreaStyle {
...
@@ -17,16 +15,26 @@ export interface ITextAreaStyle {
height
:
string
;
height
:
string
;
}
}
export
interface
IClipboardEvent
{
canUseTextData
():
boolean
;
setTextData
(
text
:
string
):
void
;
getTextData
():
string
;
}
export
interface
IKeyboardEventWrapper
{
actual
:
any
;
}
export
interface
ITextAreaWrapper
{
export
interface
ITextAreaWrapper
{
onKeyDown
:
Event
<
DomUtils
.
IKeyboardEvent
>
;
onKeyDown
:
Event
<
IKeyboardEventWrapper
>
;
onKeyUp
:
Event
<
DomUtils
.
IKeyboardEvent
>
;
onKeyUp
:
Event
<
IKeyboardEventWrapper
>
;
onKeyPress
:
Event
<
DomUtils
.
IKeyboardEvent
>
;
onKeyPress
:
Event
<
IKeyboardEventWrapper
>
;
onCompositionStart
:
Event
<
void
>
;
onCompositionStart
:
Event
<
void
>
;
onCompositionEnd
:
Event
<
void
>
;
onCompositionEnd
:
Event
<
void
>
;
onInput
:
Event
<
void
>
;
onInput
:
Event
<
void
>
;
onCut
:
Event
<
ClipboardEvent
>
;
onCut
:
Event
<
I
ClipboardEvent
>
;
onCopy
:
Event
<
ClipboardEvent
>
;
onCopy
:
Event
<
I
ClipboardEvent
>
;
onPaste
:
Event
<
ClipboardEvent
>
;
onPaste
:
Event
<
I
ClipboardEvent
>
;
value
:
string
;
value
:
string
;
selectionStart
:
number
;
selectionStart
:
number
;
...
@@ -69,15 +77,10 @@ export class TextAreaState {
...
@@ -69,15 +77,10 @@ export class TextAreaState {
}
}
public
static
fromEditorSelectionAndPreviousState
(
model
:
ISimpleModel
,
selection
:
EditorCommon
.
IEditorRange
,
previousSelectionToken
:
number
):
TextAreaState
{
public
static
fromEditorSelectionAndPreviousState
(
model
:
ISimpleModel
,
selection
:
EditorCommon
.
IEditorRange
,
previousSelectionToken
:
number
):
TextAreaState
{
if
(
Browser
.
isIPad
)
{
let
LIMIT_CHARS
=
100
;
// Do not place anything in the textarea for the iPad
let
PADDING_LINES_COUNT
=
0
;
return
new
TextAreaState
(
''
,
0
,
0
,
false
,
selectionStartLineNumber
);
}
var
LIMIT_CHARS
=
100
;
var
PADDING_LINES_COUNT
=
0
;
var
selectionStartLineNumber
=
selection
.
startLineNumber
,
let
selectionStartLineNumber
=
selection
.
startLineNumber
,
selectionStartColumn
=
selection
.
startColumn
,
selectionStartColumn
=
selection
.
startColumn
,
selectionEndLineNumber
=
selection
.
endLineNumber
,
selectionEndLineNumber
=
selection
.
endLineNumber
,
selectionEndColumn
=
selection
.
endColumn
,
selectionEndColumn
=
selection
.
endColumn
,
...
@@ -90,8 +93,8 @@ export class TextAreaState {
...
@@ -90,8 +93,8 @@ export class TextAreaState {
}
}
// `pretext` contains the text before the selection
// `pretext` contains the text before the selection
var
pretext
=
''
;
let
pretext
=
''
;
var
startLineNumber
=
Math
.
max
(
1
,
selectionStartLineNumber
-
PADDING_LINES_COUNT
);
let
startLineNumber
=
Math
.
max
(
1
,
selectionStartLineNumber
-
PADDING_LINES_COUNT
);
if
(
startLineNumber
<
selectionStartLineNumber
)
{
if
(
startLineNumber
<
selectionStartLineNumber
)
{
pretext
=
model
.
getValueInRange
(
new
Range
(
startLineNumber
,
1
,
selectionStartLineNumber
,
1
),
EditorCommon
.
EndOfLinePreference
.
LF
);
pretext
=
model
.
getValueInRange
(
new
Range
(
startLineNumber
,
1
,
selectionStartLineNumber
,
1
),
EditorCommon
.
EndOfLinePreference
.
LF
);
}
}
...
@@ -102,8 +105,8 @@ export class TextAreaState {
...
@@ -102,8 +105,8 @@ export class TextAreaState {
// `posttext` contains the text after the selection
// `posttext` contains the text after the selection
var
posttext
=
''
;
let
posttext
=
''
;
var
endLineNumber
=
Math
.
min
(
selectionEndLineNumber
+
PADDING_LINES_COUNT
,
model
.
getLineCount
());
let
endLineNumber
=
Math
.
min
(
selectionEndLineNumber
+
PADDING_LINES_COUNT
,
model
.
getLineCount
());
posttext
+=
model
.
getValueInRange
(
new
Range
(
selectionEndLineNumber
,
selectionEndColumn
,
selectionEndLineNumber
,
selectionEndLineNumberMaxColumn
),
EditorCommon
.
EndOfLinePreference
.
LF
);
posttext
+=
model
.
getValueInRange
(
new
Range
(
selectionEndLineNumber
,
selectionEndColumn
,
selectionEndLineNumber
,
selectionEndLineNumberMaxColumn
),
EditorCommon
.
EndOfLinePreference
.
LF
);
if
(
endLineNumber
>
selectionEndLineNumber
)
{
if
(
endLineNumber
>
selectionEndLineNumber
)
{
posttext
=
'
\n
'
+
model
.
getValueInRange
(
new
Range
(
selectionEndLineNumber
+
1
,
1
,
endLineNumber
,
model
.
getLineMaxColumn
(
endLineNumber
)),
EditorCommon
.
EndOfLinePreference
.
LF
);
posttext
=
'
\n
'
+
model
.
getValueInRange
(
new
Range
(
selectionEndLineNumber
+
1
,
1
,
endLineNumber
,
model
.
getLineMaxColumn
(
endLineNumber
)),
EditorCommon
.
EndOfLinePreference
.
LF
);
...
@@ -114,7 +117,7 @@ export class TextAreaState {
...
@@ -114,7 +117,7 @@ export class TextAreaState {
// `text` contains the text of the selection
// `text` contains the text of the selection
var
text
=
model
.
getValueInRange
(
new
Range
(
selectionStartLineNumber
,
selectionStartColumn
,
selectionEndLineNumber
,
selectionEndColumn
),
EditorCommon
.
EndOfLinePreference
.
LF
);
let
text
=
model
.
getValueInRange
(
new
Range
(
selectionStartLineNumber
,
selectionStartColumn
,
selectionEndLineNumber
,
selectionEndColumn
),
EditorCommon
.
EndOfLinePreference
.
LF
);
if
(
text
.
length
>
2
*
LIMIT_CHARS
)
{
if
(
text
.
length
>
2
*
LIMIT_CHARS
)
{
text
=
text
.
substring
(
0
,
LIMIT_CHARS
)
+
String
.
fromCharCode
(
8230
)
+
text
.
substring
(
text
.
length
-
LIMIT_CHARS
,
text
.
length
);
text
=
text
.
substring
(
0
,
LIMIT_CHARS
)
+
String
.
fromCharCode
(
8230
)
+
text
.
substring
(
text
.
length
-
LIMIT_CHARS
,
text
.
length
);
}
}
...
@@ -157,14 +160,14 @@ export class TextAreaState {
...
@@ -157,14 +160,14 @@ export class TextAreaState {
if
(
!
previousState
)
{
if
(
!
previousState
)
{
return
this
.
value
;
return
this
.
value
;
}
}
var
previousPrefix
=
previousState
.
value
.
substring
(
0
,
previousState
.
selectionStart
);
let
previousPrefix
=
previousState
.
value
.
substring
(
0
,
previousState
.
selectionStart
);
var
previousSuffix
=
previousState
.
value
.
substring
(
previousState
.
selectionEnd
,
previousState
.
value
.
length
);
let
previousSuffix
=
previousState
.
value
.
substring
(
previousState
.
selectionEnd
,
previousState
.
value
.
length
);
if
(
this
.
isInOverwriteMode
)
{
if
(
this
.
isInOverwriteMode
)
{
previousSuffix
=
previousSuffix
.
substr
(
1
);
previousSuffix
=
previousSuffix
.
substr
(
1
);
}
}
var
value
=
this
.
value
;
let
value
=
this
.
value
;
if
(
value
.
substring
(
0
,
previousPrefix
.
length
)
===
previousPrefix
)
{
if
(
value
.
substring
(
0
,
previousPrefix
.
length
)
===
previousPrefix
)
{
value
=
value
.
substring
(
previousPrefix
.
length
);
value
=
value
.
substring
(
previousPrefix
.
length
);
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录