// This example shows how the current node and selected nodes can be persisted between dialog invocations.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
using System.Windows.Forms;
using OpcLabs.EasyOpc.UA.Forms.Browsing;
namespace UAFormsDocExamples._UABrowseDialog
{
    static partial class ShowDialog
    {
        public static void SelectionDescriptors(IWin32Window owner)
        {
            // The variables that persist the current and selected nodes.
            var currentNodeDescriptor = new UABrowseNodeDescriptor();
            var selectionDescriptors = new UABrowseNodeDescriptorCollection();
            // The initial current node (optional).
            currentNodeDescriptor.EndpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer";
            // Repeatedly show the dialog until the user cancels it.
            do
            {
                var browseDialog = new UABrowseDialog();
                browseDialog.Mode.MultiSelect = true;
                // Set the dialog inputs from the persistence variables.
                browseDialog.InputsOutputs.CurrentNodeDescriptor = currentNodeDescriptor;
                browseDialog.InputsOutputs.SelectionDescriptors.Clear();
                foreach (UABrowseNodeDescriptor browseNodeDescriptor in selectionDescriptors)
                    browseDialog.InputsOutputs.SelectionDescriptors.Add(browseNodeDescriptor);
                DialogResult dialogResult = browseDialog.ShowDialog(owner);
                if (dialogResult != DialogResult.OK)
                    break;
                // Update the persistence variables with the dialog output.
                currentNodeDescriptor = browseDialog.InputsOutputs.CurrentNodeDescriptor;
                selectionDescriptors.Clear();
                foreach (UABrowseNodeDescriptor browseNodeDescriptor in browseDialog.InputsOutputs.SelectionDescriptors)
                    selectionDescriptors.Add(browseNodeDescriptor);
            } while (true);
        }
    }
}
	 
	
		# This example shows how the current node and selected nodes can be persisted between dialog invocations.
#
# Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
# OPC client and subscriber examples in Python on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-Python .
# The QuickOPC package is needed. Install it using "pip install opclabs_quickopc".
import opclabs_quickopc
# Import .NET namespaces.
from System.Windows.Forms import *
from OpcLabs.EasyOpc.UA import *
from OpcLabs.EasyOpc.UA.Forms.Browsing import *
# The variables that persist the current and selected nodes.
currentNodeDescriptor = UABrowseNodeDescriptor()
selectionDescriptors = UABrowseNodeDescriptorCollection()
# The initial current node (optional).
currentNodeDescriptor.EndpointDescriptor = UAEndpointDescriptor('opc.tcp://opcua.demo-this.com:51210/UA/SampleServer')
# Repeatedly show the dialog until the user cancels it.
while True:
    browseDialog = UABrowseDialog()
    browseDialog.Mode.MultiSelect = True
    # Set the dialog inputs from the persistence variables.
    browseDialog.InputsOutputs.CurrentNodeDescriptor = currentNodeDescriptor
    browseDialog.InputsOutputs.SelectionDescriptors.Clear()
    for browseNodeDescriptor in selectionDescriptors:
        browseDialog.InputsOutputs.SelectionDescriptors.Add(browseNodeDescriptor)
    dialogResult = browseDialog.ShowDialog()
    print(dialogResult)
    if dialogResult != DialogResult.OK:
        break
    # Update the persistence variables with the dialog output.
    currentNodeDescriptor = browseDialog.InputsOutputs.CurrentNodeDescriptor
    selectionDescriptors.Clear()
    for browseNodeDescriptor in browseDialog.InputsOutputs.SelectionDescriptors:
        selectionDescriptors.Add(browseNodeDescriptor)
print('Finished.')
	 
	
		' This example shows how the current node and selected nodes can be persisted between dialog invocations.
'
' Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
Imports OpcLabs.EasyOpc.UA.Forms.Browsing
Namespace UAFormsDocExamples._UABrowseDialog
    Partial Friend Class ShowDialog
        Shared Sub SelectionDescriptors(owner As IWin32Window)
            ' The variables that persist the current and selected nodes.
            Dim currentNodeDescriptor = New UABrowseNodeDescriptor()
            Dim selectionDescriptors = New UABrowseNodeDescriptorCollection()
            ' The initial current node (optional).
            currentNodeDescriptor.EndpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"
            ' Repeatedly show the dialog until the user cancels it.
            Do
                Dim browseDialog = New UABrowseDialog()
                browseDialog.Mode.MultiSelect = True
                ' Set the dialog inputs from the persistence variables.
                browseDialog.InputsOutputs.CurrentNodeDescriptor = currentNodeDescriptor
                browseDialog.InputsOutputs.SelectionDescriptors.Clear()
                For Each browseNodeDescriptor As UABrowseNodeDescriptor In selectionDescriptors
                    browseDialog.InputsOutputs.SelectionDescriptors.Add(browseNodeDescriptor)
                Next browseNodeDescriptor
                Dim dialogResult As DialogResult = browseDialog.ShowDialog(owner)
                If dialogResult <> DialogResult.OK Then
                    Exit Do
                End If
                ' Update the persistence variables with the dialog output.
                currentNodeDescriptor = browseDialog.InputsOutputs.CurrentNodeDescriptor
                selectionDescriptors.Clear()
                For Each browseNodeDescriptor As UABrowseNodeDescriptor In browseDialog.InputsOutputs.SelectionDescriptors
                    selectionDescriptors.Add(browseNodeDescriptor)
                Next browseNodeDescriptor
            Loop While True
        End Sub
    End Class
End Namespace