/// <summary>
        /// Creates the appropriate OpenGLDrawingProvider from a file string
        /// </summary>
        /// <param name="providerFileString">The file string to parse</param>
        /// <returns>The OpenGLDrawingProvider</returns>
        public static IOpenGLDrawingProvider InstantiateFromString(string providerFileString)
        {
            //The elements in the provider file-strings are separated by semicolons
            string[] providerElements = providerFileString.Split(';');
            if (providerElements.Length < 1)
            {
                throw new ApplicationException("String does not represent an OpenGLDrawingProvider");
            }
            else if (providerElements.Length == 1)
            {
                //this may be an empty provider!
                if (providerElements[0] == "?")
                {
                    return(null);
                }
                else
                {
                    throw new ApplicationException("String does not represent an OpenGLDrawingProvider");
                }
            }
            //Check which provider we are dealing with, instantiate it and let it populate itself
            IOpenGLDrawingProvider retval;

            switch (providerElements[0])
            {
            case "OneColor":
                retval = new OneColorProvider();
                retval.FromFileString(providerFileString);
                return(retval);

            case "FourSquare":
                retval = new FourSquareProvider();
                retval.FromFileString(providerFileString);
                return(retval);

            case "Circle":
                retval = new CircleProvider();
                retval.FromFileString(providerFileString);
                return(retval);

            case "LinGrad":
                retval = new LinGradientProvider();
                retval.FromFileString(providerFileString);
                return(retval);

            default:
                throw new ApplicationException("Could not recognize drawing provider");
            }
        }
 /// <summary>
 /// Allows to copy arbitrary (but known to the factory) OpenGL drawing providers
 /// Effectively implements generic copy constructor
 /// </summary>
 /// <param name="toCopy">The drawing provider we want to copy</param>
 /// <returns>A new drawing provider with the same values as the current provider</returns>
 public static IOpenGLDrawingProvider Copy(IOpenGLDrawingProvider toCopy)
 {
     if (toCopy == null)
     {
         return(null);
     }
     else if (toCopy is OneColorProvider)
     {
         OneColorProvider tc     = toCopy as OneColorProvider;
         OneColorProvider retval = new OneColorProvider(tc.Color);
         retval.AlignmentRotationZ    = tc.AlignmentRotationZ;
         retval.AlignmentTranslationX = tc.AlignmentTranslationX;
         retval.AlignmentTranslationY = tc.AlignmentTranslationY;
         retval.ImageRotationZ        = tc.ImageRotationZ;
         retval.ImageTranslationX     = tc.ImageTranslationX;
         retval.ImageTranslationY     = tc.ImageTranslationY;
         return(retval);
     }
     else if (toCopy is FourSquareProvider)
     {
         FourSquareProvider tc     = toCopy as FourSquareProvider;
         FourSquareProvider retval = new FourSquareProvider(tc.ColorSquare1, tc.ColorSquare2, tc.ColorSquare3, tc.ColorSquare4);
         retval.AlignmentRotationZ    = tc.AlignmentRotationZ;
         retval.AlignmentTranslationX = tc.AlignmentTranslationX;
         retval.AlignmentTranslationY = tc.AlignmentTranslationY;
         retval.ImageRotationZ        = tc.ImageRotationZ;
         retval.ImageTranslationX     = tc.ImageTranslationX;
         retval.ImageTranslationY     = tc.ImageTranslationY;
         return(retval);
     }
     else if (toCopy is CircleProvider)
     {
         CircleProvider tc     = toCopy as CircleProvider;
         CircleProvider retval = new CircleProvider(tc.Color, tc.Center, tc.Radius, tc.SegmentCount);
         retval.AlignmentRotationZ    = tc.AlignmentRotationZ;
         retval.AlignmentTranslationX = tc.AlignmentTranslationX;
         retval.AlignmentTranslationY = tc.AlignmentTranslationY;
         retval.ImageRotationZ        = tc.ImageRotationZ;
         retval.ImageTranslationX     = tc.ImageTranslationX;
         retval.ImageTranslationY     = tc.ImageTranslationY;
         return(retval);
     }
     else if (toCopy is LinGradientProvider)
     {
         LinGradientProvider tc     = toCopy as LinGradientProvider;
         LinGradientProvider retval = new LinGradientProvider(tc.Topleft, tc.Width, tc.Height, tc.ColStart, tc.ColEnd);
         retval.AlignmentRotationZ    = tc.AlignmentRotationZ;
         retval.AlignmentTranslationX = tc.AlignmentTranslationX;
         retval.AlignmentTranslationY = tc.AlignmentTranslationY;
         retval.ImageRotationZ        = tc.ImageRotationZ;
         retval.ImageTranslationX     = tc.ImageTranslationX;
         retval.ImageTranslationY     = tc.ImageTranslationY;
         return(retval);
     }
     else
     {
         //we should never end up here
         System.Diagnostics.Debug.Assert(false, "Tried to copy unkown provider");
         return(null);
     }
 }