// VsPkg.cs : Implementation of OrigoVSIntegration
//
using System;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.ComponentModel.Design;
using Microsoft.Win32;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.Shell;
using ETHZurich.OrigoVSIntegration.Dialogs;
namespace ETHZurich.OrigoVSIntegration
{
///
/// 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.
///
// This attribute tells the registration utility (regpkg.exe) that this class needs
// to be registered as package.
[PackageRegistration(UseManagedResourcesOnly = true)]
// A Visual Studio component can be registered under different regitry roots; for instance
// when you debug your package you want to register it in the experimental hive. This
// attribute specifies the registry root to use if no one is provided to regpkg.exe with
// the /root switch.
[DefaultRegistryRoot("Software\\Microsoft\\VisualStudio\\8.0")]
// This attribute is used to register the informations needed to show the this package
// in the Help/About dialog of Visual Studio.
[InstalledProductRegistration(true, null, null, null)]
// In order be loaded inside Visual Studio in a machine that has not the VS SDK installed,
// package needs to have a valid load key (it can be requested at
// http://msdn.microsoft.com/vstudio/extend/). This attributes tells the shell that this
// package has a load key embedded in its resources.
[ProvideLoadKey("Standard", "1.0", "Origo Visual Studio Integration", "ETH Zürich", 104)]
// This attribute is needed to let the shell know that this package exposes some menus.
[ProvideMenuResource(1000, 1)]
[ProvideOptionPage(typeof(OrigoSettings), "Origo", "General", 1001, 1002, true)]
[ProvideOptionPage(typeof(OrigoWorkitemSetting), "Origo", "Workitem Display", 1003, 1004, true)]
[ProvideToolWindow(typeof(OrigoWorkitemToolwindow))]
[Guid(GuidList.guidOrigoVSIntegrationPkgString)]
public sealed class OrigoVSIntegration : Package, IVsInstalledProduct
{
///
/// 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.
///
public OrigoVSIntegration()
{
Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this.ToString()));
}
/////////////////////////////////////////////////////////////////////////////
// Overriden Package Implementation
#region Package Members
///
/// 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.
///
protected override void Initialize()
{
Trace.WriteLine (string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString()));
base.Initialize();
// Add our command handlers for menu (commands must exist in the .ctc file)
OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if ( null != mcs )
{
// Create the command for the menu item.
//show origo main dialog
CommandID menuCommandID = new CommandID(GuidList.guidOrigoVSIntegrationCmdSet, (int)PkgCmdIDList.cmdidOrigo);
MenuCommand menuItem = new MenuCommand( new EventHandler(MenuItemCallback), menuCommandID );
mcs.AddCommand( menuItem );
//show workitem display
menuCommandID = new CommandID(GuidList.guidOrigoVSIntegrationCmdSet, (int)PkgCmdIDList.cmdidOrigoToolwnd);
menuItem = new MenuCommand(new EventHandler(ShowToolWindow), menuCommandID);
mcs.AddCommand(menuItem);
}
}
#endregion
///
/// This function is the callback used to execute a command when the a menu item is clicked.
/// See the Initialize method to see how the menu item is associated to this function using
/// the OleMenuCommandService service and the MenuCommand class.
///
private void MenuItemCallback(object sender, EventArgs e)
{
OrigoMainDialog mainDialog = new OrigoMainDialog(this);
mainDialog.ShowDialog();
}
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(OrigoWorkitemToolwindow), 0, true);
if ((null == window) || (null == window.Frame))
{
throw new COMException("Could not create OrigoWorkitemToolwindow");
}
IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;
Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(windowFrame.Show());
}
#region IVsInstalledProduct Member
public int IdBmpSplash(out uint pIdBmp)
{
pIdBmp = 500;
return Microsoft.VisualStudio.VSConstants.S_OK;
}
public int IdIcoLogoForAboutbox(out uint pIdIco)
{
pIdIco = 600;
return Microsoft.VisualStudio.VSConstants.S_OK;
}
public int OfficialName(out string pbstrName)
{
pbstrName = "Origo VS Integration";
return Microsoft.VisualStudio.VSConstants.S_OK;
}
public int ProductDetails(out string pbstrProductDetails)
{
pbstrProductDetails = "Origo IDE integration for Visual Studio 2005";
return Microsoft.VisualStudio.VSConstants.S_OK;
}
public int ProductID(out string pbstrPID)
{
pbstrPID = "Origo VS Integration ID";
return Microsoft.VisualStudio.VSConstants.S_OK;
}
#endregion
}
}