2012-06-20 14 views
6

Bir richtextbox denetimi olan IDE benzeri (Düzenlenemeyen) bir program tasarlamaya çalışıyorum. Temel olarak, kullanıcı +/- butonlarına tıkladığında kodumun belirli bir bölümünü genişletmek/daraltmak için RTB'nin sol tarafına yerleştirilmiş olan ağaç görüntüsüne ihtiyacım var. Genişletilebilir katlanabilir aralıklar, kıvrık parantezlerin görüldüğü yerler olarak tanımlanır.C# Karmaşık Ağaç Görünümü Tasarımı

int main() 
{ 
    if (...) 
    { 
     if (...) 
     { 
     } 
    } 
    else 
    { 
    } 
} 

Ben en üstteki kıvırcık parantez tıklayın olsaydı, ana işlevi içinde her şeyi çökerdi: RTB Mesela ben böyle bir şey olsaydı. Temel olarak, bu kıvrık parantez içinde yer alan şey katlanmış olan şeydir. Özet olarak, Visual Studio'nun genişletme/daraltma kod işlevine çok benzer bir şey tasarlamaya çalışıyorum, bunun dışında if/else işlevleriyle de bunu yapar.

Braket eşleştirme algoritmasının farkındayım ve parantezlerin hangi çiftlerinin eşleştiğini bilmek için bir yığın uyguladık (Satır numaraları bir tuple listesinde saklandı).

Büyük ölçüde sahip olduğum konu, gerçek ağaç görünümü tasarlama konusunda nasıl gidileceğidir. Ağaç görüntüsünün lineer bir tarzda olmasını ve başka hiçbir şeyin düğümlenmediğine ihtiyacım var. Başka bir düğümün üzerine çocuk düğümleri eklemeden genişletme/daraltma düğmesini ekleyebilecek herhangi bir yaklaşımın farkında değilim.

Ayrıca, +/- düğmeleri ve tekil dikey çizgi hariç, düzenlenebilir olmayan, görünmeyen ve tıklanamayan ağaç görünümü düğümlerine ihtiyacım var.

Son olarak, yukarıdaki gereksinimleri karşılayıp karşılamadığımı varsaymak gerekirse, ağaç görüntüsünü doğru olarak kaydırmak için RTB'nin dikey kaydırma olayına ihtiyacım var. Yani, Treeview'in daraltma/genişletme bölümü, RTB'de görünen kodun kısmına bağlı olarak güncellenecektir. Bu gerçekten gerekli ama her ihtimale karşı olmayacak inanıyoruz rağmen, İşte

public partial class LogicSimulationViewerForm : Form 
{ 
    private List<Tuple<string,Boolean>> visibleLines = new List<Tuple<string,Boolean>>(); 
    private List<Tuple<int, int>> collapseRange = new List<Tuple<int, int>>(); 

