コード例 #1
0
        /// <summary>
        /// Render the list of form elements into a list of SubmodelElements.
        /// </summary>
        public AdminShell.SubmodelElementWrapperCollection AddOrUpdateDifferentElementsToCollection(
            AdminShell.SubmodelElementWrapperCollection elements,
            AdminShellPackageEnv packageEnv = null, bool addFilesToPackage = false)
        {
            // will be a list of newly added elements (for tracing)
            var res = new AdminShell.SubmodelElementWrapperCollection();

            // each description / instance pair
            foreach (var pair in this)
            {
                // ok, perform the actual add or update procedure
                var lst = pair.instances.AddOrUpdateSameElementsToCollection(elements, packageEnv, addFilesToPackage);

                // for newly added elements, shaping of idSHort might be required
                if (lst != null)
                {
                    foreach (var smw in lst)
                    {
                        // access
                        if (smw?.submodelElement?.idShort == null)
                        {
                            continue;
                        }

                        // check, if to make idShort unique?
                        FormInstanceHelper.MakeIdShortUnique(elements, smw.submodelElement);

                        // add to tracing
                        res.Add(smw);
                    }
                }
            }
            return(res);
        }
コード例 #2
0
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            // save data context
            var dc = IndividualDataContext.CreateDataContext(this.DataContext);

            if (dc == null)
            {
                return;
            }

            // first update
            this.theViewModel.StoredReference = dc.refElem?.value;
            UpdateDisplay();

            // attach lambdas for clear
            ButtonClear.Click += (object sender5, RoutedEventArgs e5) =>
            {
                dc.instance.Touch();
                dc.refElem.value = null;
                this.theViewModel.StoredReference = dc.refElem.value;
            };

            // attach lambdas for select
            ButtonSelect.Click += (object sender6, RoutedEventArgs e6) =>
            {
                // TEST
                //// dc.refElem.value = new AdminShellV20.Reference(new AdminShell.Key(AdminShell.Key.GlobalReference, true, AdminShell.Identification.IRI, "http://ccc.de"));
                //// UpdateDisplay();

                // try find topmost instance
                var top     = FormInstanceHelper.GetTopMostParent(dc.instance);
                var topBase = top as FormInstanceBase;
                if (topBase != null && topBase.outerEventStack != null)
                {
                    // give over to event stack
                    var ev = new AasxIntegrationBase.AasxPluginResultEventSelectAasEntity();
                    ev.filterEntities = AdminShell.Key.AllElements;
                    ev.showAuxPackage = true;
                    ev.showRepoFiles  = true;
                    topBase.outerEventStack.PushEvent(ev);

                    // .. and receive incoming event
                    topBase.subscribeForNextEventReturn = (revt) =>
                    {
                        if (revt is AasxPluginEventReturnSelectAasEntity rsel && rsel.resultKeys != null)
                        {
                            dc.instance.Touch();
                            dc.refElem.value = AdminShell.Reference.CreateNew(rsel.resultKeys);
                            this.theViewModel.StoredReference = dc.refElem.value;
                        }
                    };
                }
            };
        }
コード例 #3
0
        public AdminShell.SubmodelElementWrapperCollection GenerateDefault()
        {
            var res = new AdminShell.SubmodelElementWrapperCollection();

            foreach (var desc in this)
            {
                AdminShell.SubmodelElement sme = null;

                // generate element

                if (desc is FormDescProperty)
                {
                    sme = (desc as FormDescProperty).GenerateDefault();
                }
                if (desc is FormDescMultiLangProp)
                {
                    sme = (desc as FormDescMultiLangProp).GenerateDefault();
                }
                if (desc is FormDescFile)
                {
                    sme = (desc as FormDescFile).GenerateDefault();
                }
                if (desc is FormDescSubmodelElementCollection)
                {
                    sme = (desc as FormDescSubmodelElementCollection).GenerateDefault();
                }

                // multiplicity -> enumerate correctly
                FormInstanceHelper.MakeIdShortUnique(res, sme);

                if (sme != null)
                {
                    res.Add(sme);
                }
            }

            return(res);
        }
コード例 #4
0
        public void UpdateDisplay()
        {
            // access
            var inst = this.DataContext as FormInstanceListOfSame;
            var desc = inst?.workingDesc as FormDescSubmodelElement;

            if (inst == null || desc == null || GridOuterElement == null || GridInner == null)
            {
                return;
            }

            // obligatory
            this.TextBlockFormTitle.Text      = "" + desc.FormTitle;
            this.TextBlockFormInfo.Text       = "" + desc.FormInfo;
            this.TextBlockFormInfo.Visibility = (this.TextBlockFormInfo.Text.Trim() != "")
                ? Visibility.Visible
                : Visibility.Collapsed;

            // url link
            ButtonFormUrl.Visibility = Visibility.Hidden;
            if (desc.FormUrl != null && desc.FormUrl.Length > 0)
            {
                ButtonFormUrl.Visibility = Visibility.Visible;
                ButtonFormUrl.Click     += (object sender3, RoutedEventArgs e3) =>
                {
                    // try find topmost instance
                    var top     = FormInstanceHelper.GetTopMostParent(inst);
                    var topBase = top as FormInstanceBase;
                    if (topBase != null && topBase.outerEventStack != null)
                    {
                        // give over to event stack
                        var evt = new AasxPluginResultEventDisplayContentFile();
                        evt.fn = desc.FormUrl;
                        evt.preferInternalDisplay = true;
                        topBase.outerEventStack.PushEvent(evt);
                    }
                };
            }

            // (re-) create rows
            GridInner.Children.Clear();
            GridInner.RowDefinitions.Clear();
            int ri = 0;

            foreach (var si in inst.SubInstances)
            {
                if (si?.subControl != null)
                {
                    // row
                    var rd = new RowDefinition();
                    rd.Height = GridLength.Auto;
                    GridInner.RowDefinitions.Add(rd);

                    // have the control itself
                    var sc = si.subControl;

                    Grid.SetRow(sc, ri);
                    Grid.SetColumn(sc, 0);
                    GridInner.Children.Add(sc);

                    if (this.showButtonsMinus)
                    {
                        // make a button like the "-"
                        var bt = CreateButtonLike(ButtonInstancePlus, content: "&#10134;");
                        bt.VerticalAlignment = VerticalAlignment.Top;
                        bt.Content           = "\u2796";

                        if (inst.workingDesc != null && inst.workingDesc is FormDescSubmodelElementCollection)
                        {
                            bt.Margin = new Thickness(
                                bt.Margin.Left, bt.Margin.Top + 6, bt.Margin.Right, bt.Margin.Bottom);
                        }

                        bt.SetBinding(
                            Button.WidthProperty, CreateBindingWithElementName("ActualWidth", "ButtonInstancePlus"));
                        bt.SetBinding(
                            Button.HeightProperty, CreateBindingWithElementName("ActualHeight", "ButtonInstancePlus"));

                        // remeber the instances
                        var masterInst = inst;
                        var subInst    = si;

                        // attach the lambda
                        bt.Click += (object sender, RoutedEventArgs e) =>
                        {
                            if (inst.SubInstances.Count > this.minRows)
                            {
                                // carefully delete
                                try
                                {
                                    masterInst.SubInstances.Remove(subInst);
                                }
                                catch (Exception ex)
                                {
                                    AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex);
                                }

                                // redraw
                                UpdateDisplay();
                            }
                        };

                        Grid.SetRow(bt, ri);
                        Grid.SetColumn(bt, 1);
                        GridInner.Children.Add(bt);
                    }
                    else
                    {
                        // give the subcontrol a little more room
                        Grid.SetColumnSpan(sc, 2);
                    }

                    // next row
                    ri++;
                }
            }
        }
コード例 #5
0
        /// <summary>
        /// Render the form description and adds or updates its instances into a list of SubmodelElements.
        /// </summary>
        public AdminShell.SubmodelElementWrapperCollection AddOrUpdateSameElementsToCollection(
            AdminShell.SubmodelElementWrapperCollection elements, AdminShellPackageEnv packageEnv = null,
            bool addFilesToPackage = false)
        {
            // access
            var res = new AdminShell.SubmodelElementWrapperCollection();

            if (this.SubInstances == null || this.workingDesc == null)
            {
                return(null);
            }

            // over all instances
            foreach (var ins in this.SubInstances)
            {
                // access
                if (!(ins is FormInstanceSubmodelElement))
                {
                    continue;
                }

                // only touched?
                if (!(ins is FormInstanceSubmodelElementCollection) && !ins.Touched)
                {
                    continue;
                }

                // this is not very nice: distinguish between SMECs und SMEs
                if (!(this.workingDesc is FormDescSubmodelElementCollection))
                {
                    var lst1 = (ins as FormInstanceSubmodelElement).AddOrUpdateSmeToCollection(
                        elements, packageEnv, addFilesToPackage);

                    // for monitoring purpose
                    res.AddRange(lst1);
                }
                else
                {
                    // Special case: SMEC

                    // the Same-Instance was already prepared, however it needs to be eventually
                    // filled with the new elements
                    var smecInst   = ins as FormInstanceSubmodelElementCollection;
                    var sourceSmec = smecInst?.sourceSme as AdminShell.SubmodelElementCollection;

                    AdminShell.SubmodelElementWrapperCollection newElems = null;
                    bool addMode = false;
                    if (sourceSmec == null)
                    {
                        // will become a NEW SMEC !
                        newElems = new AdminShell.SubmodelElementWrapperCollection();
                        addMode  = true;
                    }
                    else
                    {
                        // will be added to an existing SMEC
                        newElems = sourceSmec.value;
                        addMode  = false;
                    }

                    var lst = (ins as FormInstanceSubmodelElement).AddOrUpdateSmeToCollection(
                        newElems, packageEnv, addFilesToPackage);

                    if (newElems != null && newElems.Count > 0)
                    {
                        var smec = smecInst?.sme as AdminShell.SubmodelElementCollection;

                        // really add a new instances of the SMEC
                        if (addMode && smecInst != null && smec != null)
                        {
                            // add
                            if (smec.value == null)
                            {
                                smec.value = new AdminShellV20.SubmodelElementWrapperCollection();
                            }
                            smec.value.AddRange(newElems);

                            // make smec unique
                            FormInstanceHelper.MakeIdShortUnique(elements, smec);

                            // to (outer) elements
                            elements.Add(smec);
                        }

                        // for monitoring purpose
                        res.AddRange(lst);
                    }
                }
            }

            // now, check if original SMEs are missing in the Instances and have therefore be removed
            // (kind of post-mortem analysis)
            if (this.InitialSourceElements != null)
            {
                foreach (var ise in this.InitialSourceElements)
                {
                    // exclude trivial cases
                    if (ise == null)
                    {
                        continue;
                    }

                    // manually search
                    var found = false;
                    foreach (var ins in this.SubInstances)
                    {
                        if (ins != null && ins is FormInstanceSubmodelElement &&
                            (ins as FormInstanceSubmodelElement).sourceSme == ise)
                        {
                            found = true;
                        }
                    }

                    // if not foudnd, DELETE original element
                    if (!found)
                    {
                        elements.Remove(ise);
                    }
                }
            }

            // ok
            return(res);
        }