from xml.dom import minidom
from xml.dom.minidom import Node
from PropertyModel import Property
from PropertyWidgets import WidgetContainer
import sys
class ComponentEvent:
""" serves as a call back object for methods of ComponentListener
interface"""
def __init__(self,type):
self.component = None
self.type = type
def getSource(self):
return self.component
def getEventType(self):
return self.type
class ComponentListener:
""" An abstract class acting as an interface to update the views about the
changes happening in ComponentModel. All classes wish to interface with
Component model must inherit this class and can implement their
own logic by overriding the methods of this class """
def componentStateChanged(self, cEvent):
pass
def componentHidden(self, cEvent):
pass
def componentShown(self, cEvent):
pass
class Component:
""" The Model class for Component objects. Encapsulates the
components' attributes and methods """
def __init__(self, parent, id, name, pos, spd_file, controller, visible = True):
self.id = id
self.parent = parent
self.name = str(name)
self.position = pos
self.spdFile = str(spd_file)
self.controller = controller
self.visible = visible
self.properties = []
self.buildProperties(controller)
def __str__(self):
return "Component: %s, pos: %d, parent: %s" % (self.name, self.position, self.parent.getName())
def getName(self):
return self.name
def getPosition(self):
return self.position
def setPosition(self, newPos):
self.position = newPos
def getPanel(self):
return self.panel
def setPanel(self, newPanel):
self.panel = newPanel
def setPosition(self, newPos):
self.position = newPos
def hide(self):
self.visible = False
def show(self):
self.visible = True
def isVisible(self):
return self.visible
def getParent(self):
return self.parent
def getAllProperties(self):
plist = self.properties[0:]
return plist
def findPropertyByName(self, name):
for prop in self.properties:
if prop.name == name:
return prop
def findPropertyByID(self, id):
for prp in self.properties:
if prp.id == id:
return prp
def updatePropertyState(self, pName, visible):
property = self.findPropertyByName(pName)
if property.isVisible() == visible:
return False
if visible:
property.show()
else:
property.hide()
return True
def queryProperties(self):
#This method queries the list of properties and their values of a component,
#update the values to the property objects in the model.
utilRef = self.controller.getUtilRef()
newPrpList = []
newPrpList = utilRef.query(self.parent.getName(), self.name, newPrpList)
#newPrpList is a lsit of corba objects of type
#ossie.cf.CF.DataType(id='DCE:a337c5f0-8245-11dc-860f-00123f63025f',
# value=CORBA.Any(CORBA.TC_short, 2502))
if newPrpList is None:
return
for newprp in newPrpList:
prpRef = self.findPropertyByID(newprp.id)
if (prpRef is not None):
if prpRef.corbaObj is None:
prpRef.corbaObj = newprp
else:
#print "setting old corbaObj to " + str(newprp.value._v)
prpRef.setValue(newprp.value._v)
# print newPrpList
return
def configureProperty(self, pName, newVal):
prpRef = self.findPropertyByName(pName)
#storing the old value in a temp varaible to revert the changes if configure() fails.
curVal = prpRef.getValue()
prpRef.setValue(newVal)
#configure() method expects the argument to be passed as a LIST object.
#hence convert the corbaObj to a list
prpList = [prpRef.corbaObj]
utilRef = self.controller.getUtilRef()
status = utilRef.configure(self.parent.getName(), self.name, prpList)
if status is False:
prpRef.setValue(curVal)
return status
def buildProperties(self, controller):
#Read the path of prf file from spd file of the component
spddom = controller.getDOM(self.spdFile)
prfnode = spddom.getElementsByTagName('propertyfile')[0]
# propertyfile tag is of type
#
# />
#
# Extracting the path of the prf file from childNodes[1], i.e. tag
# the file name may be written in unicode format. convert to string for internal use
prf_file = str(prfnode.childNodes[1].attributes['name'].value)
#Now parsing .prf file to build property model
prfdom = controller.getDOM(prf_file)
if prfdom is None:
print "buildProperties(): Failed to create DOM for PRF file for ", self.parent.getName(), "/", self.name
sys.exit(-1)
prpNode = prfdom.getElementsByTagName('properties')[0]
prpList = prpNode.childNodes
try:
for prp in prpList:
if ( prp.nodeType != Node.ELEMENT_NODE or str(prp.tagName) == 'description' ):
continue
#populate property fields and create the property object
id = prp.attributes['id'].value
name = prp.attributes['name'].value
type = (str(prp.tagName), str(prp.attributes['type'].value))
mode = prp.attributes['mode'].value
desc = ''
value = None
range = (0,10000)
actionType = ''
kindType = ''
#Iterate through children of tag to update desc, value and kindType
for child in prp.childNodes:
if (child.nodeType == Node.ELEMENT_NODE):
if (child.tagName == 'description'):
desc = child.firstChild.data
elif (child.tagName == 'value'):
value = child.firstChild.data
elif (child.tagName == 'kind'):
kindType = child.attributes['kindtype'].value
elif (child.tagName == 'range'):
min = child.childNodes[1].firstChild.data
max = child.childNodes[3].firstChild.data
range = (min, max)
elif (child.tagName == 'action'):
actionType = child.attributes['type'].value
widget = controller.getDefaultWidget(type)
newProp = Property(self, id, name, type, mode, desc, value,
range, kindType, actionType, widget, prf_file)
self.properties.append(newProp)
except:
print "Error in reading PRF files for ", self.parent.getName(), "/", self.name
errorMsg = sys.exc_info()
print errorMsg
sys.exit(-1)
def changePropWidget(self, property, newWidgetType):
prpRef = self.findPropertyByName(property)
curWidget = prpRef.getWidget()
if curWidget.type == newWidgetType:
return None
newWidget = self.controller.getWidgetByType(newWidgetType)
prpRef.widget = newWidget
return prpRef
def fireModelChange(self, event):
pass