# importing libraries:
import maya.cmds as cmds
import maya.mel as mel

# global variables to this module:    
CLASS_NAME = "SelectAllControls"
TITLE = "m166_selAllControls"
DESCRIPTION = "m167_selAllControlsDesc"
ICON = "/Icons/dp_selAllControls.png"


class SelectAllControls():
    def __init__(self, dpUIinst, langDic, langName, *args):
        # redeclaring variables
        self.dpUIinst = dpUIinst
        self.langDic = langDic
        self.langName = langName
        self.allGrp = "All_Grp"
        self.masterAttr = "masterGrp"
        self.ctrlsAttr = "controlList"
        # call main function
        self.dpMain(self)
    
    
    def dpMain(self, *args):
        """ Main function.
            Check existen nodes and call the scripted function.
        """
        callAction = False
        self.allGrp = self.dpFindAllGrpBySelection()
        if self.allGrp:
            callAction = True
        else:
            allGrpList = self.dpCountAllGrp()
            if allGrpList:
                if len(allGrpList) > 1:
                    self.allGrp = cmds.confirmDialog(title=self.langDic[self.langName]["m166_selAllControls"], message=self.langDic[self.langName]["m168_wichAllGrp"], button=allGrpList)
                else:
                    self.allGrp = self.dpCheckAllGrp(self.allGrp)
                if self.allGrp:
                    callAction = True
                else:
                    self.allGrp = self.dpFindAllGrp()
                    if self.allGrp:
                        callAction = True
        if callAction:
            self.dpSelectAllCtrls(self.allGrp)
        else:
            mel.eval("warning \""+self.langDic[self.langName]["e019_notFoundAllGrp"]+"\";")
    
    
    def dpCountAllGrp(self, *args):
        """ Count the number of active All_Grp and return them in a list.
        """
        allGrpNodeList = []
        allNodeList = cmds.ls(selection=False, type="transform")
        for nodeName in allNodeList:
            allGrp = self.dpCheckAllGrp(nodeName)
            if allGrp:
                allGrpNodeList.append(allGrp)
        return allGrpNodeList
    
    
    def dpSelectAllCtrls(self, allGrpNode, *args):
        """ Select all controls using All_Grp.
        """
        ctrlsToSelectList = []
        if cmds.objExists(allGrpNode+"."+self.ctrlsAttr):
            ctrlsAttr = cmds.getAttr(allGrpNode+"."+self.ctrlsAttr)
            if ctrlsAttr:
                currentNamespace = ""
                if ":" in allGrpNode:
                    currentNamespace = allGrpNode[:allGrpNode.find(":")]
                ctrlsList = ctrlsAttr.split(";")
                if ctrlsList:
                    for ctrlName in ctrlsList:
                        if ctrlName:
                            if currentNamespace:
                                ctrlsToSelectList.append(currentNamespace+":"+ctrlName)
                            else:
                                ctrlsToSelectList.append(ctrlName)
                    cmds.select(ctrlsToSelectList)
                    print self.langDic[self.langName]["m169_selectedCtrls"]+str(ctrlsToSelectList)
            else:
                mel.eval("warning \""+self.langDic[self.langName]["e019_notFoundAllGrp"]+"\";")
    
    
    def dpFindAllGrpBySelection(self, *args):
        """ Try to find All_Grp by selected hierarchy.
        """
        selList = cmds.ls(selection=True)
        if selList:
            for item in selList:
                if self.dpCheckAllGrp(item):
                    return item
            for item in selList:
                relativeList = cmds.listRelatives(item, allParents=True, type="transform")
                while relativeList:
                    if self.dpCheckAllGrp(relativeList[0]):
                        return relativeList[0]
                    relativeList = cmds.listRelatives(relativeList[0], allParents=True, type="transform")
        return False
        
        
    def dpFindAllGrp(self, *args):
        """ Try to find All_Grp without selection searching for all nodes in the scene.
            Returns the first one found.
        """
        allNodeList = cmds.ls(selection=False)
        if allNodeList:
            for item in allNodeList:
                if self.dpCheckAllGrp(item):
                    return item
        return False
        
        
    def dpCheckAllGrp(self, nodeName, *args):
        """ Verify if this given node is a masterGrp in order to return True.
        """
        if cmds.objExists(nodeName):
            if cmds.objExists(nodeName+"."+self.masterAttr):
                if cmds.getAttr(nodeName+"."+self.masterAttr) == 1:
                    return nodeName
        return False