{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}

-- | HTk\'s /menu cascade item/.
-- A containers for cascaded menus.
module HTk.Menuitems.MenuCascade (

  MenuCascade,
  createMenuCascade,
  createPulldownMenu

) where

import HTk.Kernel.Core
import HTk.Kernel.Configuration
import HTk.Components.BitMap
import HTk.Menuitems.Menu
import HTk.Menuitems.MenuItem
import HTk.Menuitems.Indicator
import Events.Synchronized
import Util.Computation


-- -----------------------------------------------------------------------
-- MenuCascade type
-- -----------------------------------------------------------------------

-- | The @MenuCascade@ datatype.
newtype MenuCascade = MenuCascade GUIOBJECT


-- -----------------------------------------------------------------------
-- instances
-- -----------------------------------------------------------------------

-- | A @MenuCascade@ item is a container for a sub-menu.
instance HasMenu MenuCascade


-- -----------------------------------------------------------------------
-- commands
-- -----------------------------------------------------------------------

-- | Constructs a new menu cascasde item and returns a handler.
createMenuCascade :: Menu
   -- ^ the parent menu.
   -> [Config MenuCascade]
   -- ^ the list of configuration options for this menu
   -- cascade item.
   -> IO MenuCascade
   -- ^ A menu cascade item.
createMenuCascade m cnf = createMenuItem m MENUCASCADE MenuCascade cnf


-- -----------------------------------------------------------------------
-- instances
-- -----------------------------------------------------------------------

-- | A menu cascade item is a menu item (any menu item instantiates the
-- abstract @class MenuItem@).
instance MenuItem MenuCascade

-- | Internal.
instance Eq MenuCascade where
  w1 == w2 = (toGUIObject w1) == (toGUIObject w2)

-- | Internal.
instance GUIObject MenuCascade where
  toGUIObject (MenuCascade w) = w
  cname _ = "MenuCascade"

-- | You can synchronize on a menu cascade item.
instance Synchronized MenuCascade where
  -- Synchronizes on a menu cascade item.
  synchronize = synchronize . toGUIObject

-- | A menu cascade item has an optional text to display as a reminder
-- about a keystroke binding.
instance HasAccelerator MenuCascade

-- | A menu cascade item can contain a bitmap (instead of text or an image).
instance HasBitMap MenuCascade

-- | A menu cascade item has a configureable border.
instance HasBorder MenuCascade

-- | A menu cascade item has a normal foreground and background colour and
-- an active\/disabled foreground and background colour.
instance HasColour MenuCascade where
  legalColourID = buttonColours

-- | A menu cascade item is a stateful object, it can be enabled or
-- disabled.
instance HasEnable MenuCascade

-- | You can specify the font of a menu cascade item.
instance HasFont MenuCascade

-- | A menu cascade item has a configureable text justification.
instance HasJustify MenuCascade

-- | You can display an indicator with a menu cascade item.
instance HasIndicator MenuCascade

-- | A menu cascade item can contain an image (instead of text or a bitmap).
instance HasPhoto MenuCascade

-- | You can specify the size of a menu cascade item.
instance HasSize MenuCascade

-- | A menu cascade item can contain text (instead of an image or bitmap).
instance GUIValue v => HasText MenuCascade v where
  -- Sets the text to display.
  text str w = cset w "label" str >> return w
  -- Gets the displayed text.
  getText w = cget w "label"

-- | You can set the index of a text character to underline.
instance HasUnderline MenuCascade


-- | Utility function: create a pulldown menu
--
createPulldownMenu :: Menu
   -- ^ the parent menu.
   -> [Config MenuCascade]
   -- ^ the list of configuration options for this pulldown menu
   -> IO Menu
   -- ^ A menu cascade item.
createPulldownMenu mpar conf =
  do pd <- createMenuCascade mpar conf
     m  <- createMenu mpar False []
     pd # menu m
     return m