    private void TreeInit() 
    { 
     TreeNode tn; 
     Stack<int> openBracketLine = new Stack<int>(); 
     int i = 0; 
     TreeLogicCode.Nodes.Clear(); 
     foreach (string s in rtbLogicCode.Lines) 
     { 
      visibleLines.Add(Tuple.Create(s, true)); 
      if (s == "{") 
      { 
       openBracketLine.Push(i); 
      } 
      else if (s == "}") 
      { 
       collapseRange.Add(Tuple.Create(openBracketLine.Pop(),i)); 
      } 
      i++; 
     } 
    } 

Designer.sc kaynak kodu: Burada

ağaca başlatmak için kullanıyorum kod bir bölüm:

namespace DDCUI 
{ 
    partial class LogicSimulationViewerForm 
    { 
     /// <summary> 
     /// Required designer variable. 
     /// </summary> 
     private System.ComponentModel.IContainer components = null; 

     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
     protected override void Dispose(bool disposing) 
     { 
      if (disposing && (components != null)) 
      { 
       components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

     #region Windows Form Designer generated code 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InitializeComponent() 
     { 
      this.TreeLogicCode = new System.Windows.Forms.TreeView(); 
      this.labelLogicCode = new System.Windows.Forms.Label(); 
      this.rtbLogicCode = new System.Windows.Forms.RichTextBox(); 
      this.SuspendLayout(); 
      // 
      // TreeLogicCode 
      // 
      this.TreeLogicCode.Dock = System.Windows.Forms.DockStyle.Left; 
      this.TreeLogicCode.Location = new System.Drawing.Point(50, 0); 
      this.TreeLogicCode.Name = "TreeLogicCode"; 
      this.TreeLogicCode.Scrollable = false; 
      this.TreeLogicCode.Size = new System.Drawing.Size(40, 600); 
      this.TreeLogicCode.TabIndex = 4; 
      // 
      // labelLogicCode 
      // 
      this.labelLogicCode.BackColor = System.Drawing.Color.LightGray; 
      this.labelLogicCode.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 
      this.labelLogicCode.Dock = System.Windows.Forms.DockStyle.Left; 
      this.labelLogicCode.ForeColor = System.Drawing.SystemColors.ControlText; 
      this.labelLogicCode.Location = new System.Drawing.Point(0, 0); 
      this.labelLogicCode.Margin = new System.Windows.Forms.Padding(3); 
      this.labelLogicCode.Name = "labelLogicCode"; 
      this.labelLogicCode.Padding = new System.Windows.Forms.Padding(3); 
      this.labelLogicCode.Size = new System.Drawing.Size(50, 600); 
      this.labelLogicCode.TabIndex = 3; 
      this.labelLogicCode.TextAlign = System.Drawing.ContentAlignment.TopRight; 
      // 
      // rtbLogicCode 
      // 
      this.rtbLogicCode.Dock = System.Windows.Forms.DockStyle.Fill; 
      this.rtbLogicCode.Location = new System.Drawing.Point(90, 0); 
      this.rtbLogicCode.Name = "rtbLogicCode"; 
      this.rtbLogicCode.Size = new System.Drawing.Size(510, 600); 
      this.rtbLogicCode.TabIndex = 5; 
      this.rtbLogicCode.Text = ""; 
      this.rtbLogicCode.VScroll += new System.EventHandler(this.rtbLogicCode_VScroll); 
      // 
      // LogicSimulationViewerForm 
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); 
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
      this.ClientSize = new System.Drawing.Size(600, 600); 
      this.Controls.Add(this.rtbLogicCode); 
      this.Controls.Add(this.TreeLogicCode); 
      this.Controls.Add(this.labelLogicCode); 
      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
      this.Name = "LogicSimulationViewerForm"; 
      this.Text = "LogicSimulationViewerForm"; 
      this.ResumeLayout(false); 

     } 

     #endregion 

     private System.Windows.Forms.TreeView TreeLogicCode; 
     private System.Windows.Forms.Label labelLogicCode; 
     private System.Windows.Forms.RichTextBox rtbLogicCode; 
    } 
} 

Bu sorunun çözümü ile ilgili herhangi bir kılavuza gerçekten minnettar olurum. Şimdiden teşekkürler.

cevap

7

Scintilla ve .NET sürüm 'a bir göz atmalısınız: http://scintillanet.codeplex.com/.

Bu tür sorunların çözümü için kaynak kodu içerir, dürüst olmak gerekirse, yalnızca kontrolü kullanırım ve programlama gereksinimlerinizi çözmek için salt okunur hale getirirdim.

+0

Maalesef, yukarıda açıklanan sorun tanımı, istemcinin program için istediği şeydir. Scantilla'yı açmayı denedim ama makinemi derlemediğinden, bu yüzden buraya yardım için geldim. – l46kok

+0

Sadece derlemeniz gerekmez DLL'yi Toolbox'a ekleyin ve sadece Form üzerine sürükleyin. – MMK

+0

Aslında geliştirdiğim program ticari amaçlıdır ve lisans nedeniyle söz konusu açık kaynak projesini kullanamıyorum gibi görünüyor. – l46kok

İlgili konular