//
// ApplicationWindow.cs, port of appwindow.c from gtk-demo
//
// Author: Daniel Kornhauser <dkor@alum.mit.edu>
//	John Luke <john.luke@gmail.com>
//
// Copyright (C) 2003, Ximian Inc.


/* Application main window
 *
 * Demonstrates a typical application window, with menubar, toolbar, statusbar.
 */

using System;
using Gtk;

namespace GtkDemo 
{
	[Demo ("Application Window", "DemoApplicationWindow.cs")]
	public class DemoApplicationWindow : Window
	{
		// for the statusbar
		const int ctx = 1;
		const string fmt = "Cursor at row {0} column {1} - {2} chars in document";
		int row, column, count = 0;

		Statusbar statusbar;
		VBox vbox;

		const string uiInfo =
			"<ui>" +
			"  <menubar name='MenuBar'>" +
			"    <menu action='FileMenu'>" +
			"      <menuitem action='New'/>" +
			"      <menuitem action='Open'/>" +
			"      <menuitem action='Save'/>" +
			"      <menuitem action='SaveAs'/>" +
			"      <separator/>" +
			"      <menuitem action='Quit'/>" +
			"    </menu>" +
			"    <menu action='PreferencesMenu'>" +
			"      <menu action='ColorMenu'>" +
			"	<menuitem action='Red'/>" +
			"	<menuitem action='Green'/>" +
			"	<menuitem action='Blue'/>" +
			"      </menu>" +
			"      <menu action='ShapeMenu'>" +
			"        <menuitem action='Square'/>" +
			"        <menuitem action='Rectangle'/>" +
			"        <menuitem action='Oval'/>" +
			"      </menu>" +
			"      <menuitem action='Bold'/>" +
			"    </menu>" +
			"    <menu action='HelpMenu'>" +
			"      <menuitem action='About'/>" +
			"    </menu>" +
			"  </menubar>" +
			"  <toolbar  name='ToolBar'>" +
			"    <toolitem name='open' action='Open'/>" +
			"    <toolitem name='quit' action='Quit'/>" +
			"    <separator action='Sep1'/>" +
			"    <toolitem name='logo' action='Logo'/>" +
			"  </toolbar>" +
			"</ui>";

		public DemoApplicationWindow () : base ("Demo Application Window")
		{
			this.SetDefaultSize (400, 300);
			this.DeleteEvent += new DeleteEventHandler (WindowDelete);

			vbox = new VBox (false, 0);
			this.Add (vbox);

			AddActions ();

			statusbar = new Statusbar ();
			UpdateStatus ();
			vbox.PackEnd (statusbar, false, false, 0);

			TextView textview = new TextView ();
			textview.Buffer.MarkSet += new MarkSetHandler (OnMarkSet);
			vbox.PackEnd (textview, true, true, 0);

			this.ShowAll ();
		}

		void AddActions ()
		{
			ActionEntry[] actions = new ActionEntry[]
			{
				new ActionEntry ("FileMenu", null, "_File", null, null, null),
				new ActionEntry ("PreferencesMenu", null, "_Preferences", null, null, null),
				new ActionEntry ("ColorMenu", null, "_Color", null, null, null),
				new ActionEntry ("ShapeMenu", null, "_Shape", null, null, null),
				new ActionEntry ("HelpMenu", null, "_Help", null, null, null),
				new ActionEntry ("New", Stock.New, "_New", "<control>N", "Create a new file", new EventHandler (OnActionActivated)),
				new ActionEntry ("Open", Stock.Open, "_Open", "<control>O", "Open a file", new EventHandler (OnActionActivated)),
				new ActionEntry ("Save", Stock.Save, "_Save", "<control>S", "Save current file", new EventHandler (OnActionActivated)),
				new ActionEntry ("SaveAs", Stock.SaveAs, "Save _As", null, "Save to a file", new EventHandler (OnActionActivated)),
				new ActionEntry ("Quit", Stock.Quit, "_Quit", "<control>Q", "Quit", new EventHandler (OnActionActivated)),
				new ActionEntry ("About", null, "_About", "<control>A", "About", new EventHandler (OnActionActivated)),
				new ActionEntry ("Logo", "demo-gtk-logo", "Gtk#", null, "Gtk#", new EventHandler (OnActionActivated))
			};

			ToggleActionEntry[] toggleActions = new ToggleActionEntry[]
			{
				new ToggleActionEntry ("Bold", Stock.Bold, "_Bold", "<control>B", "Bold", new EventHandler (OnActionActivated), false)
			};

			ActionEntry[] colorActions = new ActionEntry[]
			{
				new ActionEntry ("Red", null, "_Red", "<control>R", "Blood", null),
				new ActionEntry ("Green", null, "_Green", "<control>G", "Grass", null),
				new ActionEntry ("Blue", null, "_Blue", "<control>B", "Sky", null)
			};

			ActionEntry[] shapeActions = new ActionEntry[]
			{
				new ActionEntry ("Square", null, "_Square", "<control>S", "Square", null),
				new ActionEntry ("Rectangle", null, "_Rectangle", "<control>R", "Rectangle", null),
				new ActionEntry ("Oval", null, "_Oval", "<control>O", "Oval", null)
			};

			ActionGroup group = new ActionGroup ("group");
			group.Add (actions);
			group.Add (toggleActions);
			group.Add (colorActions);
			group.Add (shapeActions);

			UIManager uim = new UIManager ();
			uim.InsertActionGroup (group, (int) uim.NewMergeId ());
			uim.AddWidget += new AddWidgetHandler (OnAddWidget);
			uim.AddUiFromString (uiInfo);
		}
		
		private void OnActionActivated (object sender, EventArgs a)
		{
			Action action = sender as Action;

			using (MessageDialog md = new MessageDialog (this, DialogFlags.DestroyWithParent, MessageType.Info, ButtonsType.Close, "You activated action: {0}", action.Name)) {
				md.Run ();
				md.Hide ();
			}
		}

		private void WindowDelete (object o, DeleteEventArgs args)
		{
			this.Hide ();
			this.Destroy ();
			args.RetVal = true;
		}

		void OnMarkSet (object o, MarkSetArgs args)
		{
			TextIter iter = args.Location;
			row = iter.Line + 1;
			column = iter.VisibleLineOffset;
			count = args.Mark.Buffer.CharCount;
			UpdateStatus ();
		}

		void UpdateStatus ()
		{
			statusbar.Pop (ctx);
			statusbar.Push (ctx, String.Format (fmt, row, column, count));
		}

		void OnAddWidget (object sender, AddWidgetArgs a)
		{
			a.Widget.Show ();
			vbox.PackStart (a.Widget, false, true, 0);
		}
	}
}