Skip to content

Commit

Permalink
Merge pull request #418 from Noisrev/Fix-ToolWindow-Activate
Browse files Browse the repository at this point in the history
Add active content handler to LayoutAnchorableFloatingWindow and improve the active content handlers
  • Loading branch information
Dirkster99 authored Jan 29, 2023
2 parents bae1291 + ce7de8d commit 7ce2937
Show file tree
Hide file tree
Showing 4 changed files with 213 additions and 149 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@ This program is provided to you under the terms of the Microsoft Public
License (Ms-PL) as published at https://opensource.org/licenses/MS-PL
************************************************************************/

using AvalonDock.Commands;
using AvalonDock.Converters;
using AvalonDock.Layout;
using Microsoft.Windows.Shell;
using System;
using System.Collections.Generic;
using System.ComponentModel;
Expand All @@ -20,6 +16,12 @@ This program is provided to you under the terms of the Microsoft Public
using System.Windows.Data;
using System.Windows.Input;

using AvalonDock.Commands;
using AvalonDock.Converters;
using AvalonDock.Layout;

using Microsoft.Windows.Shell;

namespace AvalonDock.Controls
{
/// <inheritdoc cref="LayoutFloatingWindowControl"/>
Expand Down Expand Up @@ -244,17 +246,17 @@ protected override IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, Int
switch (msg)
{
case Win32Helper.WM_ACTIVATE:
var anchorablePane = _model.Descendents().OfType<LayoutAnchorablePane>()
.FirstOrDefault(p => p.ChildrenCount > 0 && p.SelectedContent != null);

if (anchorablePane != null)
var isInactive = ((int)wParam & 0xFFFF) == Win32Helper.WA_INACTIVE;
if (_model.IsSinglePane)
{
var isActive = !(((int)wParam & 0xFFFF) == Win32Helper.WA_INACTIVE);
anchorablePane.SelectedContent.IsActive = isActive;

handled = true;
LayoutFloatingWindowControlHelper.ActiveTheContentOfSinglePane(this, !isInactive);
}
else
{
LayoutFloatingWindowControlHelper.ActiveTheContentOfMultiPane(this, !isInactive);
}

handled = true;
break;

case Win32Helper.WM_NCRBUTTONUP:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,18 @@ This program is provided to you under the terms of the Microsoft Public
License (Ms-PL) as published at https://opensource.org/licenses/MS-PL
************************************************************************/

using AvalonDock.Commands;
using AvalonDock.Layout;
using Microsoft.Windows.Shell;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls.Primitives;
using System.Windows.Input;

using AvalonDock.Commands;
using AvalonDock.Layout;

using Microsoft.Windows.Shell;

namespace AvalonDock.Controls
{
/// <summary>
Expand Down Expand Up @@ -113,119 +115,6 @@ private void Model_PropertyChanged(object sender, System.ComponentModel.Property
if (e.PropertyName == nameof(LayoutDocumentFloatingWindow.RootPanel) && _model.RootPanel == null) InternalClose();
}

private void ActiveOfSinglePane(bool isActive)
{
var layoutDocumentPane = _model.Descendents().OfType<LayoutDocumentPane>()
.FirstOrDefault(p => p.ChildrenCount > 0 && p.SelectedContent != null);

if (layoutDocumentPane != null)
{
layoutDocumentPane.SelectedContent.IsActive = isActive;
}
// When the floating tool window is mixed with the floating document window
// and the document pane in the floating document window is dragged out.

// Only the Tool panes is left in the floating document window.
// The Children Count is greater than 0 and the Selected Content is null.

// Then we only need to activate the last active content.
else
{
ActiveLastActivationOfItems(isActive);
}
}

private LayoutDocumentPaneControl FindDocumentPaneControlByMousePoint()
{
var mousePosition = Win32Helper.GetMousePosition();
var rootVisual = ((FloatingWindowContentHost)Content).RootVisual;
var areaHosts = rootVisual.FindVisualChildren<LayoutDocumentPaneControl>();

foreach (var areaHost in areaHosts)
{
var area = areaHost.GetScreenArea();
var pos = areaHost.TransformFromDeviceDPI(mousePosition);
var b = area.Contains(pos);

if (b)
{
return areaHost;
}
}

return null;
}

private void ActiveLastActivationOfPane(LayoutDocumentPane model)
{
if (model.Children.Count > 0)
{
var index = 0;
if (model.Children.Count > 1)
{
var tmTimeStamp = model.Children[0].LastActivationTimeStamp;
for (var i = 1; i < model.Children.Count; i++)
{
var item = model.Children[i];
if (item.LastActivationTimeStamp > tmTimeStamp)
{
tmTimeStamp = item.LastActivationTimeStamp;
index = i;
}
}
}

model.SelectedContentIndex = index;
}
}

private void ActiveLastActivationOfItems(bool isActive)
{
var items = _model.Descendents().OfType<LayoutContent>().ToList();
if (items.Count > 0)
{
var index = 0;
if (items.Count > 1)
{
var tmpTimeStamp2 = items[0].LastActivationTimeStamp;
for (var i = 1; i < items.Count; i++)
{
var item = items[i];
if (item.LastActivationTimeStamp > tmpTimeStamp2)
{
tmpTimeStamp2 = item.LastActivationTimeStamp;
index = i;
}
}
}

items[index].IsActive = isActive;
}
}

private void ActiveOfMultiPane(bool isActive)
{
if (isActive)
{
var documentPane = FindDocumentPaneControlByMousePoint();
if (documentPane != null)
{
var model = (LayoutDocumentPane)documentPane.Model;
if (model.SelectedContent != null)
{
model.SelectedContent.IsActive = true;
return;
}
else
{
ActiveLastActivationOfPane(model);
return;
}
}
}
ActiveLastActivationOfItems(isActive);
}

/// <inheritdoc />
protected override IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
Expand All @@ -235,11 +124,11 @@ protected override IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, Int
var isInactive = ((int)wParam & 0xFFFF) == Win32Helper.WA_INACTIVE;
if (_model.IsSinglePane)
{
ActiveOfSinglePane(!isInactive);
LayoutFloatingWindowControlHelper.ActiveTheContentOfSinglePane(this, !isInactive);
}
else
{
ActiveOfMultiPane(!isInactive);
LayoutFloatingWindowControlHelper.ActiveTheContentOfMultiPane(this, !isInactive);
}

handled = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ This program is provided to you under the terms of the Microsoft Public
License (Ms-PL) as published at https://opensource.org/licenses/MS-PL
************************************************************************/

using AvalonDock.Layout;
using AvalonDock.Themes;
using System;
using System.ComponentModel;
using System.Linq;
Expand All @@ -22,6 +20,9 @@ This program is provided to you under the terms of the Microsoft Public
using System.Windows.Interop;
using System.Windows.Media;

using AvalonDock.Layout;
using AvalonDock.Themes;

namespace AvalonDock.Controls
{
/// <inheritdoc cref="Window"/>
Expand Down Expand Up @@ -52,7 +53,7 @@ public abstract class LayoutFloatingWindowControl : Window, ILayoutControl
/// </summary>
/// <see cref="TotalMargin"/>
private bool _isTotalMarginSet = false;

#endregion fields

#region Constructors
Expand Down Expand Up @@ -542,24 +543,24 @@ protected override void OnInitialized(EventArgs e)
}

protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
AssureOwnerIsNotMinimized();
}
{
base.OnClosing(e);
AssureOwnerIsNotMinimized();
}

/// <summary>
/// <summary>
/// Prevents a known bug in WPF, which wronlgy minimizes the parent window, when closing this control
/// </summary>
private void AssureOwnerIsNotMinimized()
{
try
{
Owner?.Activate();
}
catch (Exception)
{
}
}
/// </summary>
private void AssureOwnerIsNotMinimized()
{
try
{
Owner?.Activate();
}
catch (Exception)
{
}
}

#endregion Overrides

Expand Down
Loading

0 comments on commit 7ce2937

Please sign in to comment.