Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/next' into rkapka-master
Browse files Browse the repository at this point in the history
  • Loading branch information
rkapka committed Jan 1, 2018
2 parents 89212c4 + b817344 commit 29d3890
Show file tree
Hide file tree
Showing 38 changed files with 742 additions and 290 deletions.
10 changes: 10 additions & 0 deletions RetailCoder.VBE/AppMenu.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using NLog;
using Rubberduck.Parsing;
using Rubberduck.Parsing.VBA;
using Rubberduck.UI;
Expand All @@ -17,6 +19,8 @@ public class AppMenu : IAppMenu, IDisposable
private readonly ISelectionChangeService _selectionService;
private readonly RubberduckCommandBar _stateBar;

private static readonly Logger _logger = LogManager.GetCurrentClassLogger();

public AppMenu(IEnumerable<IParentMenuItem> menus, IParseCoordinator parser, ISelectionChangeService selectionService, RubberduckCommandBar stateBar)
{
_menus = menus.ToList();
Expand Down Expand Up @@ -77,7 +81,13 @@ private void RemoveMenus()
{
foreach (var menu in _menus.Where(menu => menu.Item != null))
{
_logger.Debug($"Starting removal of top-level menu {menu.GetType()}.");
menu.RemoveMenu();
//We do this here and not in the menu items because we only want to dispose of/release the parents of the top level parent menus.
//The parents further down get disposed of/released as part of the remove chain.
_logger.Trace($"Removing parent menu of top-level menu {menu.GetType()}.");
menu.Parent.Dispose();
menu.Parent = null;
}
}
}
Expand Down
10 changes: 9 additions & 1 deletion RetailCoder.VBE/Common/RubberduckHooks.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,6 @@ public override int SubClassProc(IntPtr hWnd, IntPtr msg, IntPtr wParam, IntPtr
break;
case WM.CLOSE:
case WM.DESTROY:
case WM.RUBBERDUCK_SINKING:
Detach();
break;
}
Expand All @@ -172,5 +171,14 @@ private bool HandleHotkeyMessage(IntPtr wParam)
}
return processed;
}

protected override void Dispose(bool disposing)
{
if (disposing)
{
Detach();
}
base.Dispose(disposing);
}
}
}
26 changes: 15 additions & 11 deletions RetailCoder.VBE/Extension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@
using Rubberduck.SettingsProvider;
using Rubberduck.VBEditor.Events;
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
using Rubberduck.VBEditor.WindowsApi;
using User32 = Rubberduck.Common.WinAPI.User32;
using Windows = Rubberduck.VBEditor.SafeComWrappers.VBA.Windows;

namespace Rubberduck
Expand Down Expand Up @@ -75,6 +73,7 @@ public void OnConnection(object Application, ext_ConnectMode ConnectMode, object
// normal execution path - don't initialize just yet, wait for OnStartupComplete to be called by the host.
break;
case ext_ConnectMode.ext_cm_AfterStartup:
_isBeginShutdownExecuted = false; //When we reconnect after having been unloaded, the variable might no longer have its initial value.
InitializeAddIn();
break;
}
Expand Down Expand Up @@ -245,9 +244,6 @@ private void ShutdownAddIn()
_logger.Log(LogLevel.Trace, "Unhooking VBENativeServices events...");
VBENativeServices.UnhookEvents();

_logger.Log(LogLevel.Trace, "Broadcasting shutdown...");
User32.EnumChildWindows(_ide.MainWindow.Handle(), EnumCallback, new IntPtr(0));

_logger.Log(LogLevel.Trace, "Releasing dockable hosts...");
Windows.ReleaseDockableHosts();

Expand All @@ -265,6 +261,20 @@ private void ShutdownAddIn()
_container = null;
}

if (_addin != null)
{
_logger.Log(LogLevel.Trace, "Disposing AddIn wrapper...");
_addin.Dispose();
_addin = null;
}

if (_ide != null)
{
_logger.Log(LogLevel.Trace, "Disposing VBE wrapper...");
_ide.Dispose();
_ide = null;
}

_isInitialized = false;
_logger.Log(LogLevel.Info, "No exceptions were thrown.");
}
Expand All @@ -287,11 +297,5 @@ private void ShutdownAddIn()
_isInitialized = false;
}
}

