/*
* QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
* Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.ComponentModel.Design;
using Microsoft.VisualStudio.Shell;
namespace QuantConnect.VisualStudioPlugin
{
///
/// Command handler for QuantConnect menus in the "Tools" section.
///
internal sealed class ToolMenuCommand
{
///
/// Command IDs for 'Login' in the "Tools" menu
///
private const int _loginCommandId = 256;
///
/// Command IDs for 'Logout' in the "Tools" menu
///
private const int _logoutCommandId = 512;
///
/// Command menu group (command set GUID).
///
private static readonly Guid _commandSet = new Guid("fefaf282-a478-45f4-b89a-a8f15dd8aaff");
///
/// VS Package that provides this command, not null.
///
private readonly QuantConnectPackage _package;
///
/// A command to perform QuantConnect authentication.
///
private readonly AuthenticationCommand _authenticationCommand;
///
/// Instance of the command.
///
private static ToolMenuCommand _instance;
///
/// Gets the service provider from the owner package.
///
private IServiceProvider _serviceProvider => _package;
///
/// Initializes a new instance of the class.
/// Adds our command handlers for menu (commands must exist in the command table file)
///
/// Owner package, not null.
private ToolMenuCommand(Package package)
{
if (package == null)
{
throw new ArgumentNullException(nameof(package));
}
_package = package as QuantConnectPackage;
_authenticationCommand = new AuthenticationCommand();
var commandService = _serviceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if (commandService != null)
{
RegisterLoginCommand(commandService);
RegisterLogoutCommand(commandService);
}
}
private void RegisterLoginCommand(OleMenuCommandService commandService)
{
var menuCommandId = new CommandID(_commandSet, _loginCommandId);
var loginMenuItem = new OleMenuCommand(LoginCallback, menuCommandId);
loginMenuItem.BeforeQueryStatus += (sender, evt) =>
{
loginMenuItem.Enabled = !AuthorizationManager.GetInstance().IsLoggedIn();
};
commandService.AddCommand(loginMenuItem);
}
private void RegisterLogoutCommand(OleMenuCommandService commandService)
{
var menuCommandId = new CommandID(_commandSet, _logoutCommandId);
var logoutMenuItem = new OleMenuCommand(LogoutCallback, menuCommandId);
logoutMenuItem.BeforeQueryStatus += (sender, evt) =>
{
logoutMenuItem.Enabled = AuthorizationManager.GetInstance().IsLoggedIn();
};
commandService.AddCommand(logoutMenuItem);
}
///
/// Initializes the singleton instance of the command.
///
/// Owner package, not null.
public static void Initialize(Package package)
{
_instance = new ToolMenuCommand(package);
}
///
/// This function is the callback used to execute the command when the menu item Login is clicked.
///
/// Event sender.
/// Event args.
private async void LoginCallback(object sender, EventArgs e)
{
await _authenticationCommand.Login(_serviceProvider, true);
}
///
/// This function is the callback used to execute the command when the menu item Logout is clicked.
///
/// Event sender.
/// Event args.
private void LogoutCallback(object sender, EventArgs e)
{
_authenticationCommand.Logout(_serviceProvider);
}
}
}