Skip to content

Commit

Permalink
feat: Implement RichTextBlockOverflowAutomationPeer
Browse files Browse the repository at this point in the history
  • Loading branch information
morning4coffe-dev authored and MartinZikmund committed Jun 17, 2024
1 parent c1707ef commit a73304c
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
#pragma warning disable 114 // new keyword hiding
namespace Microsoft.UI.Xaml.Automation.Peers
{
#if __ANDROID__ || __IOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
#if false
[global::Uno.NotImplemented]
#endif
public partial class RichTextBlockOverflowAutomationPeer : global::Microsoft.UI.Xaml.Automation.Peers.FrameworkElementAutomationPeer
{
#if __ANDROID__ || __IOS__ || IS_UNIT_TESTS || __WASM__ || __SKIA__ || __NETSTD_REFERENCE__ || __MACOS__
#if false
[global::Uno.NotImplemented("__ANDROID__", "__IOS__", "IS_UNIT_TESTS", "__WASM__", "__SKIA__", "__NETSTD_REFERENCE__", "__MACOS__")]
public RichTextBlockOverflowAutomationPeer(global::Microsoft.UI.Xaml.Controls.RichTextBlockOverflow owner) : base(owner)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.
// MUX Reference RichTextBlockOverflowAutomationPeer_Partial.cpp, tag winui3/release/1.4.2
using System.Collections.Generic;

namespace Microsoft.UI.Xaml.Automation.Peers;

/// <summary>
/// Exposes RichTextBlockOverflow types to Microsoft UI Automation.
/// </summary>
public partial class RichTextBlockOverflowAutomationPeer : FrameworkElementAutomationPeer
{
public RichTextBlockOverflowAutomationPeer(Controls.RichTextBlockOverflow owner) : base(owner)
{
}

protected override object GetPatternCore(PatternInterface patternInterface)
{
if (patternInterface == PatternInterface.Text)
{
//if (m_pTextPattern == nullptr)
//{
// ctl::ComPtr<IUIElement> spOwner;
// ctl::ComPtr<TextAdapter> spTextAdapter;
// IFC(get_Owner(&spOwner));
// IFCPTR(spOwner.Get());

// // RichTextBlockOverflows that don't have a master RichTextBlock don't have a text pattern, and should return nullptr.
// if (static_cast<CRichTextBlockOverflow*>((static_cast<RichTextBlockOverflow*>(spOwner.Get())->GetHandle()))->m_pMaster != nullptr)
// {
// IFC(ActivationAPI::ActivateAutomationInstance(KnownTypeIndex::TextAdapter, static_cast<RichTextBlockOverflow*>(spOwner.Get())->GetHandle(), spTextAdapter.GetAddressOf()));

// IFCPTR(spTextAdapter.Get());

// m_pTextPattern = spTextAdapter.Detach();
// IFC(m_pTextPattern->put_Owner(spOwner.Get()));
// }
//}
//*ppReturnValue = ctl::as_iinspectable((m_pTextPattern));
//ctl::addref_interface(m_pTextPattern);
}
else
{
return base.GetPatternCore(patternInterface);
}
}

protected override string GetClassNameCore() => nameof(Controls.RichTextBlockOverflow);

protected override AutomationControlType GetAutomationControlTypeCore()
=> AutomationControlType.Text;

// We populate automation peer children from its block collection recursively
// Here we need to eliminate all text elements which are
// are present in the previous RichTextBlock/RichTextBlockOverflow
// overflowing to next RichTextOverflow if any
protected override IList<AutomationPeer> GetChildrenCore()
{
var owner = Owner as Controls.RichTextBlockOverflow;

var posContentStart = 0;
var posOverflowStart = int.MaxValue;

var returnValue = base.GetChildrenCore();

if (owner.ContentStart is { } contentStart)
{
posContentStart = contentStart.Offset;

if (owner.HasOverflowContent)
{
if (owner.OverflowContentTarget?.ContentStart is { } spOverflowStart)
{
posOverflowStart = spOverflowStart.Offset;
}
}
}

var spSourceControl = owner.ContentSource;
var spBlocks = spSourceControl.Blocks;
var count = spBlocks.Count;

for (var i = 0; i < count; i++)
{
var spBlock = spBlocks[i];
if (owner.HasOverflowContent)
{
var blockStart = spBlock.ContentStart;

if (blockStart.Offset >= posOverflowStart)
{
break;
}
}

//UNO TODO: AppendAutomationPeerChildren
returnValue = spBlock.AppendAutomationPeerChildren(posContentStart, posOverflowStart);
}

return returnValue;
}
}

0 comments on commit a73304c

Please sign in to comment.