using System.Collections; using System.IO; using System; using Cairo; using Pango; public struct HelpItem { public string Key; public string Text; public HelpItem(string key, string text) { Key = key; Text = text; } public override string ToString() { return "" + Key + "\t" + Text; } } public class HelpBox { private Pango.Context pc; private Pango.FontDescription titleFont; private Pango.FontDescription textFont; private string helpTitle; private HelpItem[] helpText; private int Width = 480; private int Height = 360; private int Columns = 3; public HelpBox(Pango.Context pc, string title, HelpItem[] items) { this.pc = pc; helpTitle = title; helpText = items; init(); } public HelpBox(Pango.Context pc, string filename) { StreamReader file = new StreamReader(filename); string line; ArrayList items = new ArrayList(); this.pc = pc; helpTitle = file.ReadLine(); while ((line = file.ReadLine()) != null) { string[] i = line.Split(null); if (i.Length == 2) { items.Add(new HelpItem(i[0], i[1])); } } helpText = new HelpItem[items.Count]; for (int i = 0; i < items.Count; i++) { helpText[i] = (HelpItem) items[i]; } init(); } private void init() { titleFont = Pango.FontDescription.FromString("Helvetica Bold 24"); textFont = Pango.FontDescription.FromString("Helvetica 16"); Pango.FontMetrics fmTitle = pc.GetMetrics(titleFont, null); Pango.FontMetrics fmText = pc.GetMetrics(textFont, null); int hTitle = Pango.Units.ToPixels(fmTitle.Ascent + fmTitle.Descent); int hText = Pango.Units.ToPixels(fmText.Ascent + fmText.Descent); Width = 480; for (int i = 0; i < helpText.Length; i++) { Pango.Layout layout = new Pango.Layout(pc); Pango.Rectangle r, r2; layout.FontDescription = textFont; layout.SetMarkup(helpText[i].ToString()); layout.GetExtents(out r, out r2); int pw = Pango.Units.ToPixels(r2.Width); if ((pw + 8) * Columns > Width) { Width = (pw + 8) * Columns; } } Height = hTitle + (helpText.Length / 3 + 1) * hText + 12; } public void draw(Cairo.Context gr, int width, int height) { Pango.Layout layout; Cairo.Rectangle r = new Cairo.Rectangle( width / 2 - Width / 2, height / 2 - Height / 2, Width, Height); gr.SetSourceRGBA(1.0, 1.0, 1.0, 0.8); gr.NewPath(); gr.Rectangle(r); gr.Fill(); gr.SetSourceRGB(0.0, 0.0, 0.0); gr.NewPath(); gr.Rectangle(r); gr.Stroke(); gr.MoveTo(r.X + 4, r.Y + 4); layout = new Pango.Layout(pc); layout.SetText(helpTitle); layout.Width = Pango.Units.FromPixels((int)r.Width); layout.FontDescription = titleFont; Pango.CairoHelper.ShowLayout(gr, layout); int ii = 0; int ColumnWidth = Width / Columns; int ColumnLines = helpText.Length / Columns + 1; for (int i = 0; i < Columns; i++) { gr.MoveTo(r.X + 4 + (i * ColumnWidth), r.Y + 38); string column = ""; for (int j = 0; j < ColumnLines && ii < helpText.Length; j++) { column += helpText[ii].ToString() + "\n"; ii++; } layout = new Pango.Layout(pc); layout.SetMarkup(column); layout.Width = Pango.Units.FromPixels(ColumnWidth); layout.FontDescription = textFont; Pango.CairoHelper.ShowLayout(gr, layout); } } }