Thank you, I now have a windows MessageBox dialog functional in the example GUI. Next step is to understand how to pass a numeric value back similar to the Serial Number dialog in the example test steps. Any idea which file is best reviewed for this?
The issue I think I have is the get below creates a link to the serialnumber object I want to change when I look at the varEdit variable. However, the varEdit.Value = changes the declaration of the “Source” when I do the annotation. I’m assuming I need to parse the varEdit to get to the storage location for the ulong.
var varEdit = annotations.Get<IObjectValueAnnotation>();
if (varEdit != null)
{
varEdit.Value = (ulong) 12345;
annotations.Write(); // Updates Members
}
I think I finally figured this out using master/Engine/UserInput.cs. While I still don’t understand the relationship between all the parsing involved, I can now return a value to the test step through RequestUserInput…
Here’s a starting point for the next user of the Example GUI. It supports dialog and input boxes, but not timeouts.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using Microsoft.VisualBasic;
namespace OpenTap.Tui
{
public class RemoteUserInputHandler : IUserInputInterface
{
string getTitle(List members, object dataObject)
{
var title = members.FirstOrDefault(m => m.Get()?.Name?.Equals(“title”, StringComparison.OrdinalIgnoreCase) == true)?.Get()?.Value;
if (title == null)
title = members.FirstOrDefault(m => m.Get()?.Name?.Equals(“name”, StringComparison.OrdinalIgnoreCase) == true)?.Get()?.Value;
if (title == null)
{
var typeData = TypeData.FromType(dataObject.GetType());
title = typeData.Display?.Name ?? typeData.Name;
}
return title;
}
string getMessage(List<AnnotationCollection> members, object dataObject)
{
var message = members.FirstOrDefault(m => m.Get<DisplayAttribute>()?.Name?.Equals("message", StringComparison.OrdinalIgnoreCase) == true)?.Get<IStringValueAnnotation>()?.Value;
if (message == null)
message = members.FirstOrDefault(m => m.Get<DisplayAttribute>()?.Name?.Equals("name", StringComparison.OrdinalIgnoreCase) == true)?.Get<IStringValueAnnotation>()?.Value;
if (message == null)
{
var typeData = TypeData.FromType(dataObject.GetType());
message = typeData.Display?.Name ?? typeData.Name;
}
return message;
}
public void RequestUserInput(object dataObject, TimeSpan Timeout, bool modal)
{
// Load properties
var annotations = AnnotationCollection.Annotate(dataObject);
var members = annotations?.Get<IMembersAnnotation>()?.Members?.ToList();
var anyAvailableValuesAnnotation = annotations?.Get<INamedMembersAnnotation>();
var submitMembers = members?.FirstOrDefault(m => m.Get<IAccessAnnotation>().IsVisible && m.Get<IMemberAnnotation>()?.Member.GetAttribute<SubmitAttribute>() != null);
if (submitMembers != null)
{
var myAvailableValuesAnnotation = submitMembers.Get<IAvailableValuesAnnotationProxy>();
if (myAvailableValuesAnnotation == null)
{
/* ??? TBD ??? */
}
}
// Create dialog
var dialogTitle = getTitle(members, dataObject);
var dialogMessage = getMessage(members, dataObject);
MessageBoxButton myMbButtons = MessageBoxButton.YesNo;
var submit = members?.FirstOrDefault(m => m.Get<IAccessAnnotation>().IsVisible && m.Get<IMemberAnnotation>()?.Member.GetAttribute<SubmitAttribute>() != null);
if (submit != null)
{
var myAvailableValuesAnnotation = submit.Get<IAvailableValuesAnnotationProxy>();
foreach (var myAvailableValue in myAvailableValuesAnnotation.AvailableValues)
{
var buttonName = myAvailableValue.Source.ToString();
if (buttonName == "Ok") myMbButtons = MessageBoxButton.OKCancel;
if (buttonName == "Yes") myMbButtons = MessageBoxButton.YesNo;
}
MessageBoxResult MyMB = MessageBox.Show(dialogMessage, dialogTitle, MessageBoxButton.OKCancel);
if ((MyMB == MessageBoxResult.Cancel) || (MyMB == MessageBoxResult.No))
{
foreach (var myAvailableValue in myAvailableValuesAnnotation.AvailableValues)
{
var buttonName = myAvailableValue.Source.ToString();
if ((buttonName == "No") || (buttonName == "Cancel"))
{
var buttonSelectedValue = myAvailableValuesAnnotation.SelectedValue;
var buttonAVailableValue = myAvailableValue;
myAvailableValuesAnnotation.SelectedValue = myAvailableValue;
submitMembers.Write();
annotations.Write();
}
}
}
if ((MyMB == MessageBoxResult.OK) || (MyMB == MessageBoxResult.Yes))
{
foreach (var myAvailableValue in myAvailableValuesAnnotation.AvailableValues)
{
var buttonName = myAvailableValue.Source.ToString();
if ((buttonName == "Ok") || (buttonName == "Yes"))
{
var buttonSelectedValue = myAvailableValuesAnnotation.SelectedValue;
var buttonAVailableValue = myAvailableValue;
myAvailableValuesAnnotation.SelectedValue = myAvailableValue;
submitMembers.Write();
annotations.Write();
}
}
}
}
else
{
foreach (var _message in members)
{
var mem = _message.Get<IMemberAnnotation>()?.Member;
if (mem != null)
{
var str = _message.Get<IStringValueAnnotation>();
if (str != null)
{
var name = _message.Get<DisplayAttribute>()?.Name;
var isVisible = _message.Get<IAccessAnnotation>()?.IsVisible ?? true;
if (!isVisible) continue;
var isReadOnly = _message.Get<IAccessAnnotation>()?.IsReadOnly ?? false;
if (isReadOnly)
{
Console.WriteLine($"{str.Value}");
continue;
}
str.Value = Interaction.InputBox(dialogMessage, name, "999999999", -1, -1);
_message.Write();
annotations.Write(); // Updates Members
}
}
}
}
/*
resetEvent.Wait();
if (timedOut)
throw new TimeoutException("User input timed out.");
*/
}
}
}