private static int EnumCallback(IntPtr hwnd, IntPtr lparam)
{
User32.SendMessage(hwnd, WM.RUBBERDUCK_SINKING, IntPtr.Zero, IntPtr.Zero);
return 1;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -167,16 +167,27 @@ private List<RegexSearchResult> SearchCurrentProject(string searchPattern)
private List<RegexSearchResult> SearchOpenProjects(string searchPattern)
{
var results = new List<RegexSearchResult>();
var projects = _vbe.VBProjects;
using (var projects = _vbe.VBProjects)
{
var modules = projects
.Where(project => project.Protection == ProjectProtection.Unprotected)
.SelectMany(project => project.VBComponents)
.Select(component => component.CodeModule);

foreach (var module in modules)
foreach (var project in projects)
{
results.AddRange(GetResultsFromModule(module, searchPattern));
if (project.Protection == ProjectProtection.Locked)
{
project.Dispose();
continue;
}
using (var components = project.VBComponents)
{
foreach (var component in components)
{
using (var codeModule = component.CodeModule)
{
results.AddRange(GetResultsFromModule(codeModule, searchPattern));
}
component.Dispose();
}
}
project.Dispose();
}

return results;
Expand Down
20 changes: 18 additions & 2 deletions RetailCoder.VBE/Refactorings/Rename/RenameRefactoring.cs
Original file line number Diff line number Diff line change
Expand Up @@ -451,15 +451,31 @@ private void RenameModule()
private void RenameProject()
{
RequestParseAfterRename = false;
var projects = _model.VBE.VBProjects;
var project = projects.SingleOrDefault(p => p.ProjectId == _model.Target.ProjectId);
var project = ProjectById(_vbe, _model.Target.ProjectId);

if (project != null)
{
project.Name = _model.NewName;
project.Dispose();
}
}

private IVBProject ProjectById(IVBE vbe, string projectId)
{
using (var projects = vbe.VBProjects)
{
foreach (var project in projects)
{
if (project.ProjectId == projectId)
{
return project;
}
project.Dispose();
}
}
return null;
}

private void RenameDefinedFormatMembers(IEnumerable<Declaration> members, string underscoreFormat)
{
if (!members.Any()) { return; }
Expand Down
53 changes: 27 additions & 26 deletions RetailCoder.VBE/Root/RubberduckIoCInstaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -260,9 +260,7 @@ private static void RegisterParseTreeInspections(IWindsorContainer container, As
private void RegisterRubberduckMenu(IWindsorContainer container)
{
const int windowMenuId = 30009;
var commandBars = _vbe.CommandBars;
var menuBar = commandBars[MenuBar];
var controls = menuBar.Controls;
var controls = MainCommandBarControls(MenuBar);
var beforeIndex = FindRubberduckMenuInsertionIndex(controls, windowMenuId);
var menuItemTypes = RubberduckMenuItems();
RegisterMenu<RubberduckParentMenu>(container, controls, beforeIndex, menuItemTypes);
Expand Down Expand Up @@ -299,24 +297,36 @@ private static int FindRubberduckMenuInsertionIndex(ICommandBarControls controls
{
for (var i = 1; i <= controls.Count; i++)
{
var item = controls[i];
if (item.IsBuiltIn && item.Id == beforeId)
using (var item = controls[i])
{
return i;
if (item.IsBuiltIn && item.Id == beforeId)
{
return i;
}
}
}

return controls.Count;
}

private ICommandBarControls MainCommandBarControls(int commandBarIndex)
{
ICommandBarControls controls;
using (var commandBars = _vbe.CommandBars)
{
using (var menuBar = commandBars[commandBarIndex])
{
controls = menuBar.Controls;
}
}
return controls;
}

private void RegisterCodePaneContextMenu(IWindsorContainer container)
{
const int listMembersMenuId = 2529;
var commandBars = _vbe.CommandBars;
var menuBar = commandBars[CodeWindow];
var controls = menuBar.Controls;
var beforeControl = controls.FirstOrDefault(control => control.Id == listMembersMenuId);
var beforeIndex = beforeControl == null ? 1 : beforeControl.Index;
var controls = MainCommandBarControls(CodeWindow);
var beforeIndex = FindRubberduckMenuInsertionIndex(controls, listMembersMenuId);
var menuItemTypes = CodePaneContextMenuItems();
RegisterMenu<CodePaneContextParentMenu>(container, controls, beforeIndex, menuItemTypes);
}
Expand All @@ -336,11 +346,8 @@ private static Type[] CodePaneContextMenuItems()
private void RegisterFormDesignerContextMenu(IWindsorContainer container)
{
const int viewCodeMenuId = 2558;
var commandBars = _vbe.CommandBars;
var menuBar = commandBars[MsForms];
var controls = menuBar.Controls;
var beforeControl = controls.FirstOrDefault(control => control.Id == viewCodeMenuId);
var beforeIndex = beforeControl?.Index ?? 1;
var controls = MainCommandBarControls(MsForms);
var beforeIndex = FindRubberduckMenuInsertionIndex(controls, viewCodeMenuId);
var menuItemTypes = FormDesignerContextMenuItems();
RegisterMenu<FormDesignerContextParentMenu>(container, controls, beforeIndex, menuItemTypes);
}
Expand All @@ -357,23 +364,17 @@ private static Type[] FormDesignerContextMenuItems()
private void RegisterFormDesignerControlContextMenu(IWindsorContainer container)
{
const int viewCodeMenuId = 2558;
var commandBars = _vbe.CommandBars;
var menuBar = commandBars[MsFormsControl];
var controls = menuBar.Controls;
var beforeControl = controls.FirstOrDefault(control => control.Id == viewCodeMenuId);
var beforeIndex = beforeControl?.Index ?? 1;
var controls = MainCommandBarControls(MsFormsControl);
var beforeIndex = FindRubberduckMenuInsertionIndex(controls, viewCodeMenuId);
var menuItemTypes = FormDesignerContextMenuItems();
RegisterMenu<FormDesignerControlContextParentMenu>(container, controls, beforeIndex, menuItemTypes);
}

private void RegisterProjectExplorerContextMenu(IWindsorContainer container)
{
const int projectPropertiesMenuId = 2578;
var commandBars = _vbe.CommandBars;
var menuBar = commandBars[ProjectWindow];
var controls = menuBar.Controls;
var beforeControl = controls.FirstOrDefault(control => control.Id == projectPropertiesMenuId);
var beforeIndex = beforeControl?.Index ?? 1;
var controls = MainCommandBarControls(ProjectWindow);
var beforeIndex = FindRubberduckMenuInsertionIndex(controls, projectPropertiesMenuId);
var menuItemTypes = ProjectWindowContextMenuItems();
RegisterMenu<ProjectWindowContextParentMenu>(container, controls, beforeIndex, menuItemTypes);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public bool CanAddComponent(CodeExplorerItemViewModel parameter)
{
try
{
return GetDeclaration(parameter) != null || _vbe.VBProjects.Count == 1;
return GetDeclaration(parameter) != null || _vbe.ProjectsCount == 1;
}
catch (COMException)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ protected override bool EvaluateCanExecute(object parameter)
{
try
{
return GetDeclaration(parameter) != null || _vbe.VBProjects.Count == 1;
return GetDeclaration(parameter) != null || _vbe.ProjectsCount == 1;
}
catch (COMException)
{
Expand Down
43 changes: 37 additions & 6 deletions RetailCoder.VBE/UI/CodeExplorer/Commands/ImportCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,39 +31,70 @@ public ImportCommand(IVBE vbe, IOpenFileDialog openFileDialog) : base(LogManager

protected override bool EvaluateCanExecute(object parameter)
{
return parameter != null || _vbe.VBProjects.Count == 1 || _vbe.ActiveVBProject != null;
return parameter != null || _vbe.ProjectsCount == 1 || ThereIsAValidActiveProject();
}

private bool ThereIsAValidActiveProject()
{
using (var activeProject = _vbe.ActiveVBProject)
{
return activeProject != null;
}
}

protected override void OnExecute(object parameter)
{
var project = GetNodeProject(parameter as CodeExplorerItemViewModel) ?? _vbe.ActiveVBProject;
var usingFreshProjectWrapper = false;

var project = GetNodeProject(parameter as CodeExplorerItemViewModel);

if (project == null)
{
if (_vbe.VBProjects.Count == 1)
if (_vbe.ProjectsCount == 1)
{
project = _vbe.VBProjects[1];
usingFreshProjectWrapper = true;
using (var projects = _vbe.VBProjects)
{
project = projects[1];
}
}
else if (_vbe.ActiveVBProject != null)
else if (ThereIsAValidActiveProject())
{
usingFreshProjectWrapper = true;
project = _vbe.ActiveVBProject;
}
}

if (project == null || _openFileDialog.ShowDialog() != DialogResult.OK)
{
if (usingFreshProjectWrapper)
{
project?.Dispose();
}
return;
}

var fileExts = _openFileDialog.FileNames.Select(s => s.Split('.').Last());
if (fileExts.Any(fileExt => !new[] {"bas", "cls", "frm"}.Contains(fileExt)))
{
if (usingFreshProjectWrapper)
{
project.Dispose();
}
return;
}

foreach (var filename in _openFileDialog.FileNames)
{
project.VBComponents.Import(filename);
using (var components = project.VBComponents)
{
components.Import(filename);
}
}

if (usingFreshProjectWrapper)
{
project.Dispose();
}
}

Expand Down

0 comments on commit 29d3890

Please sign in to comment.