#region License

/*
 * Copyright 2002-2006 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#endregion

#region Imports

using System;
using System.Drawing;
using System.Globalization;
using System.Windows.Forms;

using Spring.Context;
using Spring.Context.Support;

#endregion

namespace Spring.IocQuickStart.AppContext
{
    /// <summary>
    /// Sample application showing use of IApplicationContext
    /// </summary>
    internal class MainApp
    {
        private static ResourcesDisplayForm form;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        private static void Main()
        {
            try
            {
                IApplicationContext ctx = ContextRegistry.GetContext();                   
                form = new ResourcesDisplayForm();

                DemoMessageLocalization(ctx);
                DemoImageResource(ctx);
                Application.Run(form);
            }
            catch (Exception e)
            {
                write(e.Message);
                write(e.StackTrace);
                if (e.InnerException != null)
                {
                    write(e.InnerException.Message);
                }
            }
        }

        /// <summary>
        /// Retrieve the image from the application context.
        /// </summary>
        /// <param name="ctx">An instance of the Spring application context</param>
        public static void DemoImageResource(IApplicationContext ctx)
        {
            Image image = ctx.GetResourceObject(Keys.BUBBLECHAMBER) as Image;
            write("------------");
            write("Loaded image");
            write("Width = " + image.Size.Width + ", Height = " + image.Size.Height);

            form.Image = image;
        }

        /// <summary>
        /// Retrieve various localized messages from the application context.
        /// </summary>
        /// <param name="ctx"></param>
        public static void DemoMessageLocalization(IApplicationContext ctx)
        {
            CultureInfo spanishCultureInfo = new CultureInfo("es");

            write("----------------------------------");
            write("Resolve message key 'HelloMessage'");
            write("----------------------------------");
            string msg = ctx.GetMessage(Keys.HELLO_MESSAGE,
                                        CultureInfo.CurrentCulture,
                                        "Mr.", "Anderson");

            write("Current culture resolved message = " + msg);

            string esMsg = ctx.GetMessage(Keys.HELLO_MESSAGE,
                                          spanishCultureInfo,
                                          "Mr.", "Anderson");
            write("Spanish culture resolved message = " + esMsg);


            write("--------------------------------------------------------------------------");
            write("Now using message argument that itself implements IMessageSourceResolvable");
            write("--------------------------------------------------------------------------");

            string[] codes = {Keys.FEMALE_GREETING};
            DefaultMessageSourceResolvable dmr = new DefaultMessageSourceResolvable(codes, null);

            msg = ctx.GetMessage(Keys.HELLO_MESSAGE,
                                 CultureInfo.CurrentCulture,
                                 dmr, "Anderson");
            write("Current culture resolved message = " + msg);

            esMsg = ctx.GetMessage(Keys.HELLO_MESSAGE,
                                   spanishCultureInfo,
                                   dmr, "Anderson");
            write("Spanish culture resolved message = " + esMsg);

            Person p = new Person();
            write("------------------------");
            write("Appling Person resources");
            write("------------------------");
            ctx.ApplyResources(p, "person", CultureInfo.CurrentUICulture);
            write(p.ToString());
        }

        public static void write(string text)
        {
            Console.WriteLine(text);
            form.AppendText(text + "\n");
        }
    }
}