packages feed

AndroidViewHierarchyImporter-0.1.0.0: Types.hs

{- | Types used by the tool

-}
module Types(
	-- * Types 
	-- ** Identification of the windows and views
	  ViewServerPort(..)
	, WindowHash(..)
	, ActivityName 
	-- ** Description of the windows and views
	, Window
	, View(..)
	-- ** Configuration and output format
	, Config(..)
	, OutputFormat(..)
	-- * Functions
	, mkWindow
	, windowHash 
	, activityName
	, setViewProperty
	, emptyView
	, defaultConfig
	) where

import System.Console.CmdTheLine.ArgVal
import Text.PrettyPrint

-- | Port ID
type ViewServerPort = Int

-- | Window hash generated by Android
type WindowHash = String 

-- | Activity name
type ActivityName = String 

-- | Output format
data OutputFormat = Raw -- ^ Raw text as generated 
                  | Views 
                  | Graphviz 
                  | Opml 

instance ArgVal OutputFormat where 
   pp Raw = text "raw" 
   pp Views = text "view"
   pp Graphviz = text "graphviz"
   pp Opml = text "opml"
  
   parser "raw" = Right Raw 
   parser "view" = Right Views
   parser "graphviz" = Right Graphviz
   parser "opml" = Right Opml
   parser _ = Left (text "Error parsing the output format")


-- | Configuration for a run of the tool
data Config = Config {
	          hostname :: String 
	        , port :: ViewServerPort 
	        , forward :: Bool
	        , mustListWindows :: Bool 
	        , mustListViews :: Maybe WindowHash
	        , outputFormat :: OutputFormat
	        , outputFile :: Maybe FilePath
            }

defaultConfig = Config {
	            hostname = "127.0.0.1"
	          , port = 4939 
	          , forward = True
	          , mustListWindows = True 
	          , mustListViews = Nothing
	          , outputFormat = Opml
	          , outputFile = Nothing
              }

-- | Description of a window
data Window = W {windowHash :: !WindowHash, activityName :: !ActivityName} deriving(Eq,Read,Show)

mkWindow :: WindowHash -> ActivityName -> Window
mkWindow = W 

type ViewID = String

-- | Description of a view
data View = V { mID :: ViewID
	          , top :: Int 
	          , left :: Int 
	          , height :: Int 
	          , width :: Int 
	          , scrollX :: Int 
	          , scrollY :: Int 
	          , paddingLeft :: Int 
	          , paddingRight :: Int 
	          , paddingTop :: Int 
	          , paddingBottom :: Int
	          , marginLeft :: Int 
	          , marginRight :: Int 
	          , marginTop :: Int 
	          , marginBottom :: Int
	          , baseline :: Int 
	          , willNotDraw :: Bool 
	          , hasFocus :: Bool
	          , layerType :: String
              }
              deriving(Eq,Show,Read)

emptyView = V { mID = ""
	          , top = 0
	          , left = 0
	          , height = 0
	          , width = 0
	          , scrollX = 0
	          , scrollY = 0
	          , paddingLeft = 0
	          , paddingRight = 0
	          , paddingTop = 0
	          , paddingBottom = 0
	          , marginLeft = minBound
	          , marginRight = minBound
	          , marginTop = minBound
	          , marginBottom = minBound
	          , baseline = 0
	          , willNotDraw = False
	          , hasFocus = False
	          , layerType ="NONE"
              }

-- | Parse a view property and update the corresponding view field.
-- a property genrated by the view server is key=value converted to (key,value)
setViewProperty :: View -> (String,String) -> View 
setViewProperty v ("layout:mLeft",theData) = v {left = read theData}
setViewProperty v ("layout:mTop",theData) = v {top = read theData}
setViewProperty v ("layout:getWidth()",theData) = v {width = read theData}
setViewProperty v ("layout:getHeight()",theData) = v {height = read theData}
setViewProperty v ("padding:mPaddingLeft",theData) = v {paddingLeft = read theData}
setViewProperty v ("padding:mPaddingRight",theData) = v {paddingRight = read theData}
setViewProperty v ("padding:mPaddingBottom",theData) = v {paddingBottom = read theData}
setViewProperty v ("padding:mPaddingTop",theData) = v {paddingTop = read theData}
setViewProperty v ("scrolling:mScrollX", theData) = v {scrollX = read theData}
setViewProperty v ("scrolling:mScrollY", theData) = v {scrollY = read theData}
setViewProperty v ("layout:layout_leftMargin",theData) = v {marginLeft = read theData}
setViewProperty v ("layout:layout_rightMargin",theData) = v {marginRight = read theData}
setViewProperty v ("layout:layout_bottomMargin",theData) = v {marginTop = read theData}
setViewProperty v ("layout:layout_topMargin",theData) = v {marginBottom = read theData}
setViewProperty v ("layout:getBaseline()",theData) = v {baseline = read theData}
setViewProperty v ("drawing:willNotDraw()","false") = v {willNotDraw = False}
setViewProperty v ("drawing:willNotDraw()","true") = v {willNotDraw = True}
setViewProperty v ("focus:hasFocus()","false") = v {hasFocus = False}
setViewProperty v ("focus:hasFocus()","true") = v {hasFocus = True}
setViewProperty v ("drawing:mLayerType",theData) = v {layerType = theData}
setViewProperty v _ = v