using System;
using EnvDTE;
using Microsoft.VisualBasic;

namespace ToolboxSnippetsInstaller
{
	/// <summary>
	/// Summary description for ToolboxInstaller.
	/// </summary>
	public class ToolboxInstaller
	{
		public ToolboxInstaller()
		{
			//
			// TODO: Add constructor logic here
			//
		}
		
		/// <summary>
		/// Metoda ładuje dowolną liczbę fragmentów kodu do okienka narzędziowego
		/// </summary>
		public static void LoadSnippets()
		{
			// Zarejestrowanie filtra komunikatów OLE, by uniknąć wyjątków "call rejected"
			MessageFilter.Register();
			
			// Pobranie odwołania do obiektu DTE
			Type latestDTE = Type.GetTypeFromProgID("VisualStudio.DTE.7.1");
			EnvDTE.DTE env = Activator.CreateInstance(latestDTE) as EnvDTE.DTE;
			
			// Pobranie okna narzędziowego Toolbox
			Window win = env.Windows.Item(Constants.vsWindowKindToolbox);
			
			// Pobranie okna narzędziowego
			ToolBox toolBox = (ToolBox) win.Object;

			ToolBoxTab tab = null;
			
			// Przejście przez kolekcję zakładek i sprawdzenie, czy odpowiednia zakładka już istnieje
			foreach (ToolBoxTab tb in toolBox.ToolBoxTabs)
			{
				if (tb.Name == "Nasze kontrolki")
				{
					tab = tb;
				}
			}

			// Zakładka nie istnieje, więc trzeba ją dodać
			if(tab == null)
			{
				tab = toolBox.ToolBoxTabs.Add("Nasze kontrolki");
			}
			
			// Wyświetlenie okna właściwości, by ustrzec się błędów
			env.ExecuteCommand("View.PropertiesWindow","");		
			
			// Uaktywnienie zakładki (ponieważ metoda Add dodaje kontrolki tylko do aktywnej zakładki)		
			tab.Activate();
			
			// Wybranie pierwszej pozycji (jest to jedyny sposób, by wszystko poszło dobrze)
			tab.ToolBoxItems.Item(1).Select();
			
			// Dodanie do okna narzędziowego nowych pozycji - własnych kontrolek
			ToolBoxItem tbi1 = tab.ToolBoxItems.Add("not used", @"C:\windows\Microsoft.NET\Framework\v1.1.4322\System.Web.dll", vsToolBoxItemFormat.vsToolBoxItemFormatDotNETComponent);
			
			// Zamknięcie środowiska
			env.Quit();
			// Odłączenie filtra komunikatów
			MessageFilter.Revoke();

		}
	}
}
