from Translator import *
import SelectorList
import Object, pdb

class SSSStyleRule(Object.SSSObject):

    def __init__(self, rule = ''):
        
        super(SSSStyleRule, self).__init__()

        self._selectors = SelectorList.SSSSelectorList('', self)
        
        if rule: self._parse(rule)

    def _parse(self, text):

        text =  trim(text)
        matches = preg_match(r'^([^\{]*)\{([\w|\W]*)\}$', text)
        
        if (matches):

            self._selectors = SelectorList.SSSSelectorList(matches[0][0], self)
            
            super(SSSStyleRule, self)._parse(matches[0][1])

    def get_computedSelector(self):

        return self._selectors.selectorArrayToString(self.get_computedSelectorAsArray())
        
    selectorText = property(get_computedSelector)

    def get_computedSelectorAsArray(self):

        if get_class(self.parentObject) == 'SSSStyleRule':
            
            computedSelector = []
            
            parentSelectorList = SelectorList.SSSSelectorList( self.parentObject.selectorText, self)
            
            for parentSelector in parentSelectorList.selectors:
                
                for selector in self.selectorList.selectors:
            
                    computedSelector.append( parentSelector + ' ' + trim( selector ) )

            return computedSelector
            
        else:
            return self._selectors.selectors

        

    def prependToAllSelectors(self, args):
        return self._selectors.prependToAllSelectors(args)

    def set_cssText(self, value):
        return self._parse(value)

    def get_cssText(self):
        return self.__str__()
    cssText = property(get_cssText, set_cssText)

    def get_type(self):
        return SSSObject.STYLE_RULE
    type = property(get_type)

    def get_style(self):
        return self.declaration.cssText
    style = property(get_style)

    def get_styleDeclaration(self):
        return self.declaration
    styleDeclaration = property(get_styleDeclaration)

    def get_selectorText(self):
        return self._selectors.selectorText

    def get_selectorList(self):
        return self._selectors
    selectorList = property(get_selectorList)
        
    def __str__(self):
        
        #// output current rule...
        string = preg_replace(r'\, ', ",\n", self.selectorText) + " {\n"
        #string = self.selectorText + " {\n"
		
        string += self.getCssTextFromArray(self.getNonStyleRulesAsArray())

        string += "}\n\n"

        string += self.getCssTextFromArray(self.getStyleRulesAsArray())
        
        return string


    def appendSelector(self, selector):

        return self._selectors.appendSelector(selector)

    
    def addInheritRule(self, cssText):
        
        import InheritRule

        inherit_rule = InheritRule.SSSInheritRule()

        self.addDeclaration(inherit_rule)

        inherit_rule.cssText = cssText
                
        if (self.hostStyleSheet):

            for i in xrange(inherit_rule.selectorList.length):

                 inherit_rule_selector = inherit_rule.selectorList.item(i)

                 superclass_rules = self.hostStyleSheet.getRulesWithSelector(inherit_rule_selector)

                 for superclass_rule in superclass_rules:

                     num_selectors = superclass_rule.selectorList.length

                     for j in xrange(num_selectors):

                         superclass_rule_selector = superclass_rule.selectorList.item(j)

                         self_rule_selectors = self.get_computedSelectorAsArray()

                         for k in xrange(len(self_rule_selectors)):

                             self_rule_selector = self_rule_selectors[k]

                             if (preg_match(' ' + inherit_rule_selector + ' ', ' ' + superclass_rule_selector + ' ')):

                                 additional_selector = preg_replace(' ' + inherit_rule_selector + ' ', ' ' + self_rule_selector + ' ', ' ' + superclass_rule_selector + ' ')

                                 superclass_rule.appendSelector(additional_selector)


        return inherit_rule
