# $Filename$ 
# $Authors$
# Last Changed: $Date$ $Committer$ $Revision-Id$
# Copyright (c) 2003-2011, German Aerospace Center (DLR)
# All rights reserved.
#Redistribution and use in source and binary forms, with or without
#
#modification, are permitted provided that the following conditions are
#
#met:
#
#
# * Redistributions of source code must retain the above copyright 
#   notice, this list of conditions and the following disclaimer. 
#
# * Redistributions in binary form must reproduce the above copyright 
#   notice, this list of conditions and the following disclaimer in the 
#   documentation and/or other materials provided with the 
#   distribution. 
#
# * Neither the name of the German Aerospace Center nor the names of
#   its contributors may be used to endorse or promote products derived
#   from this software without specific prior written permission.
#
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
#LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
#A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
#OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
#SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
#LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
#DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
#THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
#OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  


"""
This class draws a relation icon.
"""


from datafinder.gui.admin.datamodel_iconview.prototype_icon import PrototypeIcon
from datafinder.gui.admin.datamodel_iconview.partial_relation_icon import PartialRelationIcon


__version__ = "$Revision-Id:$" 


class RelationIcon(PrototypeIcon):
    """
    Relation icon to be shown on a QCanvasView.
    """

    def __init__(self, relationType, icnPxmp, icnLbl, icnCnvs):
        PrototypeIcon.__init__(self, icnPxmp, icnLbl, icnCnvs)

        self.parentOf = []
        self.childOf = []
        self.partialRelations = []
        self.relationType = relationType
        self.iconLabel = relationType.name
        self.updateLists()
        self.initPartialRelations()
        self.iconType = 2

    def initPartialRelations(self):
        """
        Creates partial relations depending on the icons RelationType form.
        """

        for eachItem in self.canvas().allItems():
            if eachItem.iconType == 1:
                if eachItem.iconLabel in self.parentOf:
                    newPartialRelation = PartialRelationIcon(self.canvas(), self, eachItem, 0)
                    self.partialRelations.append(newPartialRelation)
                    newPartialRelation.setZ(0)
                    newPartialRelation.show()
                if eachItem.iconLabel in self.childOf:
                    newPartialRelation = PartialRelationIcon(self.canvas(), self, eachItem, 1)
                    self.partialRelations.append(newPartialRelation)
                    newPartialRelation.setZ(0)
                    newPartialRelation.show()

        self.updatePartialRelations()

    def reinitialize(self):
        """
        Deletes all partial relations, updates the list of childs and parents
        and reinitializes the partial relations,
        also updates the icons label.
        """

        self.updateLists()
        iconLabel = self.relationType.name
        self.setIconLabel(iconLabel)

        for eachItem in self.partialRelations:
            eachItem.destroyIcon()
            del eachItem

        self.partialRelations = []
        self.initPartialRelations()

    def updateLists(self):
        """
        To update the relations parent and child list depending
        on data in the icons RelationType Form.
        """

        self.parentOf = self.relationType.sourceDataTypeNames
        self.childOf = self.relationType.targetDataTypeNames
