using System;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.ComponentModel.Design;
using System.Windows.Forms;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Shell;

namespace Npgsql.Provider
{
    /// <summary>
    /// This is the class that implements the package exposed by this assembly.
    ///
    /// The minimum requirement for a class to be considered a valid package for Visual Studio
    /// is to implement the IVsPackage interface and register itself with the shell.
    /// This package uses the helper classes defined inside the Managed Package Framework (MPF)
    /// to do it: it derives from the Package class that provides the implementation of the 
    /// IVsPackage interface and uses the registration attributes defined in the framework to 
    /// register itself and its components with the shell.
    /// </summary>
    // This attribute tells the PkgDef creation utility (CreatePkgDef.exe) that this class is
    // a package.
    [PackageRegistration( UseManagedResourcesOnly = true )]
    // This attribute is used to register the informations needed to show the this package
    // in the Help/About dialog of Visual Studio.
    [InstalledProductRegistration( "#110", "#112", "1.0", IconResourceID = 400 )]
    // This attribute is needed to let the shell know that this package exposes some menus.
    [ProvideMenuResource( "Menus.ctmenu", 1 )]
    // This attribute registers a tool window exposed by this package.
    [ProvideToolWindow( typeof( MyToolWindow ) )]
    [ProvideEditorExtension( typeof( EditorFactory ), ".pgsql", 50,
              ProjectGuid = "{A2FE74E1-B743-11d0-AE1A-00A0C90FFFC3}",
              TemplateDir = "Templates",
              NameResourceID = 105,
              DefaultName = "Npgsql.Designer" )]
    [ProvideKeyBindingTable( GuidList.guidNpgsql_DesignerEditorFactoryString, 102 )]
    [ProvideEditorLogicalView( typeof( EditorFactory ), "{7651a703-06e5-11d1-8ebd-00a0c90f26ea}" )]
    [Guid( GuidList.guidNpgsql_DesignerPkgString )]
    public sealed class Npgsql_DesignerPackage : Package
    {
        /// <summary>
        /// Default constructor of the package.
        /// Inside this method you can place any initialization code that does not require 
        /// any Visual Studio service because at this point the package object is created but 
        /// not sited yet inside Visual Studio environment. The place to do all the other 
        /// initialization is the Initialize method.
        /// </summary>
        public Npgsql_DesignerPackage()
        {
            Trace.WriteLine( string.Format( CultureInfo.CurrentCulture, "Entering constructor for: {0}", this.ToString() ) );
        }

        private static Npgsql_DesignerPackage _instance;

        public static Npgsql_DesignerPackage Instance
        {
            get { return _instance; }
        }

        /// <summary>
        /// This function is called when the user clicks the menu item that shows the 
        /// tool window. See the Initialize method to see how the menu item is associated to 
        /// this function using the OleMenuCommandService service and the MenuCommand class.
        /// </summary>
        private void ShowToolWindow( object sender, EventArgs e )
        {
            // Get the instance number 0 of this tool window. This window is single instance so this instance
            // is actually the only one.
            // The last flag is set to true so that if the tool window does not exists it will be created.
            ToolWindowPane window = this.FindToolWindow( typeof( MyToolWindow ), 0, true );
            if ( ( null == window ) || ( null == window.Frame ) )
            {
                throw new NotSupportedException( Properties.Resources.CanNotCreateWindow );
            }
            IVsWindowFrame windowFrame = ( IVsWindowFrame ) window.Frame;
            Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure( windowFrame.Show() );
        }


        /////////////////////////////////////////////////////////////////////////////
        // Overriden Package Implementation
        #region Package Members

        /// <summary>
        /// Initialization of the package; this method is called right after the package is sited, so this is the place
        /// where you can put all the initilaization code that rely on services provided by VisualStudio.
        /// </summary>
        protected override void Initialize()
        {
            Trace.WriteLine( string.Format( CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString() ) );
            base.Initialize();
            _instance = this;
            MessageBox.Show( "Entró" );
            //Create Editor Factory. Note that the base Package class will call Dispose on it.)
            base.RegisterEditorFactory( new EditorFactory( this ) );

            // Add our command handlers for menu (commands must exist in the .vsct file)
            OleMenuCommandService mcs = GetService( typeof( IMenuCommandService ) ) as OleMenuCommandService;
            if ( null != mcs )
            {
                // Create the command for the tool window
                CommandID toolwndCommandID = new CommandID( GuidList.guidNpgsql_DesignerCmdSet, ( int ) PkgCmdIDList.cmdidTableDesigner );
                MenuCommand menuToolWin = new MenuCommand( ShowToolWindow, toolwndCommandID );
                mcs.AddCommand( menuToolWin );
            }
        }
        #endregion

    }
}
