-- ----------------------------------------------------------------------- -- -- $Source: /repository/uni/htk/components/BitMap.hs,v $ -- -- HTk - a GUI toolkit for Haskell - (c) Universitaet Bremen -- -- $Revision: 1.7 $ from $Date: 2002/04/23 21:16:59 $ -- Last modification by $Author: cxl $ -- -- ----------------------------------------------------------------------- --- -- This module provides access to bitmap resources. module BitMap ( BitMap, newBitMap, BitMapHandle(..), HasBitMap(..), BitMapDesignator(..), errmap, gray50, gray25, hourglass, info, questhead, question, warning, setBitMapHandle, getBitMapHandle, stringToBitMapHandle ) where import GUIValue import Core import BaseClasses(Widget) import Configuration import Char(isDigit) import Computation import Synchronized import Destructible import Packer -- ----------------------------------------------------------------------- -- BitMap designators -- ----------------------------------------------------------------------- --- -- The BitMapHandle datatype - a handle for a bitmap -- resource. data BitMapHandle = Predefined String | BitMapHandle BitMap | BitMapFile String --- -- Internal. class BitMapDesignator d where --- -- Internal. toBitMap :: d -> BitMapHandle --- -- Internal. instance BitMapDesignator BitMapHandle where --- -- Internal. toBitMap = id --- -- Internal. instance BitMapDesignator BitMap where --- -- Internal. toBitMap h = BitMapHandle h --- -- A string is a handle for a bitmap file. instance BitMapDesignator [Char] where toBitMap h = BitMapFile h -- ----------------------------------------------------------------------- -- BitMap'ed widgets -- ----------------------------------------------------------------------- --- -- Containers for bitmaps instantiate the class HasBitMap. class GUIObject w => HasBitMap w where bitmap :: BitMapDesignator d => d -> Config w getBitMap :: w -> IO BitMapHandle bitmap d w = setBitMapHandle w "bitmap" (toBitMap d) True getBitMap w = getBitMapHandle w "bitmap" -- ----------------------------------------------------------------------- -- type BitMap -- ----------------------------------------------------------------------- --- -- The BitMap datatype. newtype BitMap = BitMapWDG GUIOBJECT deriving Eq -- ----------------------------------------------------------------------- -- commands -- ----------------------------------------------------------------------- --- -- Constructs a new bitmap object and returns a handler.
-- The bitmap object can be packed like a widget, then it is implicitely -- displayed inside a label widget. -- @param cnf - the list of configuration options for this bitmap object. -- @return result - A bitmap object. newBitMap :: [Config BitMap] -> IO BitMap newBitMap confs = do w <- createWidget ROOT LABEL configure (BitMapWDG w) confs -- ----------------------------------------------------------------------- -- predefined Tk BitMaps -- ----------------------------------------------------------------------- --- -- A handle for the predefined "error" bitmap. errmap :: BitMapHandle errmap = Predefined "error" --- -- A handle for the predefined "gray50" bitmap. gray50 :: BitMapHandle gray50 = Predefined "gray50" --- -- A handle for the predefined "gray25" bitmap. gray25 :: BitMapHandle gray25 = Predefined "gray25" --- -- A handle for the predefined "hourglass" bitmap. hourglass :: BitMapHandle hourglass = Predefined "hourglass" --- -- A handle for the predefined "info" bitmap. info :: BitMapHandle info = Predefined "info" --- -- A handle for the predefined "questhead" bitmap. questhead :: BitMapHandle questhead = Predefined "questhead" --- -- A handle for the predefined "question" bitmap. question :: BitMapHandle question = Predefined "question" --- -- A handle for the predefined "warning" bitmap. warning :: BitMapHandle warning = Predefined "warning" -- ----------------------------------------------------------------------- -- configuration options -- ----------------------------------------------------------------------- --- -- Internal. instance GUIObject BitMap where --- -- Internal. toGUIObject (BitMapWDG w) = w --- -- Internal. cname _ = "BitMap" --- -- A bitmap object can be destroyed. instance Destroyable BitMap where --- -- Destroys a bitmap object. destroy = destroy . toGUIObject --- -- A bitmap object has standard widget properties -- (concerning focus, cursor / if implicitely displayed inside a label -- widget). instance Widget BitMap --- -- A bitmap object has a configureable border (if implicitely displayed -- inside a label widget). instance HasBorder BitMap --- -- A bitmap object has a configureable foreground and background colour -- (if implicitely displayed inside a label widget). instance HasColour BitMap where legalColourID = hasForeGroundColour --- -- You can specify the size of the containing label, if the bitmap is -- implicitely displayed inside a label widget. instance HasSize BitMap --- -- Bitmaps can be read from files. instance HasFile BitMap where --- -- Specifies the bitmap's file path. filename fname w = execTclScript [tkBitMapCreate no fname] >> cset w "image" no where no = getObjectNo (toGUIObject w) --- -- Gets the bitmap's file name. getFileName w = evalTclScript [tkGetBitMapFile no] where no = getObjectNo (toGUIObject w) --- -- You can synchronize on a bitmap object. instance Synchronized BitMap where --- -- Synchronizes on a bitmap object. synchronize (BitMapWDG w) = synchronize w -- ----------------------------------------------------------------------- -- auxiliary functions -- ----------------------------------------------------------------------- --- -- Internal. setBitMapHandle :: GUIObject w => w -> ConfigID -> BitMapHandle -> Bool -> IO w setBitMapHandle w cnm (Predefined d) _ = cset w cnm d setBitMapHandle w cnm (BitMapFile f) _ = cset w cnm ('@':f) setBitMapHandle w _ (BitMapHandle h) True = cset w "image" (getObjectNo (toGUIObject h)) setBitMapHandle w cnm (BitMapHandle h) False = do fname <- getFileName h setBitMapHandle w cnm (BitMapFile fname) False return w {- the last parameter determines whether integer numbers are acceptable as bitmap denotations or not. If not, we use the corresponding file name associated with the widget! Numbers are allowed for labels and buttons, but not for windows! -} --- -- Internal. getBitMapHandle :: GUIObject w => w -> ConfigID -> IO BitMapHandle getBitMapHandle w cnm = cget w cnm >>= stringToBitMapHandle --- -- Internal. stringToBitMapHandle :: String -> IO BitMapHandle stringToBitMapHandle "" = return (Predefined "") stringToBitMapHandle ('@':tl) = return (BitMapFile tl) stringToBitMapHandle (str @ (x:tl)) | isDigit x = lookupGUIObject (read str) >>= return . BitMapHandle . BitMapWDG stringToBitMapHandle str = return (Predefined str) -- ----------------------------------------------------------------------- -- Tk commands -- ----------------------------------------------------------------------- tkBitMapCreate :: Int -> String -> String tkBitMapCreate no f = "image create bitmap " ++ show no ++ " -file " ++ show f {-# INLINE tkBitMapCreate #-} tkGetBitMapFile :: Int -> String tkGetBitMapFile no = (show no) ++ " cget -file " {-# INLINE tkGetBitMapFile #-}