using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MindMapping { public partial class OknoDiagramu : Form { protected List> lista; private Int32 maxW; protected struct wezel { public TreeNode v; public Dictionary frame; } public OknoDiagramu() { InitializeComponent(); lista = new List>(); } protected SizeF textSize(string s) { Graphics g = diagram.CreateGraphics(); SizeF ts = g.MeasureString(s, diagram.Font); g.Dispose(); return ts; } public void setMap(TreeView drzewo) { TreeNode root = drzewo.Nodes[0]; List L = new List(); Int32 currX, currY, lineH; // dodaj korzen wezel w = new wezel(); w.v = root; w.frame = new Dictionary(); w.frame.Add("czynnosc", "prostokat"); w.frame.Add("x1", 5); w.frame.Add("y1", 5); SizeF rozm = textSize(root.Text); w.frame.Add("x2", (Int32)rozm.Width + 15); w.frame.Add("y2", (Int32)rozm.Height + 15); L.Add(w); maxW = (Int32)w.frame["x2"] + 10; currX = 5; currY = 5; lineH = (Int32)rozm.Height + 10; // wys. ramki while (L.Count > 0) { // pobierz v z listy wezel v = L[0]; L.RemoveAt(0); // dodaj do rysowania ramke v lista.Add(v.frame); // dodaj do rysowania tekst v Int32 x0 = (Int32)v.frame["x1"] + 5; Int32 y0 = (Int32)v.frame["y1"] + 5; Dictionary op = new Dictionary(); op.Add("czynnosc", "tekst"); op.Add("x", x0); op.Add("y", y0); op.Add("tresc", v.v.Text); lista.Add(op); // czy powiekszyc panel? if (((Int32)v.frame["x2"]) > maxW) maxW = (Int32)v.frame["x2"]; // czy przeszlismy na nowy poziom? if (y0 > currY) { // jesli tak, rozmieszczamy od lewej currY = y0; currX = 5; } foreach (TreeNode child in v.v.Nodes) { // wylicz pozycje potomka SizeF rozmt = textSize(child.Text); Int32 cx1, cy1, cx2, cy2; cx1 = currX; cx2 = currX + (Int32)rozmt.Width + 10; cy1 = currY + lineH + 50; cy2 = currY + lineH + 50 + lineH; // przygotuj ramke potomka Dictionary cop = new Dictionary(); cop.Add("czynnosc", "prostokat"); cop.Add("x1", cx1); cop.Add("y1", cy1); cop.Add("x2", cx2); cop.Add("y2", cy2); // przygotuj wezel dla potomka wezel chld = new wezel(); chld.v = child; chld.frame = cop; // dodaj potomka do listy L.Add(chld); // przestaw X currX += (Int32)rozmt.Width + 10 + 20; // dodaj do rysowania odcinek rodzic-potomek Dictionary kraw = new Dictionary(); kraw.Add("czynnosc", "odcinek"); kraw.Add("x1", (Int32)((((Int32)v.frame["x1"]) + ((Int32)v.frame["x2"])) / 2)); kraw.Add("y1", (Int32)v.frame["y2"]); kraw.Add("x2", (Int32)((cx1 + cx2) / 2)); kraw.Add("y2", (Int32)cy1); lista.Add(kraw); } } // ustal rozmiar panelu diagram.Size = new Size(maxW + 10, currY + lineH); } private void diagram_Paint(object sender, PaintEventArgs e) { Pen pisakRamki = new Pen(Brushes.DarkRed); pisakRamki.Width = 1; Pen pisakLinii = new Pen(Brushes.Blue); pisakLinii.Width = 1; SolidBrush kolorTekstu = new SolidBrush(Color.Black); e.Graphics.Clear(Color.White); foreach (Dictionary operacja in lista) { string op = (string) operacja["czynnosc"]; if (op.Equals("prostokat")) { Int32 x1 = (Int32) operacja["x1"]; Int32 x2 = (Int32) operacja["x2"]; Int32 y1 = (Int32) operacja["y1"]; Int32 y2 = (Int32) operacja["y2"]; e.Graphics.DrawRectangle(pisakRamki, x1, y1, (x2 - x1), (y2 - y1)); } else if (op.Equals("tekst")) { Int32 x = (Int32) operacja["x"]; Int32 y = (Int32) operacja["y"]; string tresc = (string) operacja["tresc"]; e.Graphics.DrawString(tresc, diagram.Font, kolorTekstu , x, y); } else if (op.Equals("odcinek")) { Int32 x1 = (Int32)operacja["x1"]; Int32 x2 = (Int32)operacja["x2"]; Int32 y1 = (Int32)operacja["y1"]; Int32 y2 = (Int32)operacja["y2"]; e.Graphics.DrawLine(pisakLinii, x1, y1, x2, y2); } } } } }