[Gtk-sharp-list] CDateTimeCtrl in GTK#?

Peter Johanson latexer at gentoo.org
Fri Jun 23 13:47:27 EDT 2006

On Fri, Jun 23, 2006 at 01:02:00PM -0400, JimD wrote:
> Are there any solutions for a drop down calendar with Gtk# similar to 
> the one in MS .Net?  Specifically where the drop down displays the 
> calendar above other controls without messing up/expanding the contents 
> of the whole window to just display the calendar.

The attached boo file shows you how you'd construct such a widget fairly
easily. Beware the particulars of needing a GdkWindow to get coordinates
from (thus the EventBox), as well as all the grabbing stuff for the
popup/popdown methods.


-------------- next part --------------
import System

import Gtk from 'gtk-sharp'
import Gdk from 'gdk-sharp'

class WindowToggleButton (VBox):
	root_box as HBox
	real_box as EventBox
	fake_box as HBox
	button as ToggleButton
	popdown_window as Gtk.Window
	datetime as System.DateTime = System.DateTime.Now
	cal as Calendar

	def constructor ():
		root_box = HBox ()
		real_box = EventBox ()
		button = ToggleButton (datetime.ToString ())
		button.Toggled += on_toggled
		real_box.Add (button)
		root_box.PackStart (real_box, true, true, 0)
		PackStart (root_box, false, false, 0)

		# Create our new window
		popdown_window = Gtk.Window (Gtk.WindowType.Popup)

		# Create our calendar widget, and hook up to the interesting key/button events
		cal = Calendar ()
		cal.KeyPressEvent += def (o, args as KeyPressEventArgs):
			if args.Event.Key in (Gdk.Key.Return, Gdk.Key.Escape):
				popdown ()
		cal.ButtonPressEvent += def (o, args as ButtonPressEventArgs):
			if args.Event.Type == EventType.TwoButtonPress:
				popdown ()

		popdown_window.Add (cal)
	private def on_toggled (o, e as EventArgs):
		if button.Active:
			popup ();
			popdown ();
	private def popup ():
		cal.Date = datetime

		x as int
		y as int
		real_box.GdkWindow.GetOrigin (x, y)
		popdown_window.Move (x, y)
		popdown_window.ShowAll ()

		# Grab foo for stealing the keyboard/input focus
		Gdk.Pointer.Grab (popdown_window.GdkWindow, true,
			Gdk.EventMask.ButtonPressMask | Gdk.EventMask.ButtonReleaseMask | Gdk.EventMask.PointerMotionMask | Gdk.EventMask.EnterNotifyMask | Gdk.EventMask.LeaveNotifyMask, null, null, Gtk.Global.CurrentEventTime);
		Gdk.Keyboard.Grab (popdown_window.GdkWindow, true, Gtk.Global.CurrentEventTime);
		Gtk.Grab.Add (popdown_window)

	private def popdown ():
		# Undo our grab foo
		Gtk.Grab.Remove (popdown_window)
		Gdk.Keyboard.Ungrab (Gtk.Global.CurrentEventTime);
		Gdk.Pointer.Ungrab (Gtk.Global.CurrentEventTime);

		button.Active = false
		datetime = cal.Date
		button.Label = datetime.ToString ()
		popdown_window.Hide ()
Application.Init ()

w = Gtk.Window ('test')
w.DeleteEvent += { Application.Quit (); }
w.Add (WindowToggleButton ())
w.ShowAll ()
Application.Run ()

More information about the Gtk-sharp-list mailing list