Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
b07b786e
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,发现更多精彩内容 >>
提交
b07b786e
编写于
4月 05, 2018
作者:
A
Alex Dima
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Better usage of editor API
上级
dd460f29
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
93 addition
and
111 deletion
+93
-111
src/vs/editor/browser/widget/diffEditorWidget.ts
src/vs/editor/browser/widget/diffEditorWidget.ts
+1
-6
src/vs/editor/contrib/colorPicker/colorDetector.ts
src/vs/editor/contrib/colorPicker/colorDetector.ts
+2
-1
src/vs/editor/contrib/dnd/dnd.ts
src/vs/editor/contrib/dnd/dnd.ts
+6
-11
src/vs/editor/contrib/folding/foldingDecorations.ts
src/vs/editor/contrib/folding/foldingDecorations.ts
+6
-6
src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.ts
src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.ts
+1
-4
src/vs/editor/contrib/links/links.ts
src/vs/editor/contrib/links/links.ts
+20
-22
src/vs/editor/contrib/multicursor/multicursor.ts
src/vs/editor/contrib/multicursor/multicursor.ts
+1
-3
src/vs/editor/contrib/referenceSearch/referencesWidget.ts
src/vs/editor/contrib/referenceSearch/referencesWidget.ts
+25
-30
src/vs/editor/contrib/snippet/snippetSession.ts
src/vs/editor/contrib/snippet/snippetSession.ts
+3
-1
src/vs/editor/standalone/browser/quickOpen/editorQuickOpen.ts
...vs/editor/standalone/browser/quickOpen/editorQuickOpen.ts
+16
-20
src/vs/workbench/parts/debug/electron-browser/debugHover.ts
src/vs/workbench/parts/debug/electron-browser/debugHover.ts
+6
-3
src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts
...rkbench/parts/preferences/browser/preferencesRenderers.ts
+6
-4
未找到文件。
src/vs/editor/browser/widget/diffEditorWidget.ts
浏览文件 @
b07b786e
...
...
@@ -99,12 +99,7 @@ class VisualEditorState {
this
.
_zonesMap
=
{};
// (2) Model decorations
if
(
this
.
_decorations
.
length
>
0
)
{
editor
.
changeDecorations
((
changeAccessor
:
IModelDecorationsChangeAccessor
)
=>
{
changeAccessor
.
deltaDecorations
(
this
.
_decorations
,
[]);
});
}
this
.
_decorations
=
[];
this
.
_decorations
=
editor
.
deltaDecorations
(
this
.
_decorations
,
[]);
}
public
apply
(
editor
:
CodeEditor
,
overviewRuler
:
editorBrowser
.
IOverviewRuler
,
newDecorations
:
IEditorDiffDecorationsWithZones
):
void
{
...
...
src/vs/editor/contrib/colorPicker/colorDetector.ts
浏览文件 @
b07b786e
...
...
@@ -16,6 +16,7 @@ import { ColorProviderRegistry } from 'vs/editor/common/modes';
import
{
ICodeEditorService
}
from
'
vs/editor/browser/services/codeEditorService
'
;
import
{
getColors
,
IColorData
}
from
'
vs/editor/contrib/colorPicker/color
'
;
import
{
IConfigurationService
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
ModelDecorationOptions
}
from
'
vs/editor/common/model/textModel
'
;
const
MAX_DECORATORS
=
500
;
...
...
@@ -153,7 +154,7 @@ export class ColorDetector implements IEditorContribution {
endLineNumber
:
c
.
colorInfo
.
range
.
endLineNumber
,
endColumn
:
c
.
colorInfo
.
range
.
endColumn
},
options
:
{}
options
:
ModelDecorationOptions
.
EMPTY
}));
this
.
_decorationsIds
=
this
.
_editor
.
deltaDecorations
(
this
.
_decorationsIds
,
decorations
);
...
...
src/vs/editor/contrib/dnd/dnd.ts
浏览文件 @
b07b786e
...
...
@@ -173,22 +173,17 @@ export class DragAndDropController implements editorCommon.IEditorContribution {
});
public
showAt
(
position
:
Position
):
void
{
this
.
_editor
.
changeDecorations
(
changeAccessor
=>
{
let
newDecorations
:
IModelDeltaDecoration
[]
=
[];
newDecorations
.
push
({
range
:
new
Range
(
position
.
lineNumber
,
position
.
column
,
position
.
lineNumber
,
position
.
column
),
options
:
DragAndDropController
.
_DECORATION_OPTIONS
});
let
newDecorations
:
IModelDeltaDecoration
[]
=
[{
range
:
new
Range
(
position
.
lineNumber
,
position
.
column
,
position
.
lineNumber
,
position
.
column
),
options
:
DragAndDropController
.
_DECORATION_OPTIONS
}];
this
.
_dndDecorationIds
=
changeAccessor
.
deltaDecorations
(
this
.
_dndDecorationIds
,
newDecorations
);
});
this
.
_dndDecorationIds
=
this
.
_editor
.
deltaDecorations
(
this
.
_dndDecorationIds
,
newDecorations
);
this
.
_editor
.
revealPosition
(
position
,
editorCommon
.
ScrollType
.
Immediate
);
}
private
_removeDecoration
():
void
{
this
.
_editor
.
changeDecorations
(
changeAccessor
=>
{
changeAccessor
.
deltaDecorations
(
this
.
_dndDecorationIds
,
[]);
});
this
.
_dndDecorationIds
=
this
.
_editor
.
deltaDecorations
(
this
.
_dndDecorationIds
,
[]);
}
private
_hitContent
(
target
:
IMouseTarget
):
boolean
{
...
...
src/vs/editor/contrib/folding/foldingDecorations.ts
浏览文件 @
b07b786e
...
...
@@ -10,18 +10,18 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
export
class
FoldingDecorationProvider
implements
IDecorationProvider
{
private
COLLAPSED_VISUAL_DECORATION
=
ModelDecorationOptions
.
register
({
private
static
COLLAPSED_VISUAL_DECORATION
=
ModelDecorationOptions
.
register
({
stickiness
:
TrackedRangeStickiness
.
NeverGrowsWhenTypingAtEdges
,
afterContentClassName
:
'
inline-folded
'
,
linesDecorationsClassName
:
'
folding collapsed
'
});
private
EXPANDED_AUTO_HIDE_VISUAL_DECORATION
=
ModelDecorationOptions
.
register
({
private
static
EXPANDED_AUTO_HIDE_VISUAL_DECORATION
=
ModelDecorationOptions
.
register
({
stickiness
:
TrackedRangeStickiness
.
NeverGrowsWhenTypingAtEdges
,
linesDecorationsClassName
:
'
folding
'
});
private
EXPANDED_VISUAL_DECORATION
=
ModelDecorationOptions
.
register
({
private
static
EXPANDED_VISUAL_DECORATION
=
ModelDecorationOptions
.
register
({
stickiness
:
TrackedRangeStickiness
.
NeverGrowsWhenTypingAtEdges
,
linesDecorationsClassName
:
'
folding alwaysShowFoldIcons
'
});
...
...
@@ -33,11 +33,11 @@ export class FoldingDecorationProvider implements IDecorationProvider {
getDecorationOption
(
isCollapsed
:
boolean
):
ModelDecorationOptions
{
if
(
isCollapsed
)
{
return
this
.
COLLAPSED_VISUAL_DECORATION
;
return
FoldingDecorationProvider
.
COLLAPSED_VISUAL_DECORATION
;
}
else
if
(
this
.
autoHideFoldingControls
)
{
return
this
.
EXPANDED_AUTO_HIDE_VISUAL_DECORATION
;
return
FoldingDecorationProvider
.
EXPANDED_AUTO_HIDE_VISUAL_DECORATION
;
}
else
{
return
this
.
EXPANDED_VISUAL_DECORATION
;
return
FoldingDecorationProvider
.
EXPANDED_VISUAL_DECORATION
;
}
}
...
...
src/vs/editor/contrib/inPlaceReplace/inPlaceReplace.ts
浏览文件 @
b07b786e
...
...
@@ -10,7 +10,6 @@ import { TPromise } from 'vs/base/common/winjs.base';
import
{
Range
}
from
'
vs/editor/common/core/range
'
;
import
{
Selection
}
from
'
vs/editor/common/core/selection
'
;
import
{
IEditorContribution
}
from
'
vs/editor/common/editorCommon
'
;
import
{
IModelDecorationsChangeAccessor
}
from
'
vs/editor/common/model
'
;
import
{
EditorContextKeys
}
from
'
vs/editor/common/editorContextKeys
'
;
import
{
registerEditorAction
,
ServicesAccessor
,
EditorAction
,
registerEditorContribution
}
from
'
vs/editor/browser/editorExtensions
'
;
import
{
IInplaceReplaceSupportResult
}
from
'
vs/editor/common/modes
'
;
...
...
@@ -131,9 +130,7 @@ class InPlaceReplaceController implements IEditorContribution {
this
.
decorationRemover
.
cancel
();
this
.
decorationRemover
=
TPromise
.
timeout
(
350
);
this
.
decorationRemover
.
then
(()
=>
{
this
.
editor
.
changeDecorations
((
accessor
:
IModelDecorationsChangeAccessor
)
=>
{
this
.
decorationIds
=
accessor
.
deltaDecorations
(
this
.
decorationIds
,
[]);
});
this
.
decorationIds
=
this
.
editor
.
deltaDecorations
(
this
.
decorationIds
,
[]);
});
});
}
...
...
src/vs/editor/contrib/links/links.ts
浏览文件 @
b07b786e
...
...
@@ -251,32 +251,30 @@ class LinkDetector implements editorCommon.IEditorContribution {
private
updateDecorations
(
links
:
Link
[]):
void
{
const
useMetaKey
=
(
this
.
editor
.
getConfiguration
().
multiCursorModifier
===
'
altKey
'
);
this
.
editor
.
changeDecorations
((
changeAccessor
:
IModelDecorationsChangeAccessor
)
=>
{
var
oldDecorations
:
string
[]
=
[];
let
keys
=
Object
.
keys
(
this
.
currentOccurrences
);
for
(
let
i
=
0
,
len
=
keys
.
length
;
i
<
len
;
i
++
)
{
let
decorationId
=
keys
[
i
];
let
occurance
=
this
.
currentOccurrences
[
decorationId
];
oldDecorations
.
push
(
occurance
.
decorationId
);
}
let
oldDecorations
:
string
[]
=
[];
let
keys
=
Object
.
keys
(
this
.
currentOccurrences
);
for
(
let
i
=
0
,
len
=
keys
.
length
;
i
<
len
;
i
++
)
{
let
decorationId
=
keys
[
i
];
let
occurance
=
this
.
currentOccurrences
[
decorationId
];
oldDecorations
.
push
(
occurance
.
decorationId
);
}
var
newDecorations
:
IModelDeltaDecoration
[]
=
[];
if
(
links
)
{
// Not sure why this is sometimes null
for
(
var
i
=
0
;
i
<
links
.
length
;
i
++
)
{
newDecorations
.
push
(
LinkOccurrence
.
decoration
(
links
[
i
],
useMetaKey
));
}
let
newDecorations
:
IModelDeltaDecoration
[]
=
[];
if
(
links
)
{
// Not sure why this is sometimes null
for
(
let
i
=
0
;
i
<
links
.
length
;
i
++
)
{
newDecorations
.
push
(
LinkOccurrence
.
decoration
(
links
[
i
],
useMetaKey
));
}
}
var
decorations
=
changeAccess
or
.
deltaDecorations
(
oldDecorations
,
newDecorations
);
let
decorations
=
this
.
edit
or
.
deltaDecorations
(
oldDecorations
,
newDecorations
);
this
.
currentOccurrences
=
{};
this
.
activeLinkDecorationId
=
null
;
for
(
let
i
=
0
,
len
=
decorations
.
length
;
i
<
len
;
i
++
)
{
var
occurance
=
new
LinkOccurrence
(
links
[
i
],
decorations
[
i
]);
this
.
currentOccurrences
[
occurance
.
decorationId
]
=
occurance
;
}
});
this
.
currentOccurrences
=
{};
this
.
activeLinkDecorationId
=
null
;
for
(
let
i
=
0
,
len
=
decorations
.
length
;
i
<
len
;
i
++
)
{
let
occurance
=
new
LinkOccurrence
(
links
[
i
],
decorations
[
i
]);
this
.
currentOccurrences
[
occurance
.
decorationId
]
=
occurance
;
}
}
private
_onEditorMouseMove
(
mouseEvent
:
ClickLinkMouseEvent
,
withKey
?:
ClickLinkKeyboardEvent
):
void
{
...
...
src/vs/editor/contrib/multicursor/multicursor.ts
浏览文件 @
b07b786e
...
...
@@ -803,9 +803,7 @@ export class SelectionHighlighter extends Disposable implements IEditorContribut
this
.
state
=
state
;
if
(
!
this
.
state
)
{
if
(
this
.
decorations
.
length
>
0
)
{
this
.
decorations
=
this
.
editor
.
deltaDecorations
(
this
.
decorations
,
[]);
}
this
.
decorations
=
this
.
editor
.
deltaDecorations
(
this
.
decorations
,
[]);
return
;
}
...
...
src/vs/editor/contrib/referenceSearch/referencesWidget.ts
浏览文件 @
b07b786e
...
...
@@ -84,28 +84,25 @@ class DecorationsManager implements IDisposable {
private
_addDecorations
(
reference
:
FileReferences
):
void
{
this
.
_callOnModelChange
.
push
(
this
.
_editor
.
getModel
().
onDidChangeDecorations
((
event
)
=>
this
.
_onDecorationChanged
()));
this
.
_editor
.
changeDecorations
(
accessor
=>
{
const
newDecorations
:
IModelDeltaDecoration
[]
=
[];
const
newDecorationsActualIndex
:
number
[]
=
[];
const
newDecorations
:
IModelDeltaDecoration
[]
=
[];
const
newDecorationsActualIndex
:
number
[]
=
[];
for
(
let
i
=
0
,
len
=
reference
.
children
.
length
;
i
<
len
;
i
++
)
{
let
oneReference
=
reference
.
children
[
i
];
if
(
this
.
_decorationIgnoreSet
.
has
(
oneReference
.
id
))
{
continue
;
}
newDecorations
.
push
({
range
:
oneReference
.
range
,
options
:
DecorationsManager
.
DecorationOptions
});
newDecorationsActualIndex
.
push
(
i
);
for
(
let
i
=
0
,
len
=
reference
.
children
.
length
;
i
<
len
;
i
++
)
{
let
oneReference
=
reference
.
children
[
i
];
if
(
this
.
_decorationIgnoreSet
.
has
(
oneReference
.
id
))
{
continue
;
}
newDecorations
.
push
({
range
:
oneReference
.
range
,
options
:
DecorationsManager
.
DecorationOptions
});
newDecorationsActualIndex
.
push
(
i
);
}
const
decorations
=
accessor
.
deltaDecorations
([],
newDecorations
);
for
(
let
i
=
0
;
i
<
decorations
.
length
;
i
++
)
{
this
.
_decorations
.
set
(
decorations
[
i
],
reference
.
children
[
newDecorationsActualIndex
[
i
]]);
}
});
const
decorations
=
this
.
_editor
.
deltaDecorations
([],
newDecorations
);
for
(
let
i
=
0
;
i
<
decorations
.
length
;
i
++
)
{
this
.
_decorations
.
set
(
decorations
[
i
],
reference
.
children
[
newDecorationsActualIndex
[
i
]]);
}
}
private
_onDecorationChanged
():
void
{
...
...
@@ -143,21 +140,19 @@ class DecorationsManager implements IDisposable {
}
});
this
.
_editor
.
changeDecorations
((
accessor
)
=>
{
for
(
let
i
=
0
,
len
=
toRemove
.
length
;
i
<
len
;
i
++
)
{
this
.
_decorations
.
delete
(
toRemove
[
i
]);
}
accessor
.
deltaDecorations
(
toRemove
,
[]);
});
for
(
let
i
=
0
,
len
=
toRemove
.
length
;
i
<
len
;
i
++
)
{
this
.
_decorations
.
delete
(
toRemove
[
i
]);
}
this
.
_editor
.
deltaDecorations
(
toRemove
,
[]);
}
public
removeDecorations
():
void
{
this
.
_editor
.
changeDecorations
(
accessor
=>
{
this
.
_decorations
.
forEach
((
value
,
key
)
=>
{
accessor
.
removeDecoration
(
key
);
});
this
.
_decorations
.
clear
();
let
toRemove
:
string
[]
=
[];
this
.
_decorations
.
forEach
((
value
,
key
)
=>
{
toRemove
.
push
(
key
);
});
this
.
_editor
.
deltaDecorations
(
toRemove
,
[]);
this
.
_decorations
.
clear
();
}
}
...
...
src/vs/editor/contrib/snippet/snippetSession.ts
浏览文件 @
b07b786e
...
...
@@ -50,7 +50,9 @@ export class OneSnippet {
dispose
():
void
{
if
(
this
.
_placeholderDecorations
)
{
this
.
_editor
.
changeDecorations
(
accessor
=>
this
.
_placeholderDecorations
.
forEach
(
handle
=>
accessor
.
removeDecoration
(
handle
)));
let
toRemove
:
string
[]
=
[];
this
.
_placeholderDecorations
.
forEach
(
handle
=>
toRemove
.
push
(
handle
));
this
.
_editor
.
deltaDecorations
(
toRemove
,
[]);
}
this
.
_placeholderGroups
.
length
=
0
;
}
...
...
src/vs/editor/standalone/browser/quickOpen/editorQuickOpen.ts
浏览文件 @
b07b786e
...
...
@@ -14,7 +14,7 @@ import { registerEditorContribution, IActionOptions, EditorAction } from 'vs/edi
import
{
IThemeService
}
from
'
vs/platform/theme/common/themeService
'
;
import
{
Range
}
from
'
vs/editor/common/core/range
'
;
import
{
ModelDecorationOptions
}
from
'
vs/editor/common/model/textModel
'
;
import
{
IModelDe
corationsChangeAccessor
,
IModelDe
ltaDecoration
}
from
'
vs/editor/common/model
'
;
import
{
IModelDeltaDecoration
}
from
'
vs/editor/common/model
'
;
export
interface
IQuickOpenControllerOpts
{
inputAriaLabel
:
string
;
...
...
@@ -100,31 +100,27 @@ export class QuickOpenController implements editorCommon.IEditorContribution, ID
});
public
decorateLine
(
range
:
Range
,
editor
:
ICodeEditor
):
void
{
editor
.
changeDecorations
((
changeAccessor
:
IModelDecorationsChangeAccessor
)
=>
{
const
oldDecorations
:
string
[]
=
[];
if
(
this
.
rangeHighlightDecorationId
)
{
oldDecorations
.
push
(
this
.
rangeHighlightDecorationId
);
this
.
rangeHighlightDecorationId
=
null
;
}
const
oldDecorations
:
string
[]
=
[];
if
(
this
.
rangeHighlightDecorationId
)
{
oldDecorations
.
push
(
this
.
rangeHighlightDecorationId
);
this
.
rangeHighlightDecorationId
=
null
;
}
const
newDecorations
:
IModelDeltaDecoration
[]
=
[
{
range
:
range
,
options
:
QuickOpenController
.
_RANGE_HIGHLIGHT_DECORATION
}
];
const
newDecorations
:
IModelDeltaDecoration
[]
=
[
{
range
:
range
,
options
:
QuickOpenController
.
_RANGE_HIGHLIGHT_DECORATION
}
];
const
decorations
=
changeAccessor
.
deltaDecorations
(
oldDecorations
,
newDecorations
);
this
.
rangeHighlightDecorationId
=
decorations
[
0
];
});
const
decorations
=
editor
.
deltaDecorations
(
oldDecorations
,
newDecorations
);
this
.
rangeHighlightDecorationId
=
decorations
[
0
];
}
public
clearDecorations
():
void
{
if
(
this
.
rangeHighlightDecorationId
)
{
this
.
editor
.
changeDecorations
((
changeAccessor
:
IModelDecorationsChangeAccessor
)
=>
{
changeAccessor
.
deltaDecorations
([
this
.
rangeHighlightDecorationId
],
[]);
this
.
rangeHighlightDecorationId
=
null
;
});
this
.
editor
.
deltaDecorations
([
this
.
rangeHighlightDecorationId
],
[]);
this
.
rangeHighlightDecorationId
=
null
;
}
}
}
...
...
src/vs/workbench/parts/debug/electron-browser/debugHover.ts
浏览文件 @
b07b786e
...
...
@@ -27,6 +27,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService';
import
{
editorHoverBackground
,
editorHoverBorder
}
from
'
vs/platform/theme/common/colorRegistry
'
;
import
{
WorkbenchTree
,
WorkbenchTreeController
}
from
'
vs/platform/list/browser/listService
'
;
import
{
IConfigurationService
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
ModelDecorationOptions
}
from
'
vs/editor/common/model/textModel
'
;
const
$
=
dom
.
$
;
const
MAX_ELEMENTS_SHOWN
=
18
;
...
...
@@ -208,15 +209,17 @@ export class DebugHoverWidget implements IContentWidget {
this
.
highlightDecorations
=
this
.
editor
.
deltaDecorations
(
this
.
highlightDecorations
,
[{
range
:
new
Range
(
pos
.
lineNumber
,
expressionRange
.
startColumn
,
pos
.
lineNumber
,
expressionRange
.
startColumn
+
matchingExpression
.
length
),
options
:
{
className
:
'
hoverHighlight
'
}
options
:
DebugHoverWidget
.
_HOVER_HIGHLIGHT_DECORATION_OPTIONS
}]);
return
this
.
doShow
(
pos
,
expression
,
focus
);
});
}
private
static
_HOVER_HIGHLIGHT_DECORATION_OPTIONS
=
ModelDecorationOptions
.
register
({
className
:
'
hoverHighlight
'
});
private
doFindExpression
(
container
:
IExpressionContainer
,
namesToFind
:
string
[]):
TPromise
<
IExpression
>
{
if
(
!
container
)
{
return
TPromise
.
as
(
null
);
...
...
src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts
浏览文件 @
b07b786e
...
...
@@ -890,13 +890,15 @@ export class FilteredMatchesRenderer extends Disposable implements HiddenAreasPr
private
createDecoration
(
range
:
IRange
,
model
:
ITextModel
):
IModelDeltaDecoration
{
return
{
range
,
options
:
{
stickiness
:
TrackedRangeStickiness
.
NeverGrowsWhenTypingAtEdges
,
className
:
'
findMatch
'
}
options
:
FilteredMatchesRenderer
.
_FIND_MATCH
};
}
private
static
readonly
_FIND_MATCH
=
ModelDecorationOptions
.
register
({
stickiness
:
TrackedRangeStickiness
.
NeverGrowsWhenTypingAtEdges
,
className
:
'
findMatch
'
});
private
computeHiddenRanges
(
filteredGroups
:
ISettingsGroup
[],
allSettingsGroups
:
ISettingsGroup
[],
model
:
ITextModel
):
IRange
[]
{
// Hide the contents of hidden groups
const
notMatchesRanges
:
IRange
[]
=
[];
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录