GtkSharp/sample/GtkDemo/DemoMain.cs
John Luke 8fc739e12c display the info page from comments in the source
and add missing descriptions

svn path=/trunk/gtk-sharp/; revision=38236
2005-01-02 19:16:41 +00:00

275 lines
6.9 KiB
C#

//
// DemoMain.cs, port of main.c from gtk-demo
//
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
//
// Copyright (C) 2003, Ximian Inc.
using System;
using System.Collections;
using System.IO;
using System.Reflection;
using Gdk;
using Gtk;
using Pango;
namespace GtkDemo
{
public class DemoMain
{
private Gtk.Window window;
private TextBuffer infoBuffer = new TextBuffer (null);
private TextBuffer sourceBuffer = new TextBuffer (null);
private TreeView treeView;
private TreeStore store;
private TreeIter oldSelection = TreeIter.Zero;
public static void Main (string[] args)
{
Application.Init ();
new DemoMain ();
Application.Run ();
}
public DemoMain ()
{
SetupDefaultIcon ();
window = new Gtk.Window ("Gtk# Code Demos");
window.SetDefaultSize (600, 400);
window.DeleteEvent += new DeleteEventHandler (WindowDelete);
HBox hbox = new HBox (false, 0);
window.Add (hbox);
treeView = CreateTree ();
hbox.PackStart (treeView, false, false, 0);
Notebook notebook = new Notebook ();
hbox.PackStart (notebook, true, true, 0);
notebook.AppendPage (CreateText (infoBuffer, false), new Label ("_Info"));
TextTag heading = new TextTag ("heading");
heading.Scale = heading.Scale * 2;
infoBuffer.TagTable.Add (heading);
notebook.AppendPage (CreateText (sourceBuffer, true), new Label ("_Source"));
window.ShowAll ();
}
private void LoadFile (string filename)
{
Stream file = Assembly.GetExecutingAssembly ().GetManifestResourceStream (filename);
if (file != null)
{
LoadStream (file);
}
else if (File.Exists (filename))
{
file = File.OpenRead (filename);
LoadStream (file);
}
else
{
infoBuffer.Text = String.Format ("{0} was not found.", filename);
sourceBuffer.Text = String.Empty;
}
Fontify ();
}
private void LoadStream (Stream file)
{
StreamReader sr = new StreamReader (file);
bool insideComment = false;
bool headingValid = true;
infoBuffer.Text = "";
sourceBuffer.Text = "";
// mostly broken comment parsing for splitting
// out the special comments to display in the infobuffer
string line, trimmed;
while (sr.Peek () != -1) {
line = sr.ReadLine ();
trimmed = line.Trim ();
if (headingValid && line.Trim ().StartsWith ("//"))
{
continue;
}
else if (headingValid && trimmed.StartsWith ("/*"))
{
TextIter iter = infoBuffer.EndIter;
infoBuffer.InsertWithTagsByName (ref iter, trimmed.Substring (2) + Environment.NewLine, "heading");
infoBuffer.Insert (ref iter, Environment.NewLine);
insideComment = true;
}
else if (headingValid && trimmed.StartsWith ("*/"))
{
insideComment = false;
headingValid = false;
}
else
{
if (insideComment)
{
TextIter iter = infoBuffer.EndIter;
if (trimmed.StartsWith ("*"))
infoBuffer.Insert (ref iter, trimmed.Substring (1));
else
infoBuffer.Insert (ref iter, trimmed);
}
else
{
TextIter iter = sourceBuffer.EndIter;
sourceBuffer.Insert (ref iter, line + Environment.NewLine);
}
}
}
sr.Close ();
file.Close ();
}
// this is to highlight the sourceBuffer
private void Fontify ()
{
}
private void SetupDefaultIcon ()
{
Gdk.Pixbuf pixbuf = Gdk.Pixbuf.LoadFromResource ("gtk-logo-rgb.gif");
if (pixbuf != null)
{
// The gtk-logo-rgb icon has a white background
// make it transparent instead
Pixbuf transparent = pixbuf.AddAlpha (true, 0xff, 0xff, 0xff);
Gtk.Window.DefaultIconList = new Gdk.Pixbuf [] {transparent};
}
}
private TreeView CreateTree ()
{
TreeView view = new TreeView ();
view.Model = FillTree ();
CellRendererText cr = new CellRendererText ();
TreeViewColumn column = new TreeViewColumn ("Widget (double click for demo)", cr, "text", 0);
column.AddAttribute (cr, "style" , 2);
view.AppendColumn (column);
view.Selection.Changed += new EventHandler (OnTreeChanged);
view.RowActivated += new RowActivatedHandler (OnRowActivated);
view.ExpandAll ();
view.SetSizeRequest (200, -1);
view.Selection.Mode = Gtk.SelectionMode.Browse;
return view;
}
private ScrolledWindow CreateText (TextBuffer buffer, bool IsSource)
{
ScrolledWindow scrolledWindow = new ScrolledWindow ();
scrolledWindow.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
scrolledWindow.ShadowType = ShadowType.In;
TextView textView = new TextView (buffer);
textView.Editable = false;
textView.CursorVisible = false;
scrolledWindow.Add (textView);
if (IsSource)
{
FontDescription fontDescription = FontDescription.FromString ("Courier 12");
textView.ModifyFont (fontDescription);
textView.WrapMode = Gtk.WrapMode.None;
}
else
{
// Make it a bit nicer for text
textView.WrapMode = Gtk.WrapMode.Word;
textView.PixelsAboveLines = 2;
textView.PixelsBelowLines = 2;
}
return scrolledWindow;
}
private TreeStore FillTree ()
{
// title, filename, italic
store = new TreeStore (typeof (string), typeof (System.Type), typeof (bool));
Hashtable parents = new Hashtable ();
TreeIter parent;
Type[] types = Assembly.GetExecutingAssembly ().GetTypes ();
foreach (Type t in types)
{
if (t.IsDefined (typeof (DemoAttribute), false))
{
object[] att = t.GetCustomAttributes (typeof (DemoAttribute), false);
foreach (DemoAttribute demo in att)
{
if (demo.Parent != null)
{
if (!parents.Contains (demo.Parent))
parents.Add (demo.Parent, store.AppendValues (demo.Parent));
parent = (TreeIter) parents[demo.Parent];
store.AppendValues (parent, demo.Label, t, false);
}
else
{
store.AppendValues (demo.Label, t, false);
}
}
}
}
store.SetSortColumnId (0, SortType.Ascending);
return store;
}
private void OnTreeChanged (object o, EventArgs args)
{
TreeIter iter;
TreeModel model;
if (treeView.Selection.GetSelected (out model, out iter))
{
Type type = (Type) model.GetValue (iter, 1);
if (type != null)
{
object[] atts = type.GetCustomAttributes (typeof (DemoAttribute), false);
string file = ((DemoAttribute) atts[0]).Filename;
LoadFile (file);
}
model.SetValue (iter, 2, true);
if (!oldSelection.Equals (TreeIter.Zero))
model.SetValue (oldSelection, 2, false);
oldSelection = iter;
}
}
private void OnRowActivated (object o, RowActivatedArgs args)
{
TreeIter iter;
if (treeView.Model.GetIter (out iter, args.Path))
{
Type type = (Type) treeView.Model.GetValue (iter, 1);
if (type != null)
Activator.CreateInstance (type);
}
}
private void WindowDelete (object o, DeleteEventArgs args)
{
Application.Quit ();
args.RetVal = true;
}
}
}