Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
b435511d
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
b435511d
编写于
12月 17, 2019
作者:
M
Matt Bierner
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fixing undo/redo for new custom editor proposal
上级
215e8524
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
33 addition
and
16 deletion
+33
-16
src/vs/workbench/api/browser/mainThreadWebview.ts
src/vs/workbench/api/browser/mainThreadWebview.ts
+33
-16
未找到文件。
src/vs/workbench/api/browser/mainThreadWebview.ts
浏览文件 @
b435511d
...
...
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import
{
onUnexpectedError
}
from
'
vs/base/common/errors
'
;
import
{
Disposable
,
IDisposable
,
DisposableStor
e
}
from
'
vs/base/common/lifecycle
'
;
import
{
Disposable
,
DisposableStore
,
IDisposabl
e
}
from
'
vs/base/common/lifecycle
'
;
import
{
Schemas
}
from
'
vs/base/common/network
'
;
import
{
isWeb
}
from
'
vs/base/common/platform
'
;
import
{
startsWith
}
from
'
vs/base/common/strings
'
;
...
...
@@ -20,7 +20,7 @@ import { editorGroupToViewColumn, EditorViewColumn, viewColumnToEditorGroup } fr
import
{
IEditorInput
}
from
'
vs/workbench/common/editor
'
;
import
{
DiffEditorInput
}
from
'
vs/workbench/common/editor/diffEditorInput
'
;
import
{
CustomFileEditorInput
}
from
'
vs/workbench/contrib/customEditor/browser/customEditorInput
'
;
import
{
ICustomEditorService
}
from
'
vs/workbench/contrib/customEditor/common/customEditor
'
;
import
{
ICustomEditor
Model
,
ICustomEditor
Service
}
from
'
vs/workbench/contrib/customEditor/common/customEditor
'
;
import
{
WebviewExtensionDescription
}
from
'
vs/workbench/contrib/webview/browser/webview
'
;
import
{
WebviewInput
}
from
'
vs/workbench/contrib/webview/browser/webviewEditorInput
'
;
import
{
ICreateWebViewShowOptions
,
IWebviewWorkbenchService
,
WebviewInputOptions
}
from
'
vs/workbench/contrib/webview/browser/webviewWorkbenchService
'
;
...
...
@@ -95,6 +95,7 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma
private
readonly
_webviewInputs
=
new
WebviewInputStore
();
private
readonly
_revivers
=
new
Map
<
string
,
IDisposable
>
();
private
readonly
_editorProviders
=
new
Map
<
string
,
IDisposable
>
();
private
readonly
_customEditorModels
=
new
Map
<
ICustomEditorModel
,
{
referenceCount
:
number
}
>
();
constructor
(
context
:
extHostProtocol
.
IExtHostContext
,
...
...
@@ -272,10 +273,9 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma
webviewInput
.
webview
.
extension
=
extension
;
const
resource
=
webviewInput
.
getResource
();
const
model
=
await
this
.
loadOrCreate
Model
(
webviewInput
,
resource
,
viewType
,
capabilities
);
const
model
=
await
this
.
retainCustomEditor
Model
(
webviewInput
,
resource
,
viewType
,
capabilities
);
webviewInput
.
onDisposeWebview
(()
=>
{
// TODO: This should be reference counted
this
.
_customEditorService
.
models
.
disposeModel
(
model
);
this
.
releaseCustomEditorModel
(
model
);
});
try
{
...
...
@@ -306,36 +306,53 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma
this
.
_editorProviders
.
delete
(
viewType
);
}
private
async
loadOrCreateModel
(
webviewInput
:
WebviewInput
,
resource
:
URI
,
viewType
:
string
,
capabilities
:
readonly
extHostProtocol
.
WebviewEditorCapabilities
[])
{
const
existingModel
=
this
.
_customEditorService
.
models
.
get
(
webviewInput
.
getResource
(),
webviewInput
.
viewType
);
if
(
existingModel
)
{
return
existingModel
;
private
async
retainCustomEditorModel
(
webviewInput
:
WebviewInput
,
resource
:
URI
,
viewType
:
string
,
capabilities
:
readonly
extHostProtocol
.
WebviewEditorCapabilities
[])
{
const
model
=
await
this
.
_customEditorService
.
models
.
loadOrCreate
(
webviewInput
.
getResource
(),
webviewInput
.
viewType
);
const
existingEntry
=
this
.
_customEditorModels
.
get
(
model
);
if
(
existingEntry
)
{
++
existingEntry
.
referenceCount
;
// no need to hook up listeners again
return
model
;
}
const
newModel
=
await
this
.
_customEditorService
.
models
.
loadOrCreate
(
webviewInput
.
getResource
(),
webviewInput
.
viewType
);
this
.
_customEditorModels
.
set
(
model
,
{
referenceCount
:
1
}
);
const
capabilitiesSet
=
new
Set
(
capabilities
);
if
(
capabilitiesSet
.
has
(
extHostProtocol
.
WebviewEditorCapabilities
.
Editable
))
{
newM
odel
.
onUndo
(
edits
=>
{
m
odel
.
onUndo
(
edits
=>
{
this
.
_proxy
.
$undoEdits
(
resource
,
viewType
,
edits
.
map
(
x
=>
x
.
data
));
});
newM
odel
.
onApplyEdit
(
edits
=>
{
const
editsToApply
=
edits
.
filter
(
x
=>
x
.
source
!==
newM
odel
).
map
(
x
=>
x
.
data
);
m
odel
.
onApplyEdit
(
edits
=>
{
const
editsToApply
=
edits
.
filter
(
x
=>
x
.
source
!==
m
odel
).
map
(
x
=>
x
.
data
);
if
(
editsToApply
.
length
)
{
this
.
_proxy
.
$applyEdits
(
resource
,
viewType
,
editsToApply
);
}
});
newM
odel
.
onWillSave
(
e
=>
{
m
odel
.
onWillSave
(
e
=>
{
e
.
waitUntil
(
this
.
_proxy
.
$onSave
(
resource
.
toJSON
(),
viewType
));
});
newM
odel
.
onWillSaveAs
(
e
=>
{
m
odel
.
onWillSaveAs
(
e
=>
{
e
.
waitUntil
(
this
.
_proxy
.
$onSaveAs
(
e
.
resource
.
toJSON
(),
viewType
,
e
.
targetResource
.
toJSON
()));
});
}
return
newModel
;
return
model
;
}
private
async
releaseCustomEditorModel
(
model
:
ICustomEditorModel
)
{
const
entry
=
this
.
_customEditorModels
.
get
(
model
);
if
(
!
entry
)
{
return
;
}
--
entry
.
referenceCount
;
if
(
entry
.
referenceCount
<=
0
)
{
this
.
_customEditorService
.
models
.
disposeModel
(
model
);
this
.
_customEditorModels
.
delete
(
model
);
}
}
public
$onEdit
(
resource
:
UriComponents
,
viewType
:
string
,
editData
:
any
):
void
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录