// Copyright (C) Stichting Deltares 2016. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; using Core.Common.Base.IO; using Core.Common.Controls.Views; using Core.Common.Gui.Forms; using Core.Common.Gui.Properties; using log4net; namespace Core.Common.Gui { public class GuiExportHandler { private static readonly ILog log = LogManager.GetLogger(typeof(GuiExportHandler)); private static readonly Bitmap brickImage = Resources.brick; private readonly IWin32Window dialogParent; // TODO: refactor it, remove Funcs - too complicated design, initialize exporters in a different way public GuiExportHandler(IWin32Window dialogParent, Func> fileExportersGetter, Func viewGetter) { this.dialogParent = dialogParent; FileExportersGetter = fileExportersGetter; ViewGetter = viewGetter; } public void ExportFrom(object item) { var exporter = GetSupportedExporterForItemUsingDialog(item); if (exporter == null) { return; } GetExporterDialog(exporter, item); } public void GetExporterDialog(IFileExporter exporter, object selectedItem) { ExporterItemUsingFileOpenDialog(exporter, selectedItem); } private Func> FileExportersGetter { get; set; } private Func ViewGetter { get; set; } private IFileExporter GetSupportedExporterForItemUsingDialog(object itemToExport) { var sourceType = itemToExport.GetType(); var selectExporterDialog = new SelectItemDialog(dialogParent); var fileExporters = FileExportersGetter(itemToExport); //if there is only one available exporter use that. if (!fileExporters.Any()) { MessageBox.Show(Resources.GuiExportHandler_GetSupportedExporterForItemUsingDialog_No_exporter_for_this_item_available); log.Warn(String.Format(Resources.GuiExportHandler_GetSupportedExporterForItemUsingDialog_No_exporter_for_this_item_0_available, sourceType)); return null; } //if there is only one available exporter use that. if (fileExporters.Count() == 1) { return fileExporters.ElementAt(0); } foreach (var fileExporter in fileExporters) { selectExporterDialog.AddItemType(fileExporter.Name, fileExporter.Category, fileExporter.Image ?? brickImage, null); } if (selectExporterDialog.ShowDialog() == DialogResult.OK) { return fileExporters.First(i => i.Name == selectExporterDialog.SelectedItemTypeName); } return null; } private void ExporterItemUsingFileOpenDialog(IFileExporter exporter, object item) { log.Info(Resources.GuiExportHandler_ExporterItemUsingFileOpenDialog_Start_exporting); var windowTitle = string.Format(Resources.GuiExportHandler_ExporterItemUsingFileOpenDialog_Select_a_DataType_0_file_to_export_to, exporter.Name); var saveFileDialog = new SaveFileDialog { Filter = exporter.FileFilter, Title = windowTitle, FilterIndex = 2 }; if (saveFileDialog.ShowDialog(dialogParent) == DialogResult.OK) { if (exporter.Export(item, saveFileDialog.FileName)) { log.Info(Resources.GuiExportHandler_ExporterItemUsingFileOpenDialog_Finished_exporting); } else { log.Warn(Resources.GuiExportHandler_ExporterItemUsingFileOpenDialog_Export_failed); } } } } }