/// <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); }
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; } }; } }; }
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); }
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: "➖"); 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++; } } }
/// <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); }