namespace TryCatchMatic
{
	using System;
	using Microsoft.Office.Core;
	using Extensibility;
	using System.Runtime.InteropServices;
	using EnvDTE;

	#region Read me for Add-in installation and setup information.
	// When run, the Add-in wizard prepared the registry for the Add-in.
	// At a later time, if the Add-in becomes unavailable for reasons such as:
	//   1) You moved this project to a computer other than which is was originally created on.
	//   2) You chose 'Yes' when presented with a message asking if you wish to remove the Add-in.
	//   3) Registry corruption.
	// you will need to re-register the Add-in by building the MyAddin21Setup project 
	// by right clicking the project in the Solution Explorer, then choosing install.
	#endregion
	
	/// <summary>
	///   Obiekt implementowanego dodatku.
	/// </summary>
	/// <seealso class='IDTExtensibility2' />
	[GuidAttribute("BC7C96F4-E34F-45CB-8D8D-283B68F0B81D"), ProgId("TryCatchMatic.Connect")]
	public class Connect : Object, Extensibility.IDTExtensibility2, IDTCommandTarget
	{
		/// <summary>
		///		Implementuje konstruktora obiektu dodatku.
		///		W tej metodzie należy umieścić kod inicjalizujący.
		/// </summary>
		public Connect()
		{
		}

		/// <summary>
		///      Implementuje metodę OnConnection interfejsu IDTExtensibility2.
		///      Odbiera powiadomienie o ładowaniu dodatku.
		/// </summary>
		/// <param term='application'>
		///      Obiekt główny aplikacji docelowej.
		/// </param>
		/// <param term='connectMode'>
		///      Opisuje sposób ładowania dodatku.
		/// </param>
		/// <param term='addInInst'>
		///      Obiekt reprezentujący dodatek.
		/// </param>
		/// <seealso class='IDTExtensibility2' />
		public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
		{
			applicationObject = (_DTE)application;
			addInInstance = (AddIn)addInInst;
			if(connectMode == Extensibility.ext_ConnectMode.ext_cm_UISetup)
			{
				object []contextGUIDS = new object[] { };
				Commands commands = applicationObject.Commands;
				_CommandBars commandBars = applicationObject.CommandBars;

				// W momencie uruchomienia kreator dodatków przygotował wpisy w rejestrze dla dodatku.
				// Później dodatek lub jego polecenia mogą się stać niedostępne z takich powodów, jak:
				//   1) Projekt przeniesiono na inny komputer niż ten, na którym go utworzono.
				//   2) Wybrano odpowiedź 'Tak' na pytanie o usunięcie dodatku.
				//   3) Dodano nowe polecenia lub zmodyfikowano już istniejące.
				// Należy wówczas ponownie zarejestrować dodatek konsolidując projekt TryCatchMaticSetup,
				// naciskając prawy przycisk myszy na projekcie w oknie Solution Explorer i wybierając opcję Install.
				// Alternatywne rozwiązanie polega na uruchomieniu pliku ReCreateCommands.reg, który wygenerował kreator
				// dodatków w katalogu projektu lub uruchomieniu polecenia 'devenv /setup' z poziomu wiersza poleceń.
				try
				{
					Command command = commands.AddNamedCommand(addInInstance, "TryCatchMatic", "TryCatchMatic", "Surround W/ Try..Catch", false, 101, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled);
					CommandBar commandBar = (CommandBar)commandBars["Tools"];
					CommandBarControl commandBarControl = command.AddControl(commandBar, 1);
					
					CommandBar commandBar2 = (CommandBar)commandBars["Code Window"];
					CommandBarControl commandBarControl2 = command.AddControl(commandBar2, 1);
				}
				catch(System.Exception /*e*/)
				{
				}
			}
			
		}

		/// <summary>
		///     Implementuje metodę OnDisconnection interfejsu IDTExtensibility2.
		///     Odbiera powiadomienia o dezaktywacji dodatku.
		/// </summary>
		/// <param term='disconnectMode'>
		///      Opisuje, w jaki sposób dodatek jest dezaktywowany.
		/// </param>
		/// <param term='custom'>
		///      Tablica parametrów związanych z aplikacją docelową.
		/// </param>
		/// <seealso class='IDTExtensibility2' />
		public void OnDisconnection(Extensibility.ext_DisconnectMode disconnectMode, ref System.Array custom)
		{
		}

