我的问题是Visual Studio(vs2013)打开我创建和折叠的大纲。 我想要实现的目标是自动关闭窗口激活事件中源代码文件中的第一个注释。 背景是我们的源文件中有非常大的fileheadercomments(可视源安全签入历史记录)。
我写了一个扩展,在文件的第一条评论上创建了一个大纲块并将其折叠起来。这适用于已打开的文件。
但是如果文件是新打开的( FileOpen / DocumentOpen ),几秒钟后轮廓将会展开。我想当时视觉工作室的自动概述已经完成了吗?!
如果我在概述之前执行Edit.StopAutomaticOutling命令。在2到3秒后,轮廓将被扩展。
这里是我的概述代码:
// Outlining stoppen
try
{
_dte.ExecuteCommand("Edit.StopOutlining");
}
catch (Exception)
{
}
// Oberflächenänderungen abschalten
_dte.SuppressUI = true;
TextSelection ts = _dte.ActiveDocument.Selection as TextSelection;
if (ts != null)
{
// alte Sektion merken
TextPoint oldAnchor = ts.AnchorPoint.CreateEditPoint();
TextPoint oldActive = ts.ActivePoint.CreateEditPoint();
// Kommentare und Leerzeilen zusammenfassen
EditPoint edit_point = ts.ActivePoint.CreateEditPoint();
edit_point.StartOfDocument();
bool bWasComment = true;
bool bInBlock = false;
string line = "";
while (bWasComment && !edit_point.AtEndOfDocument)
{
line = edit_point.GetLines(edit_point.Line, edit_point.Line + 1);
if (!bInBlock)
{
if (line.Trim().StartsWith("/"))
{
bInBlock = true;
bWasComment = true;
}
else if (line.Trim().StartsWith("//"))
{
bWasComment = true;
}
else if (line.Trim() == "")
{
bWasComment = true;
}
else
{
// was anderes
bWasComment = false;
}
}
else
{
if (line.Trim().EndsWith("/"))
{
bInBlock = false;
}
bWasComment = true;
}
if (!bWasComment)
{
if (!edit_point.AtStartOfDocument)
{
edit_point.LineUp();
}
}
else
{
// weiter
edit_point.LineDown();
}
}
// letze Leerzeilen wieder hoch
if (!bWasComment)
{
line = edit_point.GetLines(edit_point.Line, edit_point.Line + 1);
while (!edit_point.AtStartOfDocument && line.Trim() == "")
{
edit_point.LineUp();
line = edit_point.GetLines(edit_point.Line, edit_point.Line + 1);
}
edit_point.EndOfLine();
}
// Outline erstellen und zuklappen
ts.MoveToAbsoluteOffset(1);
ts.SwapAnchor();
ts.MoveToAbsoluteOffset(edit_point.AbsoluteCharOffset, true);
ts.OutlineSection();
//ts.Collapse(); // OutlineSection() klappt schon zu
// Cursor wieder umsetzen
if (oldAnchor.AbsoluteCharOffset < edit_point.AbsoluteCharOffset)
{
// alte Position war im Kommentar -> direkt hinter neue Region
ts.MoveToAbsoluteOffset(edit_point.AbsoluteCharOffset); // set active point
ts.SwapAnchor(); //set anchor to active point
ts.MoveToAbsoluteOffset(edit_point.AbsoluteCharOffset, true);
}
else
{
// alte Position
ts.MoveToAbsoluteOffset(oldAnchor.AbsoluteCharOffset); // set active point
ts.SwapAnchor(); //set anchor to active point
ts.MoveToAbsoluteOffset(oldActive.AbsoluteCharOffset, true);
}
_dte.SuppressUI = false;
}