Skip to content

Add active content handler to LayoutAnchorableFloatingWindow and improve the active content handlers #418

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jan 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -528,24 +529,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