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.

-pete

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 ();
                else:
                        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 ()
_______________________________________________
Gtk-sharp-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/gtk-sharp-list

Reply via email to