Cosmos/source/XSharp.VS/Package.cs

123 lines
5.4 KiB
C#

using System;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.ComponentModel.Design;
using Microsoft.Win32;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace XSharp.VS {
/// 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 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)]
//[Guid(Guids.guidCosmos_VS_XSharpPkgString)]
//// Registering a Language Service (MPF)
//// http://msdn.microsoft.com/en-us/library/bb166498
//[ProvideServiceAttribute(typeof(XSharpLanguageService), ServiceName = "X# Language Service")]
//[ProvideLanguageServiceAttribute(typeof(XSharpLanguageService), "X#",
// 106, // Resource ID of localized language name
// CodeSense = false, // IntelliSense
// RequestStockColors = true,
// EnableCommenting = false, // Commenting out code
// EnableAsyncCompletion = true // Background parsing
//)]
//[ProvideLanguageExtensionAttribute(typeof(XSharpLanguageService), ".xs")]
public sealed class Cosmos_VS_XSharpPackage : Package, IOleComponent {
uint mComponentID;
// 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 Cosmos_VS_XSharpPackage() {
}
/// 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() {
base.Initialize();
// Proffer the service.
var serviceContainer = this as IServiceContainer;
var langService = new XSharpLanguageService();
langService.SetSite(this);
serviceContainer.AddService(typeof(XSharpLanguageService), langService, true);
// Register a timer to call our language service during idle periods.
var xMgr = GetService(typeof(SOleComponentManager)) as IOleComponentManager;
if (mComponentID == 0 && xMgr != null) {
OLECRINFO[] crinfo = new OLECRINFO[1];
crinfo[0].cbSize = (uint)Marshal.SizeOf(typeof(OLECRINFO));
crinfo[0].grfcrf = (uint)_OLECRF.olecrfNeedIdleTime | (uint)_OLECRF.olecrfNeedPeriodicIdleTime;
crinfo[0].grfcadvf = (uint)_OLECADVF.olecadvfModal | (uint)_OLECADVF.olecadvfRedrawOff | (uint)_OLECADVF.olecadvfWarningsOff;
crinfo[0].uIdleTimeInterval = 1000;
xMgr.FRegisterComponent(this, crinfo, out mComponentID);
}
}
protected override void Dispose(bool disposing) {
if (mComponentID != 0) {
var xMgr = GetService(typeof(SOleComponentManager)) as IOleComponentManager;
if (xMgr != null) {
xMgr.FRevokeComponent(mComponentID);
}
mComponentID = 0;
}
base.Dispose(disposing);
}
public int FDoIdle(uint grfidlef) {
bool bPeriodic = (grfidlef & (uint)_OLEIDLEF.oleidlefPeriodic) != 0;
// Use typeof(TestLanguageService) because we need to reference the GUID for our language service.
LanguageService xService = GetService(typeof(XSharpLanguageService)) as LanguageService;
if (xService != null) {
xService.OnIdle(bPeriodic);
}
return 0;
}
public int FContinueMessageLoop(uint uReason, IntPtr pvLoopData, MSG[] pMsgPeeked) {
return 1;
}
public int FPreTranslateMessage(MSG[] pMsg) {
return 0;
}
public int FQueryTerminate(int fPromptUser) {
return 1;
}
public int FReserved1(uint dwReserved, uint message, IntPtr wParam, IntPtr lParam) {
return 1;
}
public IntPtr HwndGetWindow(uint dwWhich, uint dwReserved) {
return IntPtr.Zero;
}
public void OnActivationChange(IOleComponent pic, int fSameComponent, OLECRINFO[] pcrinfo, int fHostIsActivating, OLECHOSTINFO[] pchostinfo, uint dwReserved) { }
public void OnAppActivate(int fActive, uint dwOtherThreadID) { }
public void OnEnterState(uint uStateID, int fEnter) { }
public void OnLoseActivation() { }
public void Terminate() { }
}
}