Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
1b575168
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,发现更多精彩内容 >>
提交
1b575168
编写于
1月 28, 2019
作者:
R
Rob Lourens
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix #65451 - keep search tree element collapse state when refreshing
上级
d9e6741a
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
51 addition
and
56 deletion
+51
-56
src/vs/workbench/parts/search/browser/searchView.ts
src/vs/workbench/parts/search/browser/searchView.ts
+50
-46
src/vs/workbench/parts/search/test/browser/searchViewlet.test.ts
...workbench/parts/search/test/browser/searchViewlet.test.ts
+1
-10
未找到文件。
src/vs/workbench/parts/search/browser/searchView.ts
浏览文件 @
1b575168
...
...
@@ -65,49 +65,6 @@ import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/un
const
$
=
dom
.
$
;
function
createResultIterator
(
searchResult
:
SearchResult
,
collapseResults
:
ISearchConfigurationProperties
[
'
collapseResults
'
]):
Iterator
<
ITreeElement
<
RenderableMatch
>>
{
const
folderMatches
=
searchResult
.
folderMatches
()
.
filter
(
fm
=>
!
fm
.
isEmpty
())
.
sort
(
searchMatchComparer
);
if
(
folderMatches
.
length
===
1
)
{
return
createFolderIterator
(
folderMatches
[
0
],
collapseResults
);
}
const
foldersIt
=
Iterator
.
fromArray
(
folderMatches
);
return
Iterator
.
map
(
foldersIt
,
folderMatch
=>
{
const
children
=
createFolderIterator
(
folderMatch
,
collapseResults
);
return
<
ITreeElement
<
RenderableMatch
>>
{
element
:
folderMatch
,
children
};
});
}
function
createFolderIterator
(
folderMatch
:
FolderMatch
,
collapseResults
:
ISearchConfigurationProperties
[
'
collapseResults
'
]):
Iterator
<
ITreeElement
<
RenderableMatch
>>
{
const
filesIt
=
Iterator
.
fromArray
(
folderMatch
.
matches
()
.
sort
(
searchMatchComparer
));
return
Iterator
.
map
(
filesIt
,
fileMatch
=>
{
const
children
=
createFileIterator
(
fileMatch
);
const
collapsed
=
collapseResults
===
'
alwaysCollapse
'
||
(
fileMatch
.
matches
().
length
>
10
&&
collapseResults
!==
'
alwaysExpand
'
);
return
<
ITreeElement
<
RenderableMatch
>>
{
element
:
fileMatch
,
children
,
collapsed
};
});
}
function
createFileIterator
(
fileMatch
:
FileMatch
):
Iterator
<
ITreeElement
<
RenderableMatch
>>
{
const
matchesIt
=
Iterator
.
from
(
fileMatch
.
matches
()
.
sort
(
searchMatchComparer
));
return
Iterator
.
map
(
matchesIt
,
r
=>
(
<
ITreeElement
<
RenderableMatch
>>
{
element
:
r
}));
}
export
function
createIterator
(
match
:
FolderMatch
|
FileMatch
|
SearchResult
,
collapseResults
:
ISearchConfigurationProperties
[
'
collapseResults
'
]):
Iterator
<
ITreeElement
<
RenderableMatch
>>
{
return
match
instanceof
SearchResult
?
createResultIterator
(
match
,
collapseResults
)
:
match
instanceof
FolderMatch
?
createFolderIterator
(
match
,
collapseResults
)
:
createFileIterator
(
match
);
}
export
class
SearchView
extends
Viewlet
implements
IViewlet
,
IPanel
{
private
static
readonly
MAX_TEXT_RESULTS
=
10000
;
...
...
@@ -483,21 +440,68 @@ export class SearchView extends Viewlet implements IViewlet, IPanel {
refreshTree
(
event
?:
IChangeEvent
):
void
{
const
collapseResults
=
this
.
configurationService
.
getValue
<
ISearchConfigurationProperties
>
(
'
search
'
).
collapseResults
;
if
(
!
event
||
event
.
added
||
event
.
removed
)
{
this
.
tree
.
setChildren
(
null
,
createResultIterator
(
this
.
viewModel
.
searchResult
,
collapseResults
));
this
.
tree
.
setChildren
(
null
,
this
.
createResultIterator
(
collapseResults
));
}
else
{
event
.
elements
.
forEach
(
element
=>
{
if
(
element
instanceof
FolderMatch
)
{
// The folder may or may not be in the tree. Refresh the whole thing.
this
.
tree
.
setChildren
(
null
,
createResultIterator
(
this
.
viewModel
.
searchResult
,
collapseResults
));
this
.
tree
.
setChildren
(
null
,
this
.
createResultIterator
(
collapseResults
));
return
;
}
const
root
=
element
instanceof
SearchResult
?
null
:
element
;
this
.
tree
.
setChildren
(
root
,
createIterator
(
element
,
collapseResults
));
this
.
tree
.
setChildren
(
root
,
this
.
createIterator
(
element
,
collapseResults
));
});
}
}
private
createResultIterator
(
collapseResults
:
ISearchConfigurationProperties
[
'
collapseResults
'
]):
Iterator
<
ITreeElement
<
RenderableMatch
>>
{
const
folderMatches
=
this
.
searchResult
.
folderMatches
()
.
filter
(
fm
=>
!
fm
.
isEmpty
())
.
sort
(
searchMatchComparer
);
if
(
folderMatches
.
length
===
1
)
{
return
this
.
createFolderIterator
(
folderMatches
[
0
],
collapseResults
);
}
const
foldersIt
=
Iterator
.
fromArray
(
folderMatches
);
return
Iterator
.
map
(
foldersIt
,
folderMatch
=>
{
const
children
=
this
.
createFolderIterator
(
folderMatch
,
collapseResults
);
return
<
ITreeElement
<
RenderableMatch
>>
{
element
:
folderMatch
,
children
};
});
}
private
createFolderIterator
(
folderMatch
:
FolderMatch
,
collapseResults
:
ISearchConfigurationProperties
[
'
collapseResults
'
]):
Iterator
<
ITreeElement
<
RenderableMatch
>>
{
const
filesIt
=
Iterator
.
fromArray
(
folderMatch
.
matches
()
.
sort
(
searchMatchComparer
));
return
Iterator
.
map
(
filesIt
,
fileMatch
=>
{
const
children
=
this
.
createFileIterator
(
fileMatch
);
let
nodeExists
=
true
;
try
{
this
.
tree
.
getNode
(
fileMatch
);
}
catch
(
e
)
{
nodeExists
=
false
;
}
const
collapsed
=
nodeExists
?
undefined
:
(
collapseResults
===
'
alwaysCollapse
'
||
(
fileMatch
.
matches
().
length
>
10
&&
collapseResults
!==
'
alwaysExpand
'
));
return
<
ITreeElement
<
RenderableMatch
>>
{
element
:
fileMatch
,
children
,
collapsed
};
});
}
private
createFileIterator
(
fileMatch
:
FileMatch
):
Iterator
<
ITreeElement
<
RenderableMatch
>>
{
const
matchesIt
=
Iterator
.
from
(
fileMatch
.
matches
()
.
sort
(
searchMatchComparer
));
return
Iterator
.
map
(
matchesIt
,
r
=>
(
<
ITreeElement
<
RenderableMatch
>>
{
element
:
r
}));
}
private
createIterator
(
match
:
FolderMatch
|
FileMatch
|
SearchResult
,
collapseResults
:
ISearchConfigurationProperties
[
'
collapseResults
'
]):
Iterator
<
ITreeElement
<
RenderableMatch
>>
{
return
match
instanceof
SearchResult
?
this
.
createResultIterator
(
collapseResults
)
:
match
instanceof
FolderMatch
?
this
.
createFolderIterator
(
match
,
collapseResults
)
:
this
.
createFileIterator
(
match
);
}
private
replaceAll
():
void
{
if
(
this
.
viewModel
.
searchResult
.
count
()
===
0
)
{
return
;
...
...
src/vs/workbench/parts/search/test/browser/searchViewlet.test.ts
浏览文件 @
1b575168
...
...
@@ -12,11 +12,8 @@ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/
import
{
IFileMatch
,
ITextSearchMatch
,
OneLineRange
,
QueryType
}
from
'
vs/platform/search/common/search
'
;
import
{
IWorkspaceContextService
}
from
'
vs/platform/workspace/common/workspace
'
;
import
{
TestWorkspace
}
from
'
vs/platform/workspace/test/common/testWorkspace
'
;
import
{
FileMatch
,
Match
,
SearchResult
,
RenderableMatch
,
searchMatchComparer
}
from
'
vs/workbench/parts/search/common/searchModel
'
;
import
{
FileMatch
,
Match
,
searchMatchComparer
,
SearchResult
}
from
'
vs/workbench/parts/search/common/searchModel
'
;
import
{
TestContextService
}
from
'
vs/workbench/test/workbenchTestServices
'
;
import
{
createIterator
}
from
'
vs/workbench/parts/search/browser/searchView
'
;
import
{
ITreeElement
}
from
'
vs/base/browser/ui/tree/tree
'
;
import
{
Iterator
}
from
'
vs/base/common/iterator
'
;
suite
(
'
Search - Viewlet
'
,
()
=>
{
let
instantiation
:
TestInstantiationService
;
...
...
@@ -63,12 +60,6 @@ suite('Search - Viewlet', () => {
assert
.
equal
(
fileMatch
.
id
(),
'
file:///c%3A/foo
'
);
assert
.
equal
(
lineMatch
.
id
(),
'
file:///c%3A/foo>[2,1 -> 2,2]b
'
);
const
resultIterator
=
createIterator
(
result
,
'
auto
'
);
const
first
=
resultIterator
.
next
();
assert
(
!!
first
.
value
!
.
children
);
assert
.
equal
((
<
Iterator
<
ITreeElement
<
RenderableMatch
>>>
first
.
value
!
.
children
).
next
().
value
!
.
element
.
id
(),
'
file:///c%3A/foo>[2,1 -> 2,2]b
'
);
});
test
(
'
Comparer
'
,
()
=>
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录