property pDontProfile, pCache on construct me pCache = [:] me.setProfiling() return TRUE end on setProfiling if voidp(pDontProfile) then pDontProfile = 1 if getObjectManager().managerExists(#variable_manager) then if variableExists("profile.fields.enabled") then pDontProfile = 0 end if end if end if end on parse me, tFieldName if memberExists(tFieldName) then if listp(pCache.getAt(tFieldName)) then tdata = pCache.getAt(tFieldName) else if tFieldName contains ".window" then tdata = me.parse_window(tFieldName) pCache.setAt(tFieldName, tdata) else if tFieldName contains ".element" then tdata = me.parse_element(tFieldName) pCache.setAt(tFieldName, tdata) else if tFieldName contains ".room" then tdata = me.parse_visual(tFieldName) else if tFieldName contains ".visual" then tdata = me.parse_visual(tFieldName) pCache.setAt(tFieldName, tdata) end if end if end if end if end if else return(error(me, "Member not found:" && tFieldName, #parse, #major)) end if return(tdata.duplicate()) end on parse_window me, tFieldName if not pDontProfile then startProfilingTask("Layout Parser::parse_window") end if tdata = member(getResourceManager().getmemnum(tFieldName)).text tSupportedTags = [#elements:[#open:"", #close:""], #rect:[#open:"", #close:""], #border:[#open:"", #close:""], #clientrect:[#open:"", #close:""]] tLayDefinition = [:] tOpenTagFlag = 0 tTag = "" x = 1 repeat while x <= tSupportedTags.count tOpen = tSupportedTags.getAt(x).open tClose = tSupportedTags.getAt(x).close tTag = tSupportedTags.getPropAt(x) tList = [] i = 1 repeat while i <= tdata.count(#line) if (tdata.getPropRef(#line, i).getProp(#word, 1) = tOpen) then i = (i + 1) repeat while i <= tdata.count(#line) tLine = tdata.getProp(#line, i) if (tLine.getProp(#word, 1) = tClose) then else tList.add(value(tLine)) i = (1 + i) end if end repeat end if i = (1 + i) end repeat tLayDefinition.setAt(tTag, tList) x = (1 + x) end repeat tElements = [:] repeat while tLayDefinition.getAt(#elements) <= undefined tElem = getAt(undefined, tFieldName) if voidp(tElem.getAt(#id)) then tSymbol = "null" else tSymbol = tElem.id end if if voidp(tElements.getAt(tSymbol)) then tElements.setAt(tSymbol, []) end if tElements.getAt(tSymbol).add(tElem) end repeat tResMngr = getResourceManager() repeat while tLayDefinition.getAt(#elements) <= undefined tElem = getAt(undefined, tFieldName) if stringp(tElem.getAt(#txtColor)) then tElem.setAt(#txtColor, rgb(tElem.getAt(#txtColor))) end if if stringp(tElem.getAt(#txtBgColor)) then tElem.setAt(#txtBgColor, rgb(tElem.getAt(#txtBgColor))) end if if voidp(tElem.getAt(#color)) then tElem.setAt(#color, "#000000") end if if voidp(tElem.getAt(#bgColor)) then tElem.setAt(#bgColor, "#FFFFFF") end if tElem.setAt(#color, rgb(tElem.getAt(#color))) tElem.setAt(#bgColor, rgb(tElem.getAt(#bgColor))) tPalette = tElem.getAt(#palette) if stringp(tPalette) then if not tResMngr.exists(tPalette && "Duplicate") then tPalMemNum = tResMngr.getmemnum(tPalette) if tPalMemNum > 0 then member(tPalMemNum).duplicate(tResMngr.createMember(tPalette && "Duplicate", #palette)) else tResMngr.createMember(tPalette && "Duplicate", #palette) error(me, "Palette member missing:" && tPalette, #parse_window, #minor) end if end if tElem.setAt(#palette, tPalette && "Duplicate") end if if (tElem.getAt(#type) = "text") then tFontStruct = getStructVariable("struct.font.plain") if voidp(tElem.getAt(#wordWrap)) then tElem.setAt(#wordWrap, 1) end if if voidp(tElem.getAt(#alignment)) then tElem.setAt(#alignment, #left) end if if voidp(tElem.getAt(#font)) then tElem.setAt(#font, tFontStruct.getaProp(#font)) end if if voidp(tElem.getAt(#fontSize)) then tElem.setAt(#fontSize, tFontStruct.getaProp(#fontSize)) end if if voidp(tElem.getAt(#fontStyle)) then tElem.setAt(#fontStyle, tFontStruct.getaProp(#fontStyle)) end if if voidp(tElem.getAt(#txtColor)) then tElem.setAt(#txtColor, tFontStruct.getaProp(#color)) end if if voidp(tElem.getAt(#txtBgColor)) then tElem.setAt(#txtBgColor, rgb(255, 255, 255)) end if if voidp(tElem.getAt(#fixedLineSpace)) then tElem.setAt(#fixedLineSpace, tElem.getAt(#fontSize)) end if end if if not voidp(tElem.getAt(#strech)) then tElem.setAt(#scaleH, #fixed) tElem.setAt(#scaleV, #fixed) if (tLayDefinition.getAt(#elements) = #moveH) then tElem.setAt(#scaleH, #move) else if (tLayDefinition.getAt(#elements) = #moveV) then tElem.setAt(#scaleV, #move) else if (tLayDefinition.getAt(#elements) = #strechH) then tElem.setAt(#scaleH, #scale) else if (tLayDefinition.getAt(#elements) = #strechV) then tElem.setAt(#scaleV, #scale) else if (tLayDefinition.getAt(#elements) = #centerH) then tElem.setAt(#scaleH, #center) else if (tLayDefinition.getAt(#elements) = #centerV) then tElem.setAt(#scaleV, #center) else if (tLayDefinition.getAt(#elements) = #moveHV) then tElem.setAt(#scaleH, #move) tElem.setAt(#scaleV, #move) else if (tLayDefinition.getAt(#elements) = #strechHV) then tElem.setAt(#scaleH, #scale) tElem.setAt(#scaleV, #scale) else if (tLayDefinition.getAt(#elements) = #centerHV) then tElem.setAt(#scaleH, #center) tElem.setAt(#scaleV, #center) else if (tLayDefinition.getAt(#elements) = #moveHstrechV) then tElem.setAt(#scaleH, #move) tElem.setAt(#scaleV, #scale) else if (tLayDefinition.getAt(#elements) = #moveVstrechH) then tElem.setAt(#scaleH, #scale) tElem.setAt(#scaleV, #move) else if (tLayDefinition.getAt(#elements) = #moveHcenterV) then tElem.setAt(#scaleH, #move) tElem.setAt(#scaleV, #center) else if (tLayDefinition.getAt(#elements) = #moveVcenterH) then tElem.setAt(#scaleH, #center) tElem.setAt(#scaleV, #move) end if end if end if end if end if end if end if end if end if end if end if end if end if tElem.deleteProp(#strech) end if end repeat if (tLayDefinition.getAt(#rect).count = 0) then tRect = rect(10000, 10000, -10000, -10000) repeat while tLayDefinition.getAt(#elements) <= undefined tElement = getAt(undefined, tFieldName) repeat while tLayDefinition.getAt(#elements) <= undefined tItem = getAt(undefined, tFieldName) if tItem.locH < tRect.getAt(1) then tRect.setAt(1, tItem.locH) end if if tItem.locV < tRect.getAt(2) then tRect.setAt(2, tItem.locV) end if if (tItem.locH + tItem.width) > tRect.getAt(3) then tRect.setAt(3, (tItem.locH + tItem.width)) end if if (tItem.locV + tItem.height) > tRect.getAt(4) then tRect.setAt(4, (tItem.locV + tItem.height)) end if end repeat end repeat tLayDefinition.getAt(#rect).add(tRect) repeat while tLayDefinition.getAt(#elements) <= undefined tElement = getAt(undefined, tFieldName) repeat while tLayDefinition.getAt(#elements) <= undefined tItem = getAt(undefined, tFieldName) tItem.locH = (tItem.locH - tRect.getAt(1)) tItem.locV = (tItem.locV - tRect.getAt(2)) end repeat end repeat else tList = tLayDefinition.getAt(#rect).getAt(1) tLayDefinition.getAt(#rect).setAt(1, rect(tList.getAt(1), tList.getAt(2), tList.getAt(3), tList.getAt(4))) end if tOffX = tLayDefinition.getAt(#rect).getAt(1).getAt(1) tOffY = tLayDefinition.getAt(#rect).getAt(1).getAt(2) tLayDefinition.getAt(#rect).setAt(1, (tLayDefinition.getAt(#rect).getAt(1) - [tOffX, tOffY, tOffX, tOffY])) if (tLayDefinition.getAt(#border).count = 0) then if tLayDefinition.getAt(#clientrect).count > 0 then tClientRect = tLayDefinition.getAt(#clientrect).getAt(1) tWinWidth = tLayDefinition.getAt(#rect).getAt(1).getAt(3) tWinHeight = tLayDefinition.getAt(#rect).getAt(1).getAt(4) tBorder = [tClientRect.getAt(1), tClientRect.getAt(2), (tWinWidth - tClientRect.getAt(3)), (tWinHeight - tClientRect.getAt(4))] tLayDefinition.getAt(#border).add(tBorder) else tLayDefinition.getAt(#border).add([0, 0, 0, 0]) end if end if tLayDefinition.setAt(#elements, tElements) if not pDontProfile then finishProfilingTask("Layout Parser::parse_window") end if return(tLayDefinition) end on parse_element me, tFieldName if not pDontProfile then startProfilingTask("Layout Parser::parse_element") end if tProps = [:] tdata = member(getResourceManager().getmemnum(tFieldName)).text f = 1 repeat while f <= tdata.count(#line) tLine = tdata.getProp(#line, f) if tLine.getProp(#char, 1) <> "#" then if length(tLine) > 1 then tValue = value(tLine) tProps.addProp(tValue.getAt(#state), tValue) end if end if f = (1 + f) end repeat if not pDontProfile then finishProfilingTask("Layout Parser::parse_element") end if return(tProps) end on parse_visual me, tFieldName if not pDontProfile then startProfilingTask("Layout Parser::parse_visual") end if tdata = member(getResourceManager().getmemnum(tFieldName)).text tSupportedTags = [#roomdata:[#open:"", #close:""], #rect:[#open:"", #close:""], #version:[#open:"", #close:""], #elements:[#open:"", #close:""]] tLayDefinition = [:] tOpenTagFlag = 0 tTag = "" x = 1 repeat while x <= tSupportedTags.count tOpen = tSupportedTags.getAt(x).open tClose = tSupportedTags.getAt(x).close tTag = tSupportedTags.getPropAt(x) tList = [] i = 1 repeat while i <= tdata.count(#line) if (tdata.getPropRef(#line, i).getProp(#word, 1) = tOpen) then i = (i + 1) repeat while i <= tdata.count(#line) if (tdata.getPropRef(#line, i).getProp(#word, 1) = tClose) then else if not voidp(value(tdata.getProp(#line, i))) then tList.add(value(tdata.getProp(#line, i))) end if i = (1 + i) end if end repeat end if i = (1 + i) end repeat if tList.count > 0 then tLayDefinition.setAt(tTag, tList) end if x = (1 + x) end repeat if voidp(tLayDefinition.getAt(#version)) then error(me, "Old visualizer definition:" && tFieldName, #parse_room, #minor) repeat while tLayDefinition.getAt(#elements) <= undefined tElem = getAt(undefined, tFieldName) if (tElem.getAt(#media) = #field) or (tElem.getAt(#media) = #text) then tElem.setAt(#txtColor, tElem.getAt(#color)) tElem.setAt(#txtBgColor, tElem.getAt(#bgColor)) tElem.setAt(#color, "#000000") tElem.setAt(#bgColor, "#FFFFFF") end if tElem.deleteProp(#foreColor) tElem.deleteProp(#backColor) end repeat end if repeat while tLayDefinition.getAt(#elements) <= undefined tElem = getAt(undefined, tFieldName) if voidp(tElem.getAt(#color)) then tElem.setAt(#color, "#000000") end if if voidp(tElem.getAt(#bgColor)) then tElem.setAt(#bgColor, "#FFFFFF") end if if (tElem.getAt(#type) = "button") then tElem.setAt(#Active, 1) end if end repeat if not pDontProfile then finishProfilingTask("Layout Parser::parse_visual") end if return([#name:tLayDefinition.getAt(#name), #roomdata:tLayDefinition.getAt(#roomdata), #rect:tLayDefinition.getAt(#rect), #elements:tLayDefinition.getAt(#elements)]) end on handlers return([]) end