		/// <summary>
		///      Implementuje metodę OnAddInsUpdate interfejsu IDTExtensibility2.
		///      Odbiera powiadomienia o zmianie kolekcji dodatku.
		/// </summary>
		/// <param term='custom'>
		///      Tablica parametrów związanych z aplikacją docelową.
		/// </param>
		/// <seealso class='IDTExtensibility2' />
		public void OnAddInsUpdate(ref System.Array custom)
		{
		}

		/// <summary>
		///      Implementuje metodę OnStartupComplete interfejsu IDTExtensibility2.
		///      Odbiera powiadomienia o zakończeniu ładowania aplikacji docelowej.
		/// </summary>
		/// <param term='custom'>
		///      Tablica parametrów związanych z aplikacją docelową.
		/// </param>
		/// <seealso class='IDTExtensibility2' />
		public void OnStartupComplete(ref System.Array custom)
		{
		}

		/// <summary>
		///      Implementuje metodę OnBeginShutdown interfejsu IDTExtensibility2.
		///      Odbiera powiadomienia o dezaktywacji aplikacji docelowej.
		/// </summary>
		/// <param term='custom'>
		///      Tablica parametrów związanych z aplikacją docelową.
		/// </param>
		/// <seealso class='IDTExtensibility2' />
		public void OnBeginShutdown(ref System.Array custom)
		{
		}
		
		/// <summary>
		///      Implementuje metodę QueryStatus interfejsu IDTCommandTarget.
		///      Jest ona wywoływana, kiedy zostają zaktualizowane informacje o dostępności polecenia
		/// </summary>
		/// <param term='commandName'>
		///		Nazwa polecenia, którego stan ma zostać określony.
		/// </param>
		/// <param term='neededText'>
		///		Tekst wymagany dla polecenia.
		/// </param>
		/// <param term='status'>
		///		Stan polecenia na poziomie interfejsu użytkownika.
		/// </param>
		/// <param term='commandText'>
		///		Tekst wymagany przez parametr neededText.
		/// </param>
		/// <seealso class='Exec' />
		public void QueryStatus(string commandName, EnvDTE.vsCommandStatusTextWanted neededText, ref EnvDTE.vsCommandStatus status, ref object commandText)
		{
			if(neededText == EnvDTE.vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
			{
				if(commandName == "TryCatchMatic.Connect.TryCatchMatic")
				{
					status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported|vsCommandStatus.vsCommandStatusEnabled;
				}
			}
		}

		/// <summary>
		///      Implementuje metodę Exec interfejsu IDTCommandTarget.
		///      Jest ona wywoływana w momencie wykonania polecenia.
		/// </summary>
		/// <param term='commandName'>
		///		Nazwa wykonywanego polecenia.
		/// </param>
		/// <param term='executeOption'>
		///		Opisuje sposób wykonania polecenia.
		/// </param>
		/// <param term='varIn'>
		///		Parametry przekazywane przez obiekt wywołujący do metody obsługi polecenia.
		/// </param>
		/// <param term='varOut'>
		///		Parametry przekazywane przez metodę obsługi polecenia do obiektu wywołującego.
		/// </param>
		/// <param term='handled'>
		///		Informuje obiket wywołujący o tym, czy polecenie zostało obsłużone.
		/// </param>
		/// <seealso class='Exec' />
		public void Exec(string commandName, EnvDTE.vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
		{
			handled = false;
			if(executeOption == EnvDTE.vsCommandExecOption.vsCommandExecOptionDoDefault)
			{
				if(commandName == "TryCatchMatic.Connect.TryCatchMatic")
				{
					EnvDTE.TextDocument textDoc = (EnvDTE.TextDocument)applicationObject.ActiveDocument.Object("TextDocument");
					string selectedText = textDoc.Selection.Text;
					
					string newText = "try\n { \n" + selectedText + "\n}\ncatch\n{\n}";
	
					textDoc.Selection.Text = newText;   
					handled = true;
					return;
				}
			}
		}
		private _DTE applicationObject;
		private AddIn addInInstance;
		
	}
}