using C4IT.FASD.Base; using FasdDesktopUi.Basics.Enums; using FasdDesktopUi.Basics.Models; using FasdDesktopUi.Basics.UiActions; using Microsoft.Win32; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using static C4IT.Logging.cLogManager; namespace FasdDesktopUi.Basics.Helper { internal class MenuItemDataProvider { private readonly cSupportCaseDataProvider _dataProvider; private const int defaultPinnedActionCount = 3; //search, notepad, copyTicketInformation public MenuItemDataProvider(cSupportCaseDataProvider dataProvider) { _dataProvider = dataProvider; } public List GetMenuItemData() { var CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); List menuItemData = new List(); try { foreach (var menuItemConfig in cF4SDCockpitXmlConfig.Instance.MenuItems.Values) { cMenuDataBase menuItem = GetMenuItem(menuItemConfig); if (menuItem is null) continue; int pinnedIndex = cF4SDCockpitXmlConfig.Instance.HealthCardConfig.QuickActionsPinned.IndexOf(menuItemConfig.Name); if (pinnedIndex > -1) pinnedIndex += defaultPinnedActionCount; menuItem.IconPositionIndex = pinnedIndex; menuItemData.Add(menuItem); } FillMenuSection(menuItemData); } catch (Exception E) { LogException(E); } finally { LogMethodEnd(CM); } return menuItemData; } private cMenuDataBase GetMenuItem(cFasdBaseConfigMenuItem menuItemConfig) { try { cMenuDataBase menuItem = null; switch (menuItemConfig) { case cFasdQuickTip quickTip: menuItem = GetQuickTipMenuItem(quickTip); break; case cFasdQuickAction quickAction: menuItem = GetQuickActionMenuItem(quickAction); break; case cFasdMenuSection section: menuItem = GetSectionMenuItem(section); break; case cCopyTemplate copyTemplate: menuItem = GetCopyTemplateMenuItem(copyTemplate); break; } if (menuItem != null) { if (!cHealthCardDataHelper.IsUiVisible(menuItemConfig, _dataProvider.NamedParameterEntries)) menuItem.SetUiActionDisplayType(enumActionDisplayType.hidden); } return menuItem; } catch (Exception E) { LogException(E); } return null; } private cMenuDataBase GetCopyTemplateMenuItem(cCopyTemplate copyTemplate) { cMenuDataBase menuItem = new cMenuDataBase(copyTemplate); enumActionDisplayType displayType = HasRequiredInformationClasses(copyTemplate.InformationClasses) ? enumActionDisplayType.enabled : enumActionDisplayType.disabled; menuItem.SetUiActionDisplayType(displayType); return menuItem; } private cMenuDataBase GetSectionMenuItem(cFasdMenuSection section) { return new cMenuDataContainer(section); } private cMenuDataBase GetQuickActionMenuItem(cFasdQuickAction quickAction) { cMenuDataBase menuItem = new cMenuDataBase(quickAction); enumActionDisplayType displayType = HasAllRequirements(quickAction) ? enumActionDisplayType.enabled : enumActionDisplayType.disabled; menuItem.SetUiActionDisplayType(displayType); return menuItem; } private cMenuDataBase GetQuickTipMenuItem(cFasdQuickTip quickTip) { return new cMenuDataBase(quickTip); //TODO: Quick Actions einfügen //TODO: DisplayType prüfen + setzen } private bool HasRequiredInformationClasses(List required) { return !(required.Any(informationClass => _dataProvider?.Identities?.Any(identity => identity.Class == informationClass) == false)); } private bool HasAllRequirements(cFasdQuickAction quickAction) { try { if (!HasRequiredInformationClasses(quickAction.InformationClasses)) return false; // if CheckNamedParamter the value of NamedParameter is set and if required equals one of the necessary values bool hasRequiredNamedParameter = quickAction.CheckNamedParameter is null || (_dataProvider.NamedParameterEntries.TryGetValue(quickAction.CheckNamedParameter, out var namedParameterEntry) && (quickAction.CheckNamedParameterValues is null || quickAction.CheckNamedParameterValues.Count == 0 || quickAction.CheckNamedParameterValues.Contains(namedParameterEntry.GetValue()))); if (!hasRequiredNamedParameter) return false; if (quickAction.CheckFilePath != null && !HasRequiredFilePath(quickAction.CheckFilePath)) return false; if (quickAction.CheckRegistryEntry != null && !HasRequiredRegistryEntry(quickAction.CheckRegistryEntry)) return false; return true; } catch (Exception E) { LogException(E); } return false; } private bool HasRequiredFilePath(string filePath) { try { if (string.IsNullOrWhiteSpace(filePath)) { return true; } var specialFolders = Enum.GetValues(typeof(Environment.SpecialFolder)).Cast(); foreach (var specialFolder in specialFolders) { var specialFolderName = "%" + specialFolder.ToString() + "%"; var specialFolderPath = Environment.GetFolderPath(specialFolder); filePath = filePath.Replace(specialFolderName, specialFolderPath); } filePath = Environment.ExpandEnvironmentVariables(filePath); return File.Exists(filePath); } catch (Exception E) { LogException(E); } return false; } private bool HasRequiredRegistryEntry(string registryEntry) { try { if (string.IsNullOrWhiteSpace(registryEntry)) { return true; } var registryRootPath = registryEntry.Split('\\')[0]; registryEntry = registryEntry.Replace(registryRootPath, "").Remove(0, 1); switch (registryRootPath) { case "HKEY_LOCAL_MACHINE": case "HKLM": return Registry.LocalMachine.OpenSubKey(registryEntry) != null; case "HKEY_CURRENT_USER": case "HKCU": return Registry.CurrentUser.OpenSubKey(registryEntry) != null; default: return false; } } catch (Exception E) { LogException(E); } return false; } private void FillMenuSection(List menuItemData) { try { foreach (var section in menuItemData.OfType()) { List subMenuData = menuItemData.Where(data => (data?.UiAction?.DisplayType != enumActionDisplayType.hidden) && (data?.MenuSections?.Contains(section.ContainerName) ?? false)).ToList(); section.SubMenuData = subMenuData; if (section.UiAction is cSubMenuAction subMenuAction) subMenuAction.SubMenuData = subMenuData; } } catch (Exception E) { LogException(E); } } } }