3

Daniel Grünwald による BraceFoldingStrategy を使用します。

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;
        }

これは期待どおりに機能しますが、1 つの問題が残っています ここに画像の説明を入力

最後のブレースには常に最後の - アイコンがあります。私はそれを削除しようとしましたが、リスト newFoldings を見ると、折り畳みが 3 つしかないことがわかります。では、4番目はどこから来るのでしょうか?

編集

Daniel Grünwald によると、問題は、さまざまな折り畳みマネージャーを使用しなければならないことです。ただし、初期化コードで 2 番目の FolderingManager を設定するステートメントが見つかりません。多分ヒント?

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つの折りたたみがあることを確認しましたが、4番目の折りたたみがどこに定義されているかはまだわかりません。

4

1 に答える 1

5

私の経験では、単純な BraceFoldingStrategy はバグが多すぎて実際には役に立ちません。壊れたインデント (AvalonDock でタブが変更されるたびに余分な折りたたみマージンが発生していました - あなたが直面しているのとまったく同じ問題だったかもしれません)、通常のブレースとして解析される文字列のブレース (ペアにすることさえできます) など、複数の問題があります。文字列 { with real }) などなので、削除することにしました。

実際のコード フォールディングのサポートには、実際の語彙 (またはより良い - 構文) 分析情報が必要です。可能であればそれを使用します (使用例は SharpDevelop 4.0 ソースにあります)。ただし、エディターを作成している言語のパーサーにアクセスする必要があります。そのために。

コードの折りたたみは IDE の最も重要な機能ではなく、個人的にはめったに使用しないと思います (領域/大きなメソッドを含む非常に大きなファイルの場合のみ)。

これがあなたが望んでいる答えではないことはわかっています(投稿が長さの制限を超えていない場合は、これをコメントとして投稿します)。私はこれを見続けます(そして誰かが本当の答えを提供してくれることを願っています)。

于 2011-03-09T16:00:15.580 に答える