using System;
using System.Collections;
using System.Runtime.InteropServices;

namespace IgeMacIntegration {

    public class IgeMacMenu {

        [DllImport("libigemacintegration.dylib")]
        static extern void ige_mac_menu_connect_window_key_handler (IntPtr window);

        public static void ConnectWindowKeyHandler (Gtk.Window window)
        {
            ige_mac_menu_connect_window_key_handler (window.Handle);
        }

        [DllImport("libigemacintegration.dylib")]
        static extern void ige_mac_menu_set_global_key_handler_enabled (bool enabled);

        public static bool GlobalKeyHandlerEnabled {
            set { 
                ige_mac_menu_set_global_key_handler_enabled (value);
            }
        }

        [DllImport("libigemacintegration.dylib")]
        static extern void ige_mac_menu_set_menu_bar(IntPtr menu_shell);

        public static Gtk.MenuShell MenuBar { 
            set {
                ige_mac_menu_set_menu_bar(value == null ? IntPtr.Zero : value.Handle);
            }
        }

        [DllImport("libigemacintegration.dylib")]
        static extern void ige_mac_menu_set_quit_menu_item(IntPtr quit_item);

        public static Gtk.MenuItem QuitMenuItem { 
            set {
                ige_mac_menu_set_quit_menu_item(value == null ? IntPtr.Zero : value.Handle);
            }
        }

        [DllImport("libigemacintegration.dylib")]
        static extern IntPtr ige_mac_menu_add_app_menu_group();

        public static IgeMacIntegration.IgeMacMenuGroup AddAppMenuGroup() {
            IntPtr raw_ret = ige_mac_menu_add_app_menu_group();
            IgeMacIntegration.IgeMacMenuGroup ret = raw_ret == IntPtr.Zero ? null : (IgeMacIntegration.IgeMacMenuGroup) GLib.Opaque.GetOpaque (raw_ret, typeof (IgeMacIntegration.IgeMacMenuGroup), false);
            return ret;
        }
    }

    public class IgeMacMenuGroup : GLib.Opaque {

        [DllImport("libigemacintegration.dylib")]
        static extern void ige_mac_menu_add_app_menu_item(IntPtr raw, IntPtr menu_item, IntPtr label);

        public void AddMenuItem(Gtk.MenuItem menu_item, string label) {
            IntPtr native_label = GLib.Marshaller.StringToPtrGStrdup (label);
            ige_mac_menu_add_app_menu_item(Handle, menu_item == null ? IntPtr.Zero : menu_item.Handle, native_label);
            GLib.Marshaller.Free (native_label);
        }

        public IgeMacMenuGroup(IntPtr raw) : base(raw) {}
    }
}