blob: 30c793519492a23e96ad8beff1160da6f0e00fed [file] [log] [blame]
using Logging;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using AdminShellNS;
/* Copyright (c) 2018-2019 Festo AG & Co. KG <https://www.festo.com/net/de_de/Forms/web/contact_international>, author: Michael Hoffmeister
This software is licensed under the Eclipse Public License - v 2.0 (EPL-2.0) (see https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt).
The browser functionality is under the cefSharp license (see https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE).
The JSON serialization is under the MIT license (see https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md). */
namespace AasxPackageExplorer
{
/// <summary>
/// Interaktionslogik für DiplayAasxElements.xaml
/// </summary>
public partial class DiplayVisualAasxElements : UserControl
{
private List<VisualElementGeneric> displayedTreeViewLines = new List<VisualElementGeneric>();
private TreeViewLineCache treeViewLineCache = null;
#region Public events and properties
//
// Public events and properties
//
public event EventHandler SelectedItemChanged = null;
public VisualElementGeneric SelectedItem
{
get
{
return tv1.SelectedItem as VisualElementGeneric;
}
}
// Enumerate all the descendants of the visual object.
static public void EnumVisual(Visual myVisual, object dataObject)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
{
// Retrieve child visual at specified index value.
Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);
// Do processing of the child visual object.
var tvi = childVisual as TreeViewItem;
if (tvi != null && tvi.DataContext != null && tvi.DataContext == dataObject) {
tvi.BringIntoView();
tvi.IsSelected = true;
tvi.Focus();
return;
}
// Enumerate children of the child visual object.
EnumVisual(childVisual, dataObject);
}
}
public void Woodoo(object dataObject)
{
if (dataObject == null)
return;
// VisualTreeHelper.GetChild(tv1, )
displayedTreeViewLines[0].IsSelected = false;
EnumVisual(tv1, dataObject);
/*
TreeViewItem tvItem = (TreeViewItem)tv1
.ItemContainerGenerator
.ContainerFromItem(dataObject);
tvItem.Focus();
*/
tv1.UpdateLayout();
}
/// <summary>
/// Activates the caching of the "expanded" states of the tree, even if the tree is multiple
/// times rebuilt via <code>RebuildAasxElements</code>.
/// </summary>
public void ActivateElementStateCache ()
{
this.treeViewLineCache = new TreeViewLineCache();
}
public new Brush Background
{
get
{
return tv1.Background;
}
set
{
tv1.Background = value;
}
}
#endregion
#region XAML
//
// XAML / UI
//
public DiplayVisualAasxElements()
{
InitializeComponent();
}
private void tv1_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
base.BringIntoView();
// e.Handled = true;
var scrollViewer = tv1.Template.FindName("_tv_scrollviewer_", tv1) as ScrollViewer;
if (scrollViewer != null)
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Loaded, (Action)(() => scrollViewer.ScrollToLeftEnd()));
}
private void tv1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (sender != tv1)
return;
if (SelectedItemChanged != null)
SelectedItemChanged(this, e);
}
public void Refresh()
{
tv1.Items.Refresh();
tv1.UpdateLayout();
}
public void ExpandOnlyBranchWithin(VisualElementGeneric node)
{
// make a list of all top-level nodes
var list = new List<VisualElementGeneric>();
foreach (var dl in displayedTreeViewLines)
dl.CollectListOfTopLevelNodes(list);
// contract ALL nodes
foreach (var tl in list)
tl.ForAllDescendents((x) => { (x as VisualElementGeneric).IsExpanded = false; });
// expand all nodes having descendent
foreach (var tl in list)
if (tl.CheckIfDescendent(node))
tl.ForAllDescendents((x) => { (x as VisualElementGeneric).IsExpanded = true; });
}
#endregion
#region Elememt view drawing / handling
//
// Element View Drawing
//
private VisualElementGeneric SearchInListOfVisualElements (VisualElementGeneric tvl, object dataObject)
{
if (tvl == null || dataObject == null)
return null;
if (tvl.GetMainDataObject() == dataObject)
return tvl;
foreach (var mem in tvl.Members) {
var x = SearchInListOfVisualElements(mem, dataObject);
if (x != null)
return x;
}
return null;
}
public VisualElementGeneric SearchVisualElementOnMainDataObject(object dataObject)
{
if (displayedTreeViewLines == null)
return null;
foreach (var tvl in displayedTreeViewLines)
{
var x = SearchInListOfVisualElements(tvl, dataObject);
if (x != null)
return x;
}
return null;
}
/// <summary>
/// Return true, if <code>mem</code> has to be deleted, because not in filter.
/// </summary>
/// <param name="mem"></param>
/// <param name="fullFilterElementName"></param>
/// <returns></returns>
public bool FilterLeafsOfVisualElements(VisualElementGeneric mem, string fullFilterElementName)
{
if (fullFilterElementName == null)
return (false);
fullFilterElementName = fullFilterElementName.Trim().ToLower();
if (fullFilterElementName == "")
return (false);
// has Members -> is not leaf!
if (mem.Members != null && mem.Members.Count > 0)
{
// go into non-leafs mode -> simply go over list
var todel = new List<VisualElementGeneric>();
foreach (var x in mem.Members)
if (FilterLeafsOfVisualElements(x, fullFilterElementName))
todel.Add(x);
// delete items on list
foreach (var td in todel)
mem.Members.Remove(td);
}
else
{
// this member is a leaf!!
var isIn = false;
var mdo = mem.GetMainDataObject();
if (mdo != null && mdo is AdminShell.Referable)
{
var mdoen = (mdo as AdminShell.Referable).GetElementName().Trim().ToLower();
isIn = fullFilterElementName.IndexOf(mdoen) >= 0;
}
if (mdo != null && mdo is AdminShell.Reference)
{
var mdoen = (mdo as AdminShell.Reference).GetElementName().Trim().ToLower();
isIn = fullFilterElementName.IndexOf(mdoen) >= 0;
}
return !isIn;
}
return false;
}
public void RebuildAasxElements(
AdminShell.AdministrationShellEnv env = null,
AdminShell.PackageEnv package = null,
AdminShell.PackageEnv[] auxPackages = null, bool editMode = false, string filterElementName = null)
{
// clear tree
displayedTreeViewLines = new List<VisualElementGeneric>();
// valid?
if (env != null)
{
// generate lines, add
var x = Generators.GenerateVisualElementsFromShellEnv(treeViewLineCache, env, package, editMode, expandMode: 1);
foreach (var xx in x)
displayedTreeViewLines.Add(xx);
// more?
if (auxPackages != null)
foreach (var aux in auxPackages)
{
var x2 = Generators.GenerateVisualElementsFromShellEnv(treeViewLineCache, aux.AasEnv, aux, editMode, expandMode: 1);
foreach (var xx in x2)
displayedTreeViewLines.Add(xx);
}
// may be filter
if (filterElementName != null)
foreach (var dtl in displayedTreeViewLines)
// it is not likely, that we have to delete on this level, therefore don't care
FilterLeafsOfVisualElements(dtl, filterElementName);
// any of these lines?
if (displayedTreeViewLines.Count < 1)
{
// emergency
displayedTreeViewLines.Add(new VisualElementEnvironmentItem(null /* no parent */, treeViewLineCache, package, env, VisualElementEnvironmentItem.ItemType.EmptySet));
}
}
// redraw
tv1.ItemsSource = displayedTreeViewLines;
tv1.UpdateLayout();
// select 1st
if (displayedTreeViewLines.Count > 0)
displayedTreeViewLines[0].IsSelected = true;
}
#endregion
}
}