Sto provando a progettare un programma IDE (non modificabile) con un controllo richtextbox. Fondamentalmente, ho bisogno della treeview che è posizionata sul lato sinistro dell'RTB per espandere/comprimere una certa parte del mio codice ogni volta che l'utente fa clic sui pulsanti +/-. Gli intervalli espandibili espandibili sono definiti ovunque siano visibili le parentesi graffe. Ad esempio, nel RTB se avessi qualcosa di simile:C# Intricate Treeview Design
int main()
{
if (...)
{
if (...)
{
}
}
else
{
}
}
Se dovessi cliccare sulla staffa più in alto ricci, sarebbe crollato tutto all'interno della funzione principale. Fondamentalmente ciò che è contenuto in quella parentesi graffa è ciò che è piegato. Quindi, in sintesi, sto cercando di progettare qualcosa che sia molto simile alla funzione di espansione/compressione del codice di Visual Studio, ma lo fa anche con le funzioni if / else.
Sono a conoscenza dell'algoritmo di corrispondenza delle parentesi e ho implementato uno stack per sapere quali coppie di parentesi corrispondono (numeri di linea memorizzati in un elenco di tuple).
Il problema che sto affrontando in modo particolare è come progettare la vista ad albero effettiva. Ho bisogno che la vista ad albero sia in un modo lineare, in cui nessun nodo viene aggiunto sopra a un altro. Non sono a conoscenza di alcun approccio che possa aggiungere il pulsante expand/collapse senza aggiungere effettivamente nodi secondari su un altro nodo.
Inoltre, con l'eccezione dei pulsanti +/- e di una singola linea verticale, ho bisogno che i nodi di treeview siano non modificabili, non visibili e non cliccabili.
Infine, e ciò presuppone che se ho soddisfatto i requisiti di cui sopra, ho bisogno dell'evento di scorrimento verticale dell'RTB per scorrere correttamente anche la vista ad albero. Cioè, la sezione collasso/espansione di Treeview si aggiornerebbe in base alla porzione di codice visibile sull'RTB.
Ecco una sezione del codice che sto usando per inizializzare l'albero:
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++;
}
}
Ecco il codice sorgente di Designer.sc, anche se credo che questo non sarà davvero necessario, ma solo nel caso in cui:
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;
}
}
Apprezzerei molto qualsiasi guida per risolvere questo problema. Grazie in anticipo.
Sfortunatamente, la descrizione del problema sopra è esattamente ciò che il cliente desiderava per il programma. Ho provato ad aprire Scantilla ma non viene compilato sulla mia macchina, quindi è per questo che sono venuto qui per chiedere aiuto. – l46kok
Non è necessario compilarlo basta utilizzare la DLL aggiungerlo a Toolbox e trascinare semplicemente il modulo. – MMK
In realtà il programma che sto sviluppando è per scopi commerciali e sembra che non possa usare il citato progetto open source a causa della licenza. – l46kok