packages feed

leksah-0.1: src/IDE/Framework/Parameters.hs

-----------------------------------------------------------------------------
--
-- Module      :  IDE.Framework.Parameters
-- Copyright   :  (c) Juergen Nicklisch-Franken (aka Jutaro)
-- License     :  GNU-GPL
--
-- Maintainer  :  Juergen Nicklisch-Franken <jnf at arcor.de>
-- Stability   :  experimental
-- Portability :  portable
--
-- | Module for parameters for editors
--
-----------------------------------------------------------------------------------

module IDE.Framework.Parameters (
    Parameters
,   Parameter(..)
,   paraName
,   paraSynopsis
,   paraDirection
,   paraShadow
,   paraOuterAlignment
,   paraInnerAlignment
,   paraOuterPadding
,   paraInnerPadding
,   paraMinSize
,   paraHorizontal
,   getParameter
,   getParameterPrim
,   (<<<-)
,   emptyParams
,   Direction(..)
,   HorizontalAlign(..)
) where

import Graphics.UI.Gtk
import Data.Maybe
import qualified Data.List as List

import IDE.Core.Exception

--
-- | The direction of a split
--
data Direction      =   Horizontal | Vertical
    deriving (Eq,Show)

data HorizontalAlign =   StartHorizontal | StopHorizontal | Keep
    deriving (Eq,Show)
--
-- | A type for parameters for editors
--
type Parameters     =   [Parameter]

data Parameter      =   ParaName String
                    |   ParaSynopsis String
                    |   ParaDirection Direction
                    |   ParaShadow ShadowType
                    |   ParaOuterAlignment  (Float,Float,Float,Float)
                                               -- | xalign yalign xscale yscale
                    |   ParaOuterPadding    (Int,Int,Int,Int)
                                                --  | paddingTop paddingBottom paddingLeft paddingRight
                    |   ParaInnerAlignment  (Float,Float,Float,Float)
                                                -- | xalign yalign xscale yscale
                    |   ParaInnerPadding   (Int,Int,Int,Int)
                                                --  | paddingTop paddingBottom paddingLeft paddingRight
                    |   ParaMinSize         (Int, Int)
                    |   ParaHorizontal      HorizontalAlign
    deriving (Eq,Show)

instance Show ShadowType
    where show _    =   "Any Shadow"

emptyParams         ::   [Parameter]
emptyParams         =   []

paraName                        ::   (Parameter -> (Maybe String))
paraName (ParaName str)         =   Just str
paraName _                      =   Nothing

paraSynopsis                    ::   (Parameter -> (Maybe String))
paraSynopsis (ParaSynopsis str) =   Just str
paraSynopsis _                  =   Nothing

paraDirection                   ::   (Parameter -> (Maybe Direction))
paraDirection (ParaDirection d) =   Just d
paraDirection _                 =   Nothing

paraShadow                      ::   (Parameter -> (Maybe ShadowType))
paraShadow (ParaShadow d)       =   Just d
paraShadow _                    =   Nothing

paraOuterAlignment              ::   (Parameter -> (Maybe (Float,Float,Float,Float)))
paraOuterAlignment (ParaOuterAlignment d) = Just d
paraOuterAlignment _            =   Nothing

paraInnerAlignment              ::   (Parameter -> (Maybe (Float,Float,Float,Float)))
paraInnerAlignment (ParaInnerAlignment d) = Just d
paraInnerAlignment _            =   Nothing

paraOuterPadding                ::   (Parameter -> (Maybe (Int,Int,Int,Int)))
paraOuterPadding (ParaOuterPadding d) = Just d
paraOuterPadding _              =   Nothing

paraInnerPadding                ::   (Parameter -> (Maybe (Int,Int,Int,Int)))
paraInnerPadding (ParaInnerPadding d) = Just d
paraInnerPadding _              =   Nothing

paraMinSize                     ::   (Parameter -> (Maybe (Int, Int)))
paraMinSize (ParaMinSize d)     =   Just d
paraMinSize _                   =   Nothing

paraHorizontal                  ::   (Parameter -> (Maybe (HorizontalAlign)))
paraHorizontal (ParaHorizontal d) =   Just d
paraHorizontal _                =   Nothing

--
-- | Convenience method to get a parameter, or if not set the default parameter
--
getParameter :: (Parameter -> (Maybe beta)) -> Parameters -> beta
getParameter selector parameter =
    case getParameterPrim selector parameter of
        Just ele       -> ele
        _              -> case getParameterPrim selector defaultParameters of
                            Just ele       -> ele
                            _              -> throwIDE "default parameter not defined"

getParameterPrim :: (Parameter -> (Maybe beta)) -> Parameters -> Maybe beta
getParameterPrim selector parameter =
    case filter isJust $ map selector parameter of
        (Just ele) : _ -> Just ele
        _              -> Nothing

(<<<-) :: (Parameter -> (Maybe beta)) -> Parameter -> Parameters -> Parameters
(<<<-) selector para  = \params -> para : filter (isNothing . selector) params

defaultParameters :: Parameters
defaultParameters =
    [   ParaName ""
    ,   ParaSynopsis ""
    ,   ParaDirection Horizontal
    ,   ParaShadow ShadowNone
    ,   ParaOuterAlignment  (0.5, 0.5, 0.95, 0.95)
    ,   ParaOuterPadding    (2, 5, 3, 3)
    ,   ParaInnerAlignment  (0.5, 0.5, 0.95, 0.95)
    ,   ParaInnerPadding    (2, 5, 3, 3)
    ,   ParaMinSize         (-1,-1)
    ,   ParaHorizontal      Keep]