    {-# LINE 2 "./Graphics/UI/Gtk/Misc/SizeGroup.chs" #-}
    -- -*-haskell-*-
    -- GIMP Toolkit (GTK) Widget SizeGroup
    --
    -- Author : Duncan Coutts
    --
    -- Created: 2 August 2004
    --
    -- Copyright (C) 2004-2005 Duncan Coutts
    --
    -- This library is free software; you can redistribute it and/or
    -- modify it under the terms of the GNU Lesser General Public
    -- License as published by the Free Software Foundation; either
    -- version 2.1 of the License, or (at your option) any later version.
    --
    -- This library is distributed in the hope that it will be useful,
    -- but WITHOUT ANY WARRANTY; without even the implied warranty of
    -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    -- Lesser General Public License for more details.
    --
    -- |
    -- Maintainer : gtk2hs-users@lists.sourceforge.net
    -- Stability : provisional
    -- Portability : portable (depends on GHC)
    --
    -- Grouping widgets so they request the same size
    --
    module Graphics.UI.Gtk.Misc.SizeGroup (
    -- * Detail
    --
    -- | 'SizeGroup' provides a mechanism for grouping a number of widgets
    -- together so they all request the same amount of space. This is typically
    -- useful when you want a column of widgets to have the same size, but you
    -- can't use a 'Table' widget.
    --
    -- In detail, the size requested for each widget in a 'SizeGroup' is the
    -- maximum of the sizes that would have been requested for each widget in the
    -- size group if they were not in the size group. The mode of the size group
    -- (see 'sizeGroupSetMode') determines whether this applies to the horizontal
    -- size, the vertical size, or both sizes.
    --
    -- Note that size groups only affect the amount of space requested, not the
    -- size that the widgets finally receive. If you want the widgets in a
    -- 'SizeGroup' to actually be the same size, you need to pack them in such a
    -- way that they get the size they request and not more. For example, if you
    -- are packing your widgets into a table, you would not include the
    -- 'Graphics.UI.Gtk.Layout.Table.Fill' flag.
    --
    -- Widgets can be part of multiple size groups; Gtk+ will compute the
    -- horizontal size of a widget from the horizontal requisition of all widgets
    -- that can be reached from the widget by a chain of size groups of type
    -- 'SizeGroupHorizontal' or 'SizeGroupBoth', and the vertical size from the
    -- vertical requisition of all widgets that can be reached from the widget by a
    -- chain of size groups of type 'SizeGroupVertical' or 'SizeGroupBoth'.

    -- * Class Hierarchy
    -- |
    -- @
    -- | 'GObject'
    -- | +----SizeGroup
    -- @

    -- * Types
      SizeGroup,
      SizeGroupClass,
      castToSizeGroup, gTypeSizeGroup,
      toSizeGroup,

    -- * Constructors
      sizeGroupNew,

    -- * Methods
      SizeGroupMode(..),
      sizeGroupSetMode,
      sizeGroupGetMode,
      sizeGroupAddWidget,
      sizeGroupRemoveWidget,

      sizeGroupSetIgnoreHidden,
      sizeGroupGetIgnoreHidden,

    -- * Attributes
      sizeGroupMode,

      sizeGroupIgnoreHidden,

      ) where

    import Control.Monad (liftM)

    import System.Glib.FFI
    import System.Glib.Attributes
    import Graphics.UI.Gtk.Types
    {-# LINE 95 "./Graphics/UI/Gtk/Misc/SizeGroup.chs" #-}

    {-# LINE 97 "./Graphics/UI/Gtk/Misc/SizeGroup.chs" #-}

    data SizeGroupMode = SizeGroupNone
                       | SizeGroupHorizontal
                       | SizeGroupVertical
                       | SizeGroupBoth
                       deriving (Int -> SizeGroupMode
    SizeGroupMode -> Int
    SizeGroupMode -> [SizeGroupMode]
    SizeGroupMode -> SizeGroupMode
    SizeGroupMode -> SizeGroupMode -> [SizeGroupMode]
    SizeGroupMode -> SizeGroupMode -> SizeGroupMode -> [SizeGroupMode]
    (SizeGroupMode -> SizeGroupMode)
    -> (SizeGroupMode -> SizeGroupMode)
    -> (Int -> SizeGroupMode)
    -> (SizeGroupMode -> Int)
    -> (SizeGroupMode -> [SizeGroupMode])
    -> (SizeGroupMode -> SizeGroupMode -> [SizeGroupMode])
    -> (SizeGroupMode -> SizeGroupMode -> [SizeGroupMode])
    -> (SizeGroupMode
        -> SizeGroupMode -> SizeGroupMode -> [SizeGroupMode])
    -> Enum SizeGroupMode
    forall a.
    (a -> a)
    -> (a -> a)
    -> (Int -> a)
    -> (a -> Int)
    -> (a -> [a])
    -> (a -> a -> [a])
    -> (a -> a -> [a])
    -> (a -> a -> a -> [a])
    -> Enum a
    $csucc :: SizeGroupMode -> SizeGroupMode
    succ :: SizeGroupMode -> SizeGroupMode
    $cpred :: SizeGroupMode -> SizeGroupMode
    pred :: SizeGroupMode -> SizeGroupMode
    $ctoEnum :: Int -> SizeGroupMode
    toEnum :: Int -> SizeGroupMode
    $cfromEnum :: SizeGroupMode -> Int
    fromEnum :: SizeGroupMode -> Int
    $cenumFrom :: SizeGroupMode -> [SizeGroupMode]
    enumFrom :: SizeGroupMode -> [SizeGroupMode]
    $cenumFromThen :: SizeGroupMode -> SizeGroupMode -> [SizeGroupMode]
    enumFromThen :: SizeGroupMode -> SizeGroupMode -> [SizeGroupMode]
    $cenumFromTo :: SizeGroupMode -> SizeGroupMode -> [SizeGroupMode]
    enumFromTo :: SizeGroupMode -> SizeGroupMode -> [SizeGroupMode]
    $cenumFromThenTo :: SizeGroupMode -> SizeGroupMode -> SizeGroupMode -> [SizeGroupMode]
    enumFromThenTo :: SizeGroupMode -> SizeGroupMode -> SizeGroupMode -> [SizeGroupMode]
    Enum)

    {-# LINE 99 "./Graphics/UI/Gtk/Misc/SizeGroup.chs" #-}

    --------------------
    -- Constructors

    -- | Create a new 'SizeGroup'.
    --
    sizeGroupNew ::
        SizeGroupMode -- ^ @mode@ - the mode for the new size group.
     -> IO SizeGroup
    sizeGroupNew :: SizeGroupMode -> IO SizeGroup
    sizeGroupNew SizeGroupMode
    mode =
      (ForeignPtr SizeGroup -> SizeGroup, FinalizerPtr SizeGroup)
    -> IO (Ptr SizeGroup) -> IO SizeGroup
    forall obj.
    GObjectClass obj =>
    (ForeignPtr obj -> obj, FinalizerPtr obj) -> IO (Ptr obj) -> IO obj
    wrapNewGObject (ForeignPtr SizeGroup -> SizeGroup, FinalizerPtr SizeGroup)
    forall {a}. (ForeignPtr SizeGroup -> SizeGroup, FinalizerPtr a)
    mkSizeGroup (IO (Ptr SizeGroup) -> IO SizeGroup)
    -> IO (Ptr SizeGroup) -> IO SizeGroup
    forall a b. (a -> b) -> a -> b
    $
      CInt -> IO (Ptr SizeGroup)
    gtk_size_group_new
    {-# LINE 111 "./Graphics/UI/Gtk/Misc/SizeGroup.chs" #-}
        ((fromIntegral . fromEnum) mode)

    --------------------
    -- Methods

    -- | Adds a widget to a 'SizeGroup'. In the future, the requisition of the
    -- widget will be determined as the maximum of its requisition and the
    -- requisition of the other widgets in the size group. Whether this applies
    -- horizontally, vertically, or in both directions depends on the mode of the
    -- size group. See 'sizeGroupSetMode'.
    --
    sizeGroupAddWidget :: (SizeGroupClass self, WidgetClass widget) => self
     -> widget -- ^ @widget@ - the 'Widget' to add
     -> IO ()
    sizeGroupAddWidget :: forall self widget.
    (SizeGroupClass self, WidgetClass widget) =>
    self -> widget -> IO ()
    sizeGroupAddWidget self
    self widget
    widget =
      (\(SizeGroup ForeignPtr SizeGroup
    arg1) (Widget ForeignPtr Widget
    arg2) -> ForeignPtr SizeGroup -> (Ptr SizeGroup -> IO ()) -> IO ()
    forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
    withForeignPtr ForeignPtr SizeGroup
    arg1 ((Ptr SizeGroup -> IO ()) -> IO ())
    -> (Ptr SizeGroup -> IO ()) -> IO ()
    forall a b. (a -> b) -> a -> b
    $ \Ptr SizeGroup
    argPtr1 ->ForeignPtr Widget -> (Ptr Widget -> IO ()) -> IO ()
    forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
    withForeignPtr ForeignPtr Widget
    arg2 ((Ptr Widget -> IO ()) -> IO ()) -> (Ptr Widget -> IO ()) -> IO ()
    forall a b. (a -> b) -> a -> b
    $ \Ptr Widget
    argPtr2 ->Ptr SizeGroup -> Ptr Widget -> IO ()
    gtk_size_group_add_widget Ptr SizeGroup
    argPtr1 Ptr Widget
    argPtr2)
    {-# LINE 127 "./Graphics/UI/Gtk/Misc/SizeGroup.chs" #-}
        (toSizeGroup self)
        (widget -> Widget
    forall o. WidgetClass o => o -> Widget
    toWidget widget
    widget)

    -- | Gets the current mode of the size group. See 'sizeGroupSetMode'.
    --
    sizeGroupGetMode :: SizeGroupClass self => self
     -> IO SizeGroupMode -- ^ returns the current mode of the size group.
    sizeGroupGetMode :: forall self. SizeGroupClass self => self -> IO SizeGroupMode
    sizeGroupGetMode self
    self =
      (CInt -> SizeGroupMode) -> IO CInt -> IO SizeGroupMode
    forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
    liftM (Int -> SizeGroupMode
    forall a. Enum a => Int -> a
    toEnum (Int -> SizeGroupMode) -> (CInt -> Int) -> CInt -> SizeGroupMode
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . CInt -> Int
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral) (IO CInt -> IO SizeGroupMode) -> IO CInt -> IO SizeGroupMode
    forall a b. (a -> b) -> a -> b
    $
      (\(SizeGroup ForeignPtr SizeGroup
    arg1) -> ForeignPtr SizeGroup -> (Ptr SizeGroup -> IO CInt) -> IO CInt
    forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
    withForeignPtr ForeignPtr SizeGroup
    arg1 ((Ptr SizeGroup -> IO CInt) -> IO CInt)
    -> (Ptr SizeGroup -> IO CInt) -> IO CInt
    forall a b. (a -> b) -> a -> b
    $ \Ptr SizeGroup
    argPtr1 ->Ptr SizeGroup -> IO CInt
    gtk_size_group_get_mode Ptr SizeGroup
    argPtr1)
    {-# LINE 137 "./Graphics/UI/Gtk/Misc/SizeGroup.chs" #-}
        (toSizeGroup self)

    -- | Removes a widget from a 'SizeGroup'.
    --
    sizeGroupRemoveWidget :: (SizeGroupClass self, WidgetClass widget) => self
     -> widget -- ^ @widget@ - the 'Widget' to remove
     -> IO ()
    sizeGroupRemoveWidget :: forall self widget.
    (SizeGroupClass self, WidgetClass widget) =>
    self -> widget -> IO ()
    sizeGroupRemoveWidget self
    self widget
    widget =
      (\(SizeGroup ForeignPtr SizeGroup
    arg1) (Widget ForeignPtr Widget
    arg2) -> ForeignPtr SizeGroup -> (Ptr SizeGroup -> IO ()) -> IO ()
    forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
    withForeignPtr ForeignPtr SizeGroup
    arg1 ((Ptr SizeGroup -> IO ()) -> IO ())
    -> (Ptr SizeGroup -> IO ()) -> IO ()
    forall a b. (a -> b) -> a -> b
    $ \Ptr SizeGroup
    argPtr1 ->ForeignPtr Widget -> (Ptr Widget -> IO ()) -> IO ()
    forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
    withForeignPtr ForeignPtr Widget
    arg2 ((Ptr Widget -> IO ()) -> IO ()) -> (Ptr Widget -> IO ()) -> IO ()
    forall a b. (a -> b) -> a -> b
    $ \Ptr Widget
    argPtr2 ->Ptr SizeGroup -> Ptr Widget -> IO ()
    gtk_size_group_remove_widget Ptr SizeGroup
    argPtr1 Ptr Widget
    argPtr2)
    {-# LINE 146 "./Graphics/UI/Gtk/Misc/SizeGroup.chs" #-}
        (toSizeGroup self)
        (widget -> Widget
    forall o. WidgetClass o => o -> Widget
    toWidget widget
    widget)

    -- | Sets the 'SizeGroupMode' of the size group. The mode of the size group
    -- determines whether the widgets in the size group should all have the same
    -- horizontal requisition 'SizeGroupHorizontal' all have the same vertical
    -- requisition 'SizeGroupVertical', or should all have the same requisition
    -- in both directions 'SizeGroupBoth'.
    --
    sizeGroupSetMode :: SizeGroupClass self => self
     -> SizeGroupMode -- ^ @mode@ - the mode to set for the size group.
     -> IO ()
    sizeGroupSetMode :: forall self. SizeGroupClass self => self -> SizeGroupMode -> IO ()
    sizeGroupSetMode self
    self SizeGroupMode
    mode =
      (\(SizeGroup ForeignPtr SizeGroup
    arg1) CInt
    arg2 -> ForeignPtr SizeGroup -> (Ptr SizeGroup -> IO ()) -> IO ()
    forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
    withForeignPtr ForeignPtr SizeGroup
    arg1 ((Ptr SizeGroup -> IO ()) -> IO ())
    -> (Ptr SizeGroup -> IO ()) -> IO ()
    forall a b. (a -> b) -> a -> b
    $ \Ptr SizeGroup
    argPtr1 ->Ptr SizeGroup -> CInt -> IO ()
    gtk_size_group_set_mode Ptr SizeGroup
    argPtr1 CInt
    arg2)
    {-# LINE 160 "./Graphics/UI/Gtk/Misc/SizeGroup.chs" #-}
        (toSizeGroup self)
        ((Int -> CInt
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral (Int -> CInt) -> (SizeGroupMode -> Int) -> SizeGroupMode -> CInt
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . SizeGroupMode -> Int
    forall a. Enum a => a -> Int
    fromEnum) SizeGroupMode
    mode)

    -- | Sets whether invisible widgets should be ignored when calculating the
    -- size.
    --
    -- * Available since Gtk+ version 2.8
    --
    sizeGroupSetIgnoreHidden :: SizeGroupClass self => self
     -> Bool -- ^ @ignoreHidden@ - whether hidden widgets should be ignored when
              -- calculating the size
     -> IO ()
    sizeGroupSetIgnoreHidden :: forall self. SizeGroupClass self => self -> Bool -> IO ()
    sizeGroupSetIgnoreHidden self
    self Bool
    ignoreHidden =
      (\(SizeGroup ForeignPtr SizeGroup
    arg1) CInt
    arg2 -> ForeignPtr SizeGroup -> (Ptr SizeGroup -> IO ()) -> IO ()
    forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
    withForeignPtr ForeignPtr SizeGroup
    arg1 ((Ptr SizeGroup -> IO ()) -> IO ())
    -> (Ptr SizeGroup -> IO ()) -> IO ()
    forall a b. (a -> b) -> a -> b
    $ \Ptr SizeGroup
    argPtr1 ->Ptr SizeGroup -> CInt -> IO ()
    gtk_size_group_set_ignore_hidden Ptr SizeGroup
    argPtr1 CInt
    arg2)
    {-# LINE 175 "./Graphics/UI/Gtk/Misc/SizeGroup.chs" #-}
        (toSizeGroup self)
        (Bool -> CInt
    forall a. Num a => Bool -> a
    fromBool Bool
    ignoreHidden)

    -- | Returns if invisible widgets are ignored when calculating the size.
    --
    -- * Available since Gtk+ version 2.8
    --
    sizeGroupGetIgnoreHidden :: SizeGroupClass self => self
     -> IO Bool -- ^ returns @True@ if invisible widgets are ignored.
    sizeGroupGetIgnoreHidden :: forall self. SizeGroupClass self => self -> IO Bool
    sizeGroupGetIgnoreHidden self
    self =
      (CInt -> Bool) -> IO CInt -> IO Bool
    forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
    liftM CInt -> Bool
    forall a. (Eq a, Num a) => a -> Bool
    toBool (IO CInt -> IO Bool) -> IO CInt -> IO Bool
    forall a b. (a -> b) -> a -> b
    $
      (\(SizeGroup ForeignPtr SizeGroup
    arg1) -> ForeignPtr SizeGroup -> (Ptr SizeGroup -> IO CInt) -> IO CInt
    forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
    withForeignPtr ForeignPtr SizeGroup
    arg1 ((Ptr SizeGroup -> IO CInt) -> IO CInt)
    -> (Ptr SizeGroup -> IO CInt) -> IO CInt
    forall a b. (a -> b) -> a -> b
    $ \Ptr SizeGroup
    argPtr1 ->Ptr SizeGroup -> IO CInt
    gtk_size_group_get_ignore_hidden Ptr SizeGroup
    argPtr1)
    {-# LINE 187 "./Graphics/UI/Gtk/Misc/SizeGroup.chs" #-}
        (toSizeGroup self)

    --------------------
    -- Attributes

    -- | The directions in which the size group affects the requested sizes of its
    -- component widgets.
    --
    -- Default value: 'SizeGroupHorizontal'
    --
    sizeGroupMode :: SizeGroupClass self => Attr self SizeGroupMode
    sizeGroupMode :: forall self. SizeGroupClass self => Attr self SizeGroupMode
    sizeGroupMode = (self -> IO SizeGroupMode)
    -> (self -> SizeGroupMode -> IO ())
    -> ReadWriteAttr self SizeGroupMode SizeGroupMode
    forall o a b.
    (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
    newAttr
      self -> IO SizeGroupMode
    forall self. SizeGroupClass self => self -> IO SizeGroupMode
    sizeGroupGetMode
      self -> SizeGroupMode -> IO ()
    forall self. SizeGroupClass self => self -> SizeGroupMode -> IO ()
    sizeGroupSetMode

    -- | If @True@, hidden widgets are ignored when determining the size of the
    -- group.
    --
    -- Default value: @False@
    --
    sizeGroupIgnoreHidden :: SizeGroupClass self => Attr self Bool
    sizeGroupIgnoreHidden :: forall self. SizeGroupClass self => Attr self Bool
    sizeGroupIgnoreHidden = (self -> IO Bool)
    -> (self -> Bool -> IO ()) -> ReadWriteAttr self Bool Bool
    forall o a b.
    (o -> IO a) -> (o -> b -> IO ()) -> ReadWriteAttr o a b
    newAttr
      self -> IO Bool
    forall self. SizeGroupClass self => self -> IO Bool
    sizeGroupGetIgnoreHidden
      self -> Bool -> IO ()
    forall self. SizeGroupClass self => self -> Bool -> IO ()
    sizeGroupSetIgnoreHidden

    foreign import ccall unsafe "gtk_size_group_new"
      gtk_size_group_new :: (CInt -> (IO (Ptr SizeGroup)))

    foreign import ccall safe "gtk_size_group_add_widget"
      gtk_size_group_add_widget :: ((Ptr SizeGroup) -> ((Ptr Widget) -> (IO ())))

    foreign import ccall unsafe "gtk_size_group_get_mode"
      gtk_size_group_get_mode :: ((Ptr SizeGroup) -> (IO CInt))

    foreign import ccall safe "gtk_size_group_remove_widget"
      gtk_size_group_remove_widget :: ((Ptr SizeGroup) -> ((Ptr Widget) -> (IO ())))

    foreign import ccall safe "gtk_size_group_set_mode"
      gtk_size_group_set_mode :: ((Ptr SizeGroup) -> (CInt -> (IO ())))

    foreign import ccall safe "gtk_size_group_set_ignore_hidden"
      gtk_size_group_set_ignore_hidden :: ((Ptr SizeGroup) -> (CInt -> (IO ())))

    foreign import ccall safe "gtk_size_group_get_ignore_hidden"
      gtk_size_group_get_ignore_hidden :: ((Ptr SizeGroup) -> (IO CInt))