BraceFolding в AvalonEdit - PullRequest
       8

BraceFolding в AvalonEdit

2 голосов
/ 09 марта 2011

Я использую стратегию BraceFolding от Daniel Grünwald:

public IEnumerable<NewFolding> CreateNewFoldings(ITextSource document)
        {
            List<NewFolding> newFoldings = new List<NewFolding>();

            Stack<int> startOffsets = new Stack<int>();
            int lastNewLineOffset = 0;
            char openingBrace = this.OpeningBrace;
            char closingBrace = this.ClosingBrace;
            for (int i = 0; i < document.TextLength; i++) {
                char c = document.GetCharAt(i);
                if (c == openingBrace) {
                    startOffsets.Push(i);
                } else if (c == closingBrace && startOffsets.Count > 0) {
                    int startOffset = startOffsets.Pop();
                    // don't fold if opening and closing brace are on the same line
                    if (startOffset < lastNewLineOffset) {
                        newFoldings.Add(new NewFolding(startOffset, i + 1));
                    }
                } else if (c == '\n' || c == '\r') {
                    lastNewLineOffset = i + 1;
                }
            }
            newFoldings.Sort((a,b) => a.StartOffset.CompareTo(b.StartOffset));
            return newFoldings;
        }

Это работает как ожидалось, но осталась одна проблема enter image description here

На последней скобке всегда есть значок последнего символа. Я пытался удалить это, но когда я смотрю на список newFoldings, я вижу, что там только 3 складывания. Итак, откуда идет четвертый?

EDIT

По словам Даниэля Грюнвальда, проблема в том, что я должен использовать разные менеджеры сворачивания. Однако я не могу найти никакого утверждения в моем коде инициализации, где я установил второй FoldingManager. Может быть, есть какие-нибудь намеки?

private void textEditor_Loaded(object sender, RoutedEventArgs e)
{
   LoadSourceCode();
   textEditor.Background = Brushes.Green;  
   textEditor.IsReadOnly = true;    
   textEditor.ShowLineNumbers = true;

   using (Stream s = this.GetType().Assembly.GetManifestResourceStream("Prototype_Concept_2.View.Layouts.CustomHighlighting.xshd"))
   {
      using (XmlTextReader reader = new XmlTextReader(s))
      {    
         textEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
      }
    }

   (textEditor.TextArea as IScrollInfo).ScrollOwner.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;
   (textEditor.TextArea as IScrollInfo).ScrollOwner.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;

   FoldingManager foldingManager = FoldingManager.Install(textEditor.TextArea);    
   BraceFoldingStrategy foldingStrategy = new BraceFoldingStrategy();    
   foldingStrategy.UpdateFoldings(foldingManager, textEditor.Document);

   TextArea txt = textEditor.TextArea;    
   ObservableCollection<UIElement> margins = txt.LeftMargins;

   foreach (UIElement margin in margins)    
   {    
      if ((margin as FoldingMargin) != null)
      {
         Contacts.AddPreviewContactDownHandler(margin as FoldingMargin, OnDown);
      }
   }

   Main.Children.Remove(textEditor);
   ScrollHost.Width = textEditor.Width;    
   ScrollHost.Height = textEditor.Height;    
   ScrollHost.Content = textEditor;
   textEditor.Background = Brushes.Transparent;
   ScrollHost.Background = Brushes.Transparent;    
}

РЕДАКТИРОВАТЬ 2

Я проверил, что установленный в данный момент FoldingManager имеет 3 складывания, но я до сих пор не знаю, где определено четвертое складывание.

1 Ответ

5 голосов
/ 09 марта 2011

Простой BraceFoldingStrategy по моему опыту слишком глючит, чтобы быть действительно полезным.Существует несколько проблем, таких как неправильный отступ (я получал дополнительное поле сворачивания каждый раз, когда вкладка изменялась в AvalonDock - возможно, это была та же самая проблема, с которой вы сталкивались), скобки в строках анализировались как обычные скобки (даже можно соединитьстрока {с реальным}) и т. д., поэтому я решил отбросить ее.

Реальная поддержка свертывания кода требует реальной лексической (или лучше - синтаксической) информации анализа, используйте ее, если можете (вы можете найти пример использованияв источниках SharpDevelop 4.0), но у вас должен быть доступ к парсеру для языка, для которого вы пишете редактор.

Я думаю, что свертывание кода не самая важная особенность среды IDE, и я лично редко использую ее(только с действительно большим файлом с регионами / большими методами).

Я знаю, что это не тот ответ, на который вы надеетесь (я бы опубликовал его в качестве комментария, если он не превысил ограничение длины),Я буду продолжать наблюдать за этим (и надеюсь, что кто-то даст реальный ответ).

...