using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Forms.Design; using FastReport.Editor.Syntax; using InABox.Core; using InABox.Wpf; using Microsoft.Win32; namespace InABox.DynamicGrid { /// /// Interaction logic for DynamicImportForm.xaml /// public partial class DynamicImportForm : ThemableWindow { private Type _entitytype; private ImportDefinition _importdefinition; private readonly Importer _importer; private bool bLoading; public DynamicImportForm(Importer importer) { _importer = importer; InitializeComponent(); LoadData(); CheckOKButton(); } private void LoadData() { bLoading = true; _entitytype = CoreUtils.GetEntity(_importer.EntityName); _importdefinition = ImportFactory.Definitions.FirstOrDefault(x => x.Description.Equals(_importer.ImporterDescription)); var _mappings = string.IsNullOrWhiteSpace(_importer.Definition) ? new List() : Serialization.Deserialize>(_importer.Definition); Name.Text = _importer.Description; Type.ItemsSource = ImportFactory.Definitions; Type.SelectedValue = _importdefinition; HasHeader.IsChecked = _importer.HasHeader; HeaderRow.Value = Math.Max(1, _importer.HeaderRows); ColumnWidths.Text = _importer.ColumnWidths; FileName.Text = _importer.FileName; var mappings = ImportFactory.ExtractMappings(_entitytype, ImportMappingType.Import); Mappings.Items.AddRange(mappings); var key = mappings.FirstOrDefault(x => x.Key.Equals(true)); if (key != null) { key.Key = false; Mappings.UniqueCode = key.Property; } else { Mappings.UniqueCode = ""; } foreach (var custom in _mappings) { var mapping = Mappings.Items.FirstOrDefault(x => string.Equals(x.Property, custom.Property)); if (mapping != null) { mapping.Key = custom.Key; mapping.Field = custom.Field; mapping.Constant = custom.Constant; mapping.Lookup = custom.Lookup; } } ImportFieldGenerator.Fields = Array.Empty(); if (File.Exists(FileName.Text) && Type.SelectedValue as ImportDefinition != null) OpenFile(FileName.Text); else Mappings.Refresh(true, true); bLoading = false; } private void OpenFile(string filename) { if(Type.SelectedValue is not ImportDefinition definition) { return; } var importer = ImportFactory.Create(definition, _entitytype, _importer); try { using (var stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) { if (importer.Open(stream) && importer.ReadHeader()) { FileName.Text = filename; ImportFieldGenerator.Fields = importer.Fields; Mappings.Refresh(true, true); } else { MessageBox.Show(string.Format("{0} is not a valid file!", filename)); } } } catch (Exception e) { MessageBox.Show(string.Format("Unable to open {0}!\n\n{1}", filename, e.Message)); } } private void Open_Click(object sender, RoutedEventArgs e) { var type = Type.SelectedValue as ImportDefinition; if (type == null) { MessageBox.Show(string.Format("Type is unexpected: {0}", type)); return; } var dlg = new OpenFileDialog(); dlg.Filter = type.Filter; var sFile = FileName.Text; if (!string.IsNullOrWhiteSpace(sFile)) { dlg.FileName = sFile; var sFolder = string.IsNullOrWhiteSpace(sFile) ? Path.GetDirectoryName(sFile) : ""; if (!string.IsNullOrWhiteSpace(sFolder) && Directory.Exists(sFolder)) dlg.InitialDirectory = sFolder; } if (dlg.ShowDialog() == true) if (File.Exists(dlg.FileName) && Type.SelectedValue as ImportDefinition != null) OpenFile(dlg.FileName); CheckOKButton(); } private void HeaderRow_Checked(object sender, RoutedEventArgs e) { HeaderRowLabel.Visibility = HasHeader.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; HeaderRow.Visibility = HasHeader.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; } private void HeaderRow_ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (!bLoading) _importer.HeaderRows = HeaderRow.Value.HasValue ? (int)HeaderRow.Value : 1; if (File.Exists(FileName.Text) && Type.SelectedValue as ImportDefinition != null) OpenFile(FileName.Text); CheckOKButton(); } private void OpenTypeSettings() { if(Type.SelectedValue is not ImportDefinition definition) { return; } var tSettings = definition.Type.GetInterfaceDefinition(typeof(ISettingsImporter<>))?.GenericTypeArguments[0]; if(tSettings is null) { return; } object? settings = null; if (!_importer.Settings.IsNullOrWhiteSpace()) { settings = Serialization.Deserialize(tSettings, _importer.Settings); } settings ??= Activator.CreateInstance(tSettings)!; var grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicGrid<>), tSettings); if(grid.EditItems(new object[] { settings })) { _importer.Settings = Serialization.Serialize(settings); } } private void TypeSettings_Click(object sender, RoutedEventArgs e) { OpenTypeSettings(); if (File.Exists(FileName.Text)) OpenFile(FileName.Text); } private void Type_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (!bLoading) _importdefinition = e.AddedItems.Count > 0 ? e.AddedItems[0] as ImportDefinition : null; Open.IsEnabled = _importdefinition != null; ColumnWidthsLabel.Visibility = _importdefinition != null && _importdefinition.Type == typeof(FixedWidthImporter<>) ? Visibility.Visible : Visibility.Hidden; ColumnWidths.Visibility = _importdefinition != null && _importdefinition.Type == typeof(FixedWidthImporter<>) ? Visibility.Visible : Visibility.Hidden; TypeSettings.IsEnabled = false; if (Type.SelectedValue is ImportDefinition definition) { if (definition.Type.HasInterface()) { TypeSettings.IsEnabled = true; if (!bLoading) { OpenTypeSettings(); } } if (File.Exists(FileName.Text)) OpenFile(FileName.Text); } CheckOKButton(); } private void HideBlank_Click(object sender, RoutedEventArgs e) { Mappings.HideBlank = !Mappings.HideBlank; HideBlank.Content = Mappings.HideBlank ? "Show All" : "Hide Blank"; Mappings.Refresh(false, true); } private void Match_Click(object sender, RoutedEventArgs e) { Mappings.MatchFields(); } private void Reset_Click(object sender, RoutedEventArgs e) { Mappings.Reset(); } private void Cancel_Click(object sender, RoutedEventArgs e) { DialogResult = false; } private void OK_Click(object sender, RoutedEventArgs e) { var bOK = true; if (!Mappings.Items.Any(x => x.Key)) bOK = MessageBox.Show( "There are no keys defined - this import will ALWAYS create new items\ninstead of updating existing items.\n\nAre you sure you wish to do this?", "No Keys Defined", MessageBoxButton.YesNo) == MessageBoxResult.Yes; if (bOK) { UnloadData(); DialogResult = true; } } private void UnloadData() { _importer.EntityName = _entitytype.EntityName(); _importer.ImporterDescription = _importdefinition != null ? _importdefinition.Description : ""; _importer.Definition = Serialization.Serialize(Mappings.Items.Where(x => !string.IsNullOrWhiteSpace(x.Field) || !string.IsNullOrWhiteSpace(x.Constant)), true); _importer.Description = Name.Text; _importer.FileName = FileName.Text; } private void Name_TextChanged(object sender, TextChangedEventArgs e) { CheckOKButton(); } private void CheckOKButton() { OK.IsEnabled = !string.IsNullOrWhiteSpace(Name.Text) && _importdefinition != null && !string.IsNullOrWhiteSpace(FileName.Text); } private int[] ExtractColumnWidths() { if (string.IsNullOrWhiteSpace(ColumnWidths.Text)) return new[] { 1024 }; try { return ColumnWidths.Text.Split(',').Select(x => int.Parse(x)).ToArray(); } catch { return new[] { 1024 }; } } private void ColumnWidths_TextChanged(object sender, TextChangedEventArgs e) { if (!bLoading) _importer.ColumnWidths = ColumnWidths.Text; if (File.Exists(FileName.Text) && Type.SelectedValue as ImportDefinition != null) OpenFile(FileName.Text); } private void EditScript_Click(object sender, RoutedEventArgs e) { if (string.IsNullOrWhiteSpace(_importer.Script)) _importer.Script = "using System;\r\n" + "using System.Collections.Generic;\r\n" + "using System.Linq;\r\n" + "using System.Runtime;\r\n" + "using System.Windows;\r\n" + "using System.Windows.Media;\r\n" + "using InABox.Core;\r\n" + "using Comal.Classes;\r\n" + "\r\n" + "public class Module\r\n" + "{\r\n" + "\r\n" + " public bool BeforeProcess(Dictionary values)\r\n" + " {\r\n" + " return true;\r\n" + " }\r\n" + "\r\n" + " public void AfterProcess(" + _entitytype.Name + " item, Dictionary values)\r\n" + " {\r\n" + " return true;\r\n" + " }\r\n" + "\r\n" + "}"; var editor = new ScriptEditorWindow(_importer.Script); if (editor.ShowDialog() == true) _importer.Script = editor.Script; } private void Save_Click(object sender, RoutedEventArgs e) { var dlg = new SaveFileDialog(); dlg.Filter = string.Format("{0} Import Files (*.{1}import)|*.{1}import", _entitytype.Name, _entitytype.Name.ToLower()); dlg.FileName = string.Format("{0}.{1}import", Name.Text, _entitytype.Name.ToLower()); if (dlg.ShowDialog() == true) try { UnloadData(); var json = Serialization.Serialize(_importer, true); File.WriteAllText(dlg.FileName, json); } catch (Exception e2) { MessageBox.Show("Error saving import definition!\n\n" + e2.Message); } } private void Load_Click(object sender, RoutedEventArgs e) { var dlg = new OpenFileDialog(); dlg.Filter = string.Format("{0} Import Files (*.{1}import)|*.{1}import", _entitytype.Name, _entitytype.Name.ToLower()); if (dlg.ShowDialog() == true) { Mappings.Items.Clear(); var json = File.ReadAllText(dlg.FileName); var id = _importer.ID; var entityid = _importer.EntityID; Serialization.DeserializeInto(json, _importer); _importer.ID = id; _importer.EntityID = entityid; LoadData(); } CheckOKButton(); } } }