Visual Studio собственный свернутый контур будет расширен
Моя проблема в том, что Visual Studio (vs2013) открывает мой созданный и свернутый контур. цель, которую я хочу достичь, - автоматически закрыть первый комментарий в файле исходного кода в окне активации события. фон в том, что в наших исходных файлах есть очень большие комментарии к заголовкам файлов (визуальная история безопасной проверки исходного кода).
Я написал расширение, которое создает блок контура на первый комментарий в файле, свернуть его. Это прекрасно работает для файлов, которые уже открыты.
НО, если файл открывается заново (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;
}