text: """
  A Styles is a collection of PropertySets that can be applied to a particular RTF element.
  
  At present there are only two, Text and Paragraph but ListStyles will be added soon too.
  
  
  """
  
  from .PropertySets import *
  
  class TextStyle :
      def __init__( self, text_props, name=None, shading_props=None ) :
          self.SetTextPropertySet   ( text_props    )
          self.SetName              ( name          )
          self.SetShadingPropertySet( shading_props )
  
      def Copy( self ) :
          return deepcopy( self )
  
      def SetName( self, value ) :
          self.Name = value
          return self
  
      def SetTextPropertySet( self, value ) :
          assert isinstance( value, TextPropertySet )
          self.TextPropertySet = value
          return self
  
      def SetShadingPropertySet( self, value ) :
          assert value is None or isinstance( value, ShadingPropertySet )
          self.ShadingPropertySet = value or ShadingPropertySet()
          return self
  
  class ParagraphStyle :
      def __init__( self, name, text_style, paragraph_props=None, frame_props=None, shading_props=None ) :
  
          #   A style must have Font and a Font Size but the Text property set doesn't
          #   make these mandatory so that they can be used for overrides so at this point
          #   we need to make sure that that we have these values set
          if not text_style.TextPropertySet.Font : raise Exception( 'Paragraph Styles must have a Font specified.'      )
          if not text_style.TextPropertySet.Size : raise Exception( 'Paragraph Styles must have a Font Size specified.' )
  
          self.SetName                ( name            )
          self.SetTextStyle           ( text_style      )
          self.SetParagraphPropertySet( paragraph_props )
          self.SetFramePropertySet    ( frame_props     )
          self.SetShadingPropertySet  ( shading_props   )
  
          self.SetBasedOn( None )
          self.SetNext   ( None )
  
      def Copy( self ) :
          return deepcopy( self )
  
      def SetName( self, value ) :
          self.Name = value
          return self
  
      def SetTextStyle( self, value ) :
          assert isinstance( value, TextStyle )
          self.TextStyle = value
          return self
  
      def SetParagraphPropertySet( self, value ) :
          assert value is None or isinstance( value, ParagraphPropertySet )
          self.ParagraphPropertySet = value or ParagraphPropertySet()
          return self
  
      def SetFramePropertySet( self, value ) :
          assert value is None or isinstance( value, FramePropertySet )
          self.FramePropertySet = value or FramePropertySet()
          return self
  
      def SetShadingPropertySet( self, value ) :
          """Set the background shading for the paragraph."""
  
          assert value is None or isinstance( value, ShadingPropertySet )
          self.ShadingPropertySet = value or ShadingPropertySet()
          return self
  
      def SetBasedOn( self, value ) :
          """Set the Paragraph Style that this one is based on."""
  
          assert not value or isinstance( value, ParagraphStyle )
          self.BasedOn = value
          return self
  
      def SetNext( self, value ) :
          """Set the Paragraph Style that should follow this one."""
  
          assert not value or isinstance( value, ParagraphStyle )
          self.Next    = value
          return self
  
  