Пример #1
0
        static private Color ParseContextColor(string trimmedColor, IFormatProvider formatProvider, ITypeDescriptorContext context)
        {
            if (!trimmedColor.StartsWith(s_ContextColor, StringComparison.OrdinalIgnoreCase))
            {
                throw new FormatException(SR.Get(SRID.Parsers_IllegalToken));
            }

            string tokens = trimmedColor.Substring(s_ContextColor.Length);

            tokens = tokens.Trim();
            string[] preSplit = tokens.Split(new Char[] { ' ' });
            if (preSplit.GetLength(0) < 2)
            {
                throw new FormatException(SR.Get(SRID.Parsers_IllegalToken));
            }

            tokens = tokens.Substring(preSplit[0].Length);

            TokenizerHelper th = new TokenizerHelper(tokens, formatProvider);

            string[] split     = tokens.Split(new Char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
            int      numTokens = split.GetLength(0);

            float alpha = Convert.ToSingle(th.NextTokenRequired(), formatProvider);

            float[] values = new float[numTokens - 1];

            for (int i = 0; i < numTokens - 1; i++)
            {
                values[i] = Convert.ToSingle(th.NextTokenRequired(), formatProvider);
            }

            string profileString = preSplit[0];

            UriHolder uriHolder = TypeConverterHelper.GetUriFromUriContext(context, profileString);

            Uri profileUri;

            if (uriHolder.BaseUri != null)
            {
                profileUri = new Uri(uriHolder.BaseUri, uriHolder.OriginalUri);
            }
            else
            {
                profileUri = uriHolder.OriginalUri;
            }

            Color result = Color.FromAValues(alpha, values, profileUri);

            // If the number of color values found does not match the number of channels in the profile, we must throw
            if (result.ColorContext.NumChannels != values.Length)
            {
                throw new FormatException(SR.Get(SRID.Parsers_IllegalToken));
            }

            return(result);
        }
        /// <summary>
        /// TypeConverter method implementation.
        /// </summary>
        /// <param name="context">ITypeDescriptorContext</param>
        /// <param name="culture">current culture (see CLR specs)</param>
        /// <param name="value">value to convert from</param>
        /// <returns>value that is result of conversion</returns>
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value is string)
            {
                string text = ((string)value).Trim();

                if (text != String.Empty)
                {
                    if (text.LastIndexOf('.') == -1)
                    {
                        CursorType ct = (CursorType)Enum.Parse(typeof(CursorType), text);

                        switch (ct)
                        {
                        case CursorType.Arrow:
                            return(Cursors.Arrow);

                        case CursorType.AppStarting:
                            return(Cursors.AppStarting);

                        case CursorType.Cross:
                            return(Cursors.Cross);

                        case CursorType.Help:
                            return(Cursors.Help);

                        case CursorType.IBeam:
                            return(Cursors.IBeam);

                        case CursorType.SizeAll:
                            return(Cursors.SizeAll);

                        case CursorType.SizeNESW:
                            return(Cursors.SizeNESW);

                        case CursorType.SizeNS:
                            return(Cursors.SizeNS);

                        case CursorType.SizeNWSE:
                            return(Cursors.SizeNWSE);

                        case CursorType.SizeWE:
                            return(Cursors.SizeWE);

                        case CursorType.UpArrow:
                            return(Cursors.UpArrow);

                        case CursorType.Wait:
                            return(Cursors.Wait);

                        case CursorType.Hand:
                            return(Cursors.Hand);

                        case CursorType.No:
                            return(Cursors.No);

                        case CursorType.None:
                            return(Cursors.None);

                        case CursorType.Pen:
                            return(Cursors.Pen);

                        case CursorType.ScrollNS:
                            return(Cursors.ScrollNS);

                        case CursorType.ScrollWE:
                            return(Cursors.ScrollWE);

                        case CursorType.ScrollAll:
                            return(Cursors.ScrollAll);

                        case CursorType.ScrollN:
                            return(Cursors.ScrollN);

                        case CursorType.ScrollS:
                            return(Cursors.ScrollS);

                        case CursorType.ScrollW:
                            return(Cursors.ScrollW);

                        case CursorType.ScrollE:
                            return(Cursors.ScrollE);

                        case CursorType.ScrollNW:
                            return(Cursors.ScrollNW);

                        case CursorType.ScrollNE:
                            return(Cursors.ScrollNE);

                        case CursorType.ScrollSW:
                            return(Cursors.ScrollSW);

                        case CursorType.ScrollSE:
                            return(Cursors.ScrollSE);

                        case CursorType.ArrowCD:
                            return(Cursors.ArrowCD);
                        }
                    }
                    else
                    {
                        if (text.EndsWith(".cur", StringComparison.OrdinalIgnoreCase) || text.EndsWith(".ani", StringComparison.OrdinalIgnoreCase))
                        {
                            UriHolder uriHolder = TypeConverterHelper.GetUriFromUriContext(context, text);
                            Uri       finalUri  = BindUriHelper.GetResolvedUri(uriHolder.BaseUri, uriHolder.OriginalUri);

                            if (finalUri.IsAbsoluteUri && finalUri.IsFile)
                            {
                                return(new Cursor(finalUri.LocalPath));
                            }
                            else
                            {
                                System.Net.WebRequest request = WpfWebRequestHelper.CreateRequest(finalUri);
                                WpfWebRequestHelper.ConfigCachePolicy(request, false);
                                return(new Cursor(WpfWebRequestHelper.GetResponseStream(request)));
                            }
                        }
                    }
                }
                else
                {
                    // An empty string means no cursor.
                    return(null);
                }
            }

            throw GetConvertFromException(value);
        }