private void DocumentEntity_DoubleClick(DocumentEntity e) { // first check if (e == null || e.DigitalFile?.Path == null || e.DigitalFile.Path.Trim().Length < 1 || this.theEventStack == null) { return; } try { // temp input var inputFn = e.DigitalFile.Path; try { if (!inputFn.ToLower().Trim().StartsWith("http://") && !inputFn.ToLower().Trim().StartsWith("https://")) { inputFn = thePackage.MakePackageFileAvailableAsTempFile(inputFn); } } catch (Exception ex) { Log.Error(ex, "Making local file available"); } // give over to event stack var evt = new AasxPluginResultEventDisplayContentFile(); evt.fn = inputFn; evt.mimeType = e.DigitalFile.MimeType; this.theEventStack.PushEvent(evt); } catch (Exception ex) { Log.Error(ex, "when double-click"); } }
private void DocumentEntity_MenuClick(DocumentEntity e, string menuItemHeader, object tag) { // first check if (e == null || menuItemHeader == null) { return; } // what to do? if (tag == null && menuItemHeader == "Edit" && e.SourceElementsDocument != null && e.SourceElementsDocumentVersion != null) { // show the edit panel OuterTabControl.SelectedItem = TabPanelEdit; ButtonAddUpdateDoc.Content = "Update"; // make a template description for the content (remeber it) formInUpdateMode = true; updateSourceElements = e.SourceElementsDocument; var desc = theOptions.FormVdi2770; if (desc == null) { desc = DocumentShelfOptions.CreateVdi2770TemplateDesc(theOptions); } // latest version (from resources) if (e.SmVersion == DocumentEntity.SubmodelVersion.V11) { desc = DocumentShelfOptions.CreateVdi2770v11TemplateDesc(); } this.currentFormDescription = desc; // take over existing data this.currentFormInst = new FormInstanceSubmodelElementCollection(null, currentFormDescription); this.currentFormInst.PresetInstancesBasedOnSource(updateSourceElements); this.currentFormInst.outerEventStack = theEventStack; // bring it to the panel var elementsCntl = new FormListOfDifferentControl(); elementsCntl.ShowHeader = false; elementsCntl.DataContext = this.currentFormInst; ScrollViewerForm.Content = elementsCntl; #if not_yet this.currentTemplateDescription = new AasTemplateDescListOfElement(desc); this.currentTemplateDescription.ClearDynamicData(); this.currentTemplateDescription.PresetInstancesBasedOnSource(updateSourceElements); // bring it to the panel var elementsCntl = new AasTemplateListOfElementControl(); elementsCntl.DataContext = this.currentTemplateDescription; ScrollViewerForm.Content = elementsCntl; #endif // OK return; } if (tag == null && menuItemHeader == "Delete" && e.SourceElementsDocument != null && e.SourceElementsDocumentVersion != null && theSubmodel?.submodelElements != null && theOptions != null) { // the source elements need to match a Document foreach (var smcDoc in theSubmodel.submodelElements.FindAllSemanticIdAs <AdminShell.SubmodelElementCollection>( theOptions?.SemIdDocument)) { if (smcDoc?.value == e.SourceElementsDocument) { // identify as well the DocumentVersion // (convert to List() because of Count() below) var allVers = e.SourceElementsDocument.FindAllSemanticIdAs <AdminShell.SubmodelElementCollection>( theOptions?.SemIdDocumentVersion).ToList(); foreach (var smcVer in allVers) { if (smcVer?.value == e.SourceElementsDocumentVersion) { // access if (smcVer == null || smcVer.value == null || smcDoc == null || smcDoc.value == null) { continue; } // ask back .. the old-fashioned way! if (MessageBoxResult.Yes != MessageBox.Show( "Delete Document?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Warning)) { return; } // confirmed! -> delete if (allVers.Count < 2) { // remove the whole document! theSubmodel.submodelElements.Remove(smcDoc); } else { // remove only the document version e.SourceElementsDocument.Remove(smcVer); } // switch back to docs // change back OuterTabControl.SelectedItem = TabPanelList; // re-display ParseSubmodelToListItems( this.theSubmodel, this.theOptions, theViewModel.TheSelectedDocClass, theViewModel.TheSelectedLanguage, theViewModel.TheSelectedListType); // re-display also in Explorer var evt = new AasxPluginResultEventRedrawAllElements(); if (theEventStack != null) { theEventStack.PushEvent(evt); } // OK return; } } // ReSharper enable PossibleMultipleEnumeration } } } // check for a document reference if (tag != null && tag is Tuple <DocumentEntity.DocRelationType, AdminShell.Reference> reltup && reltup.Item2 != null && reltup.Item2.Count > 0) { var evt = new AasxPluginResultEventNavigateToReference(); evt.targetReference = new AdminShell.Reference(reltup.Item2); this.theEventStack.PushEvent(evt); } }
private void ParseSubmodelToListItems( AdminShell.Submodel subModel, AasxPluginDocumentShelf.DocumentShelfOptions options, int selectedDocClass, AasxLanguageHelper.LangEnum selectedLanguage, ViewModel.ListType selectedListType) { try { // influence list view rendering, as well if (selectedListType == ViewModel.ListType.Bars) { ScrollMainContent.ItemTemplate = (DataTemplate)ScrollMainContent.Resources["ItemTemplateForBar"]; ScrollMainContent.ItemsPanel = (ItemsPanelTemplate)ScrollMainContent.Resources["ItemsPanelForBar"]; } if (selectedListType == ViewModel.ListType.Grid) { ScrollMainContent.ItemTemplate = (DataTemplate)ScrollMainContent.Resources["ItemTemplateForGrid"]; ScrollMainContent.ItemsPanel = (ItemsPanelTemplate)ScrollMainContent.Resources["ItemsPanelForGrid"]; } // clean table ScrollMainContent.ItemsSource = null; // access if (subModel == null || options == null) { return; } // make sure for the right Submodel var found = false; if (options.AllowSubmodelSemanticIds != null) { foreach (var x in options.AllowSubmodelSemanticIds) { if (subModel.semanticId != null && subModel.semanticId.Matches(x)) { found = true; break; } } } if (!found) { return; } // right now: hardcoded check for mdoel version var modelVersion = DocumentEntity.SubmodelVersion.Default; var defs11 = AasxPredefinedConcepts.VDI2770v11.Static; if (subModel.semanticId.Matches(defs11?.SM_ManufacturerDocumentation?.GetSemanticKey())) { modelVersion = DocumentEntity.SubmodelVersion.V11; } // what defaultLanguage string defaultLang = null; if (theViewModel != null && theViewModel.TheSelectedLanguage > AasxLanguageHelper.LangEnum.Any) { defaultLang = AasxLanguageHelper.LangEnumToISO639String[(int)theViewModel.TheSelectedLanguage]; } // make new list box items var its = new List <DocumentEntity>(); if (modelVersion != DocumentEntity.SubmodelVersion.V11) { its = ListOfDocumentEntity.ParseSubmodelForV10( thePackage, subModel, options, defaultLang, selectedDocClass, selectedLanguage); } else { its = ListOfDocumentEntity.ParseSubmodelForV11( thePackage, subModel, defs11, defaultLang, selectedDocClass, selectedLanguage); } // post process foreach (var ent in its) { // make viewbox to host __later__ created image! var vb = new Viewbox(); vb.Stretch = Stretch.Uniform; ent.ImgContainer = vb; // can already put a generated image into the viewbox? if (referableHashToCachedBitmap != null && referableHashToCachedBitmap.ContainsKey(ent.ReferableHash)) { var img = new Image(); img.Source = referableHashToCachedBitmap[ent.ReferableHash]; ent.ImgContainer.Child = img; } else { // trigger generation of image // check if already in list DocumentEntity foundDe = null; foreach (var de in theDocEntitiesToPreview) { if (ent.ReferableHash == de.ReferableHash) { foundDe = de; } } lock (theDocEntitiesToPreview) { if (foundDe != null) { theDocEntitiesToPreview.Remove(foundDe); } theDocEntitiesToPreview.Add(ent); } } // attach events and add ent.DoubleClick += DocumentEntity_DoubleClick; ent.MenuClick += DocumentEntity_MenuClick; } // finally set ScrollMainContent.ItemsSource = its; } catch (Exception ex) { Log.Error(ex, "Exception when parse/ display Submodel"); } }
private void DispatcherTimer_Tick(object sender, EventArgs e) { // each tick check for one image, if a preview shall be done if (theDocEntitiesToPreview != null && theDocEntitiesToPreview.Count > 0 && numDocEntitiesInPreview < maxDocEntitiesInPreview) { // pop DocumentEntity ent = null; lock (theDocEntitiesToPreview) { ent = theDocEntitiesToPreview[0]; theDocEntitiesToPreview.RemoveAt(0); } try { // temp input var inputFn = ent?.DigitalFile; if (inputFn != null) { // from package? if (CheckIfPackageFile(inputFn)) { inputFn = thePackage.MakePackageFileAvailableAsTempFile(ent.DigitalFile); } // temp output string outputFn = System.IO.Path.GetTempFileName().Replace(".tmp", ".png"); // remember these for later deletion ent.DeleteFilesAfterLoading = new[] { inputFn, outputFn }; // start process string arguments = string.Format("-flatten -density 75 \"{0}\"[0] \"{1}\"", inputFn, outputFn); string exeFn = System.IO.Path.Combine( System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "convert.exe"); var startInfo = new ProcessStartInfo(exeFn, arguments) { WindowStyle = ProcessWindowStyle.Hidden }; var process = new Process { StartInfo = startInfo, EnableRaisingEvents = true }; DocumentEntity lambdaEntity = ent; string outputFnBuffer = outputFn; process.Exited += (sender2, args) => { // release number of parallel processes lock (mutexDocEntitiesInPreview) { numDocEntitiesInPreview--; } // take over data? if (lambdaEntity.ImgContainer != null) { // trigger display image lambdaEntity.ImageReadyToBeLoaded = outputFnBuffer; } }; try { process.Start(); } catch (Exception ex) { AdminShellNS.LogInternally.That.Error( ex, $"Failed to start the process: {startInfo.FileName} " + $"with arguments {string.Join(" ", startInfo.Arguments)}"); } // limit the number of parallel executions lock (mutexDocEntitiesInPreview) { numDocEntitiesInPreview++; } } } catch (Exception ex) { AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); } } // over all items in order to check, if a prepared image shall be displayed foreach (var x in this.ScrollMainContent.Items) { var de = x as DocumentEntity; if (de == null) { continue; } if (de.ImageReadyToBeLoaded != null) { // never again var tempFn = de.ImageReadyToBeLoaded; de.ImageReadyToBeLoaded = null; // try load try { // convert here, as the tick-Thread in STA / UI thread var bi = new BitmapImage(new Uri(tempFn, UriKind.RelativeOrAbsolute)); var img = new Image(); img.Source = bi; de.ImgContainer.Child = img; // now delete the associated files file! if (de.DeleteFilesAfterLoading != null) { foreach (var fn in de.DeleteFilesAfterLoading) { // it is quite likely (e.g. http:// files) that the delete fails! try { File.Delete(fn); } catch (Exception ex) { AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); } } } // remember in the cache if (referableHashToCachedBitmap != null && !referableHashToCachedBitmap.ContainsKey(de.ReferableHash)) { referableHashToCachedBitmap[de.ReferableHash] = bi; } } catch (Exception ex) { AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); } } } }
private void ParseSubmodelToListItems( AdminShell.Submodel subModel, AasxPluginDocumentShelf.DocumentShelfOptions options, int selectedDocClass, ViewModel.LanguageSelection selectedLanguage, ViewModel.ListType selectedListType) { try { // influence list view rendering, as well if (selectedListType == ViewModel.ListType.Bars) { ScrollMainContent.ItemTemplate = (DataTemplate)ScrollMainContent.Resources["ItemTemplateForBar"]; ScrollMainContent.ItemsPanel = (ItemsPanelTemplate)ScrollMainContent.Resources["ItemsPanelForBar"]; } if (selectedListType == ViewModel.ListType.Grid) { ScrollMainContent.ItemTemplate = (DataTemplate)ScrollMainContent.Resources["ItemTemplateForGrid"]; ScrollMainContent.ItemsPanel = (ItemsPanelTemplate)ScrollMainContent.Resources["ItemsPanelForGrid"]; } // clean table ScrollMainContent.ItemsSource = null; // access if (subModel == null || options == null) { return; } // make sure for the right Submodel var found = false; if (options.AllowSubmodelSemanticIds != null) { foreach (var x in options.AllowSubmodelSemanticIds) { if (subModel.semanticId != null && subModel.semanticId.Matches(x)) { found = true; break; } } } if (!found) { return; } // what defaultLanguage string defaultLang = null; if (theViewModel != null && theViewModel.TheSelectedLanguage > ViewModel.LanguageSelection.All) { defaultLang = ViewModel.LanguageSelectionToISO639String[(int)theViewModel.TheSelectedLanguage]; } // set a new list var its = new List <DocumentEntity>(); // look for Documents if (subModel?.submodelElements != null) { foreach (var smcDoc in subModel.submodelElements.FindAllSemanticIdAs <AdminShell.SubmodelElementCollection>( options?.SemIdDocument)) { // access if (smcDoc == null || smcDoc.value == null) { continue; } // look immediately for DocumentVersion, as only with this there is a valid List item foreach (var smcVer in smcDoc.value.FindAllSemanticIdAs <AdminShell.SubmodelElementCollection>( options?.SemIdDocumentVersion)) { // access if (smcVer == null || smcVer.value == null) { continue; } // // try to lookup info in smcDoc and smcVer // // take the 1st title var title = "" + smcVer.value.FindFirstSemanticIdAs <AdminShell.Property>(options?.SemIdTitle)?.value; // could be also a multi-language title foreach (var mlp in smcVer.value.FindAllSemanticIdAs <AdminShell.MultiLanguageProperty>( options?.SemIdTitle)) { if (mlp.value != null) { title = mlp.value.GetDefaultStr(defaultLang); } } // have multiple opportunities for orga var orga = "" + smcVer.value.FindFirstSemanticIdAs <AdminShell.Property>( options?.SemIdOrganizationOfficialName)?.value; if (orga.Trim().Length < 1) { orga = "" + smcVer.value.FindFirstSemanticIdAs <AdminShell.Property>( options?.SemIdOrganizationName)?.value; } // class infos var classId = "" + smcDoc.value.FindFirstSemanticIdAs <AdminShell.Property>( options?.SemIdDocumentClassId)?.value; // collect country codes var countryCodesStr = new List <string>(); var countryCodesEnum = new List <ViewModel.LanguageSelection>(); foreach (var cclp in smcVer.value.FindAllSemanticIdAs <AdminShell.Property>(options?.SemIdLanguage)) { // language code var candidate = ("" + cclp.value).Trim().ToUpper(); if (candidate.Length < 1) { continue; } // convert to country codes foreach (var ev in (ViewModel.LanguageSelection[])Enum.GetValues(typeof(ViewModel.LanguageSelection))) { if (candidate == ViewModel.LanguageSelectionToISO639String[(int)ev]?.ToUpper()) { candidate = ViewModel.LanguageSelectionToISO3166String[(int)ev]?.ToUpper(); countryCodesEnum.Add(ev); } } // add countryCodesStr.Add(candidate); } // evaluate, if in selection var okDocClass = (selectedDocClass < 1 || classId == null || classId.Trim().Length < 1 || classId.Trim() .StartsWith( DefinitionsVDI2770.GetDocClass( (DefinitionsVDI2770.Vdi2770DocClass)selectedDocClass))); var okLanguage = (selectedLanguage == ViewModel.LanguageSelection.All || countryCodesEnum == null || // make only exception, if no language not all (not only the preferred // of LanguageSelectionToISO639String) are in the property countryCodesStr.Count < 1 || countryCodesEnum.Contains(selectedLanguage)); if (!okDocClass || !okLanguage) { continue; } // further info var further = ""; foreach (var fi in smcVer.value.FindAllSemanticIdAs <AdminShell.Property>( options?.SemIdDocumentVersionIdValue)) { further += "\u00b7 version: " + fi.value; } foreach (var fi in smcVer.value.FindAllSemanticIdAs <AdminShell.Property>(options?.SemIdDate)) { further += "\u00b7 date: " + fi.value; } if (further.Length > 0) { further = further.Substring(2); } // construct entity var ent = new DocumentEntity(title, orga, further, countryCodesStr.ToArray()); ent.ReferableHash = String.Format( "{0:X14} {1:X14}", thePackage.GetHashCode(), smcDoc.GetHashCode()); // for updating data, set the source elements of this document entity ent.SourceElementsDocument = smcDoc.value; ent.SourceElementsDocumentVersion = smcVer.value; // filename var fn = smcVer.value.FindFirstSemanticIdAs <AdminShell.File>( options?.SemIdDigitalFile)?.value; ent.DigitalFile = fn; // make viewbox to host __later__ created image! var vb = new Viewbox(); vb.Stretch = Stretch.Uniform; ent.ImgContainer = vb; // can already put a generated image into the viewbox? if (referableHashToCachedBitmap != null && referableHashToCachedBitmap.ContainsKey(ent.ReferableHash)) { var img = new Image(); img.Source = referableHashToCachedBitmap[ent.ReferableHash]; ent.ImgContainer.Child = img; } else { // trigger generation of image // check if already in list DocumentEntity foundDe = null; foreach (var de in theDocEntitiesToPreview) { if (ent.ReferableHash == de.ReferableHash) { foundDe = de; } } lock (theDocEntitiesToPreview) { if (foundDe != null) { theDocEntitiesToPreview.Remove(foundDe); } theDocEntitiesToPreview.Add(ent); } } // attach events and add ent.DoubleClick += DocumentEntity_DoubleClick; ent.MenuClick += DocumentEntity_MenuClick; its.Add(ent); } } } // make new list box items ScrollMainContent.ItemsSource = its; } catch (Exception ex) { Log.Error(ex, "Exception when parse/ display Submodel"); } }
private void DocumentEntity_MenuClick(DocumentEntity e, string menuItemHeader, object tag) { // first check if (e == null || menuItemHeader == null) { return; } // what to do? if (tag == null && menuItemHeader == "Edit" && e.SourceElementsDocument != null && e.SourceElementsDocumentVersion != null) { // show the edit panel OuterTabControl.SelectedItem = TabPanelEdit; ButtonAddUpdateDoc.Content = "Update"; // make a template description for the content (remeber it) formInUpdateMode = true; updateSourceElements = e.SourceElementsDocument; var desc = DocuShelfSemanticConfig.CreateVdi2770TemplateDesc(theOptions); // latest version (from resources) if (e.SmVersion == DocumentEntity.SubmodelVersion.V11) { desc = DocuShelfSemanticConfig.CreateVdi2770v11TemplateDesc(); } this.currentFormDescription = desc; // take over existing data this.currentFormInst = new FormInstanceSubmodelElementCollection(null, currentFormDescription); this.currentFormInst.PresetInstancesBasedOnSource(updateSourceElements); this.currentFormInst.outerEventStack = theEventStack; // bring it to the panel var elementsCntl = new FormListOfDifferentControl(); elementsCntl.ShowHeader = false; elementsCntl.DataContext = this.currentFormInst; ScrollViewerForm.Content = elementsCntl; // OK return; } if (tag == null && menuItemHeader == "Delete" && e.SourceElementsDocument != null && e.SourceElementsDocumentVersion != null && theSubmodel?.submodelElements != null && theOptions != null) { // the source elements need to match a Document foreach (var smcDoc in theSubmodel.submodelElements.FindAllSemanticIdAs <AdminShell.SubmodelElementCollection>( _semConfig.SemIdDocument)) { if (smcDoc?.value == e.SourceElementsDocument) { // identify as well the DocumentVersion // (convert to List() because of Count() below) var allVers = e.SourceElementsDocument.FindAllSemanticIdAs <AdminShell.SubmodelElementCollection>( _semConfig.SemIdDocumentVersion).ToList(); foreach (var smcVer in allVers) { if (smcVer?.value == e.SourceElementsDocumentVersion) { // access if (smcVer == null || smcVer.value == null || smcDoc == null || smcDoc.value == null) { continue; } // ask back .. the old-fashioned way! if (MessageBoxResult.Yes != MessageBox.Show( "Delete Document?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Warning)) { return; } // confirmed! -> delete if (allVers.Count < 2) { // remove the whole document! theSubmodel.submodelElements.Remove(smcDoc); } else { // remove only the document version e.SourceElementsDocument.Remove(smcVer); } // switch back to docs // change back OuterTabControl.SelectedItem = TabPanelList; // re-display ParseSubmodelToListItems( this.theSubmodel, this.theOptions, theViewModel.TheSelectedDocClass, theViewModel.TheSelectedLanguage, theViewModel.TheSelectedListType); // re-display also in Explorer var evt = new AasxPluginResultEventRedrawAllElements(); if (theEventStack != null) { theEventStack.PushEvent(evt); } // OK return; } } // ReSharper enable PossibleMultipleEnumeration } } } // save digital file if (tag == null && menuItemHeader == "Save file .." && e.DigitalFile?.Path.HasContent() == true) { // make a file available var inputFn = e.DigitalFile.Path; if (CheckIfPackageFile(inputFn)) { inputFn = thePackage.MakePackageFileAvailableAsTempFile(e.DigitalFile.Path); } if (!inputFn.HasContent()) { Log.Error("Error making digital file available. Aborting!"); return; } // ask for a file name var dlg = new Microsoft.Win32.SaveFileDialog(); dlg.Title = "Save digital file as .."; dlg.FileName = System.IO.Path.GetFileName(e.DigitalFile.Path); dlg.DefaultExt = "*" + System.IO.Path.GetExtension(e.DigitalFile.Path); dlg.Filter = "All files (*.*)|*.*"; if (true != dlg.ShowDialog()) { return; } // save try { File.Copy(inputFn, dlg.FileName); } catch (Exception ex) { Log.Error(ex, "while saveing digital file to user specified loacation"); } } // check for a document reference if (tag != null && tag is Tuple <DocumentEntity.DocRelationType, AdminShell.Reference> reltup && reltup.Item2 != null && reltup.Item2.Count > 0) { var evt = new AasxPluginResultEventNavigateToReference(); evt.targetReference = new AdminShell.Reference(reltup.Item2); this.theEventStack.PushEvent(evt); } }
private void ParseSubmodelToListItems( AdminShell.Submodel subModel, AasxPluginDocumentShelf.DocumentShelfOptions options, int selectedDocClass, AasxLanguageHelper.LangEnum selectedLanguage, ViewModel.ListType selectedListType) { try { // influence list view rendering, as well if (selectedListType == ViewModel.ListType.Bars) { ScrollMainContent.ItemTemplate = (DataTemplate)ScrollMainContent.Resources["ItemTemplateForBar"]; ScrollMainContent.ItemsPanel = (ItemsPanelTemplate)ScrollMainContent.Resources["ItemsPanelForBar"]; } if (selectedListType == ViewModel.ListType.Grid) { ScrollMainContent.ItemTemplate = (DataTemplate)ScrollMainContent.Resources["ItemTemplateForGrid"]; ScrollMainContent.ItemsPanel = (ItemsPanelTemplate)ScrollMainContent.Resources["ItemsPanelForGrid"]; } // clean table ScrollMainContent.ItemsSource = null; // access if (subModel?.semanticId == null || options == null) { return; } // make sure for the right Submodel DocumentShelfOptionsRecord foundRec = null; foreach (var rec in options.LookupAllIndexKey <DocumentShelfOptionsRecord>( subModel?.semanticId?.GetAsExactlyOneKey())) { foundRec = rec; } if (foundRec == null) { return; } // right now: hardcoded check for mdoel version var modelVersion = DocumentEntity.SubmodelVersion.Default; var defs11 = AasxPredefinedConcepts.VDI2770v11.Static; if (subModel.semanticId.Matches(defs11?.SM_ManufacturerDocumentation?.GetSemanticKey())) { modelVersion = DocumentEntity.SubmodelVersion.V11; } if (foundRec.ForceVersion == DocumentEntity.SubmodelVersion.V10) { modelVersion = DocumentEntity.SubmodelVersion.V10; } if (foundRec.ForceVersion == DocumentEntity.SubmodelVersion.V11) { modelVersion = DocumentEntity.SubmodelVersion.V11; } // set checkbox this.CheckBoxLatestVersion.IsChecked = modelVersion == DocumentEntity.SubmodelVersion.V11; // set usage info var useinf = foundRec.UsageInfo; TextBlockUsageInfo.Text = useinf; PanelUsageInfo.Visibility = useinf.HasContent() ? Visibility.Visible : Visibility.Collapsed; // what defaultLanguage string defaultLang = null; if (theViewModel != null && theViewModel.TheSelectedLanguage > AasxLanguageHelper.LangEnum.Any) { defaultLang = AasxLanguageHelper.LangEnumToISO639String[(int)theViewModel.TheSelectedLanguage]; } // make new list box items var its = new List <DocumentEntity>(); if (modelVersion != DocumentEntity.SubmodelVersion.V11) { its = ListOfDocumentEntity.ParseSubmodelForV10( thePackage, subModel, options, defaultLang, selectedDocClass, selectedLanguage); } else { its = ListOfDocumentEntity.ParseSubmodelForV11( thePackage, subModel, defs11, defaultLang, selectedDocClass, selectedLanguage); } // post process foreach (var ent in its) { // make viewbox to host __later__ created image! var vb = new Viewbox(); vb.Stretch = Stretch.Uniform; ent.ImgContainer = vb; // if a preview file exists, try load directly, but not interfere // we delayed load logic, as these images might get more detailed if (ent.PreviewFile?.Path?.HasContent() == true) { var inputFn = ent.PreviewFile.Path; // from package? if (CheckIfPackageFile(inputFn)) { inputFn = thePackage.MakePackageFileAvailableAsTempFile(ent.PreviewFile.Path); } ent.LoadImageFromPath(inputFn); } // delayed load logic // can already put a generated image into the viewbox? if (referableHashToCachedBitmap != null && referableHashToCachedBitmap.ContainsKey(ent.ReferableHash)) { var img = new Image(); img.Source = referableHashToCachedBitmap[ent.ReferableHash]; ent.ImgContainer.Child = img; } else { // trigger generation of image // check if already in list DocumentEntity foundDe = null; foreach (var de in theDocEntitiesToPreview) { if (ent.ReferableHash == de.ReferableHash) { foundDe = de; } } lock (theDocEntitiesToPreview) { if (foundDe != null) { theDocEntitiesToPreview.Remove(foundDe); } theDocEntitiesToPreview.Add(ent); } } // attach events and add ent.DoubleClick += DocumentEntity_DoubleClick; ent.MenuClick += DocumentEntity_MenuClick; ent.DragStart += DocumentEntity_DragStart; } // finally set ScrollMainContent.ItemsSource = its; } catch (Exception ex) { Log.Error(ex, "Exception when parse/ display Submodel"); } }