GDROMExplorer/Explorer/UserControls/DiscViewOpener.cs

306 lines
13 KiB
C#

// Decompiled with JetBrains decompiler
// Type: GDRomExplorer.UserControls.DiscViewOpener
// Assembly: GD-ROM Explorer, Version=1.6.3.0, Culture=neutral, PublicKeyToken=611be24fdeb07e08
// MVID: B7A7D10A-9A63-4E9E-9840-D297E5FC2219
// Assembly location: GD-ROM Explorer.exe
using GDRomExplorer.Events;
using GDRomExplorer.Forms;
using GDRomExplorer.Properties;
using GDRomExplorer.Resources;
using ImageReader.DiscFileSystem;
using SEGATools.Disc;
using SEGATools.DiscFileSystem;
using SEGATools.FileFormat;
using SEGATools.Security;
using SEGATools.UserProcess;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace GDRomExplorer.UserControls
{
public class DiscViewOpener : UserControl
{
private static readonly Logger.ILog logger = Logger.CreateLog();
private FormLoading formLoading;
private List<string> fileDialogIncludeFilters = new List<string>();
private string SelectedDiscImage;
private bool notifyStatusEvents;
private IContainer components;
private TableLayoutPanel tableLayoutPanel;
private Button btOpen;
private TextBox tbDiscImageFile;
private GroupBox groupBox;
private DiscOpener discOpener;
private DiscFormatProvider discFormatProvider;
private OpenFileDialog openFileDialog;
public event EventHandler<EventArgs<IDiscFileSystem>> ImageLoaded;
public event EventHandler ImageNotLoaded;
[Description("Specifies the text of the group box.")]
[Category("Appearance")]
[Browsable(true)]
public override string Text
{
get => this.groupBox.Text;
set => this.groupBox.Text = value;
}
[Description("Specifies the text of the open button.")]
[Category("Appearance")]
[Browsable(true)]
public string ButtonText
{
get => this.btOpen.Text;
set => this.btOpen.Text = value;
}
[Browsable(true)]
[Description("Indicates the initial directory for the OpenFileDialog.")]
[Category("Behavior")]
public string InitialDirectory
{
get => this.openFileDialog.InitialDirectory;
set => this.openFileDialog.InitialDirectory = value;
}
[Description("Indicates whether the control should notify the application status bar control.")]
[Category("Behavior")]
[Browsable(true)]
public bool NotifyStatusEvents
{
get => this.notifyStatusEvents;
set => this.notifyStatusEvents = value;
}
[Category("Behavior")]
[Description("Restrict the list of valid file extensions.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Browsable(true)]
[Editor("System.Windows.Forms.Design.StringCollectionEditor, System.Design", "System.Drawing.Design.UITypeEditor, System.Drawing")]
public List<string> FileDialogFilters
{
get => this.fileDialogIncludeFilters;
set => this.fileDialogIncludeFilters = value;
}
public DiscViewOpener()
{
this.InitializeComponent();
this.btOpen.Text = Strings.DiscViewOpenerButtonOpen;
this.groupBox.Text = Strings.DiscViewOpenerLabel + (object) ':';
this.openFileDialog.Title = Strings.DiscViewOpenerFileDialogTitle;
this.discOpener = new DiscOpener();
}
public void SetLoadedDiscImage(IDiscFileSystem discFileSystem)
{
string message = string.Format(Strings.StatusLabelImageLoaded, (object) discFileSystem.FileName);
DiscViewOpener.logger.InfoFormat("Image successfully opened: {0}", (object) discFileSystem.FileName);
this.tbDiscImageFile.Text = discFileSystem.FileName;
this.tbDiscImageFile.BackColor = SystemColors.Window;
if (this.ImageLoaded != null)
this.ImageLoaded((object) this, new EventArgs<IDiscFileSystem>(discFileSystem));
this.NotifyNewAppStatus(message);
}
public void Open()
{
this.openFileDialog.Filter = this.discFormatProvider.GetFileDialogFilters(this.FileDialogFilters != null ? this.FileDialogFilters.ToArray() : (string[]) null);
if (this.openFileDialog.ShowDialog() != DialogResult.OK)
return;
this.Open(this.openFileDialog.FileName);
}
public void Open(string FileName)
{
if (!File.Exists(FileName))
{
DiscViewOpener.logger.ErrorFormat("File not found {0}", (object) FileName);
string str = string.Format(Strings.MsgBoxImageOpenerFileNotFoundErrorWithFormat, (object) Path.GetFullPath(FileName));
int num = (int) MessageBox.Show((IWin32Window) this, str, Strings.MsgBoxImageOpenerTitle, MessageBoxButtons.OK, MessageBoxIcon.Hand);
this.NotifyNewAppStatus(str);
this.Close();
}
else
{
string extension = Path.GetExtension(FileName);
if (!this.discFormatProvider.IsFileExtensionSupported(extension))
{
DiscViewOpener.logger.ErrorFormat("Not supported file extension for file {0}", (object) FileName);
string str = string.Format(Strings.MsgBoxImageOpenerBadFileExtensionErrorWithFormat, (object) Path.GetExtension(FileName));
int num = (int) MessageBox.Show((IWin32Window) this, str, Strings.MsgBoxImageOpenerTitle, MessageBoxButtons.OK, MessageBoxIcon.Hand);
this.NotifyNewAppStatus(str);
this.Close();
}
else
{
this.SelectedDiscImage = FileName;
IImageFileFormat forFileExtension = this.discFormatProvider.FindImageFileFormatForFileExtension(extension);
this.openFileDialog.InitialDirectory = Path.GetDirectoryName(this.SelectedDiscImage);
this.openFileDialog.FileName = Path.GetFileName(this.SelectedDiscImage);
if (this.openFileDialog.FilterIndex > 1)
this.openFileDialog.FilterIndex = this.discFormatProvider.GetFileFormatIndex(forFileExtension);
this.formLoading = new FormLoading(Strings.DiscViewOpenerImageLoadingTitle, Strings.DiscViewOpenerImageLoadingMessage);
this.discOpener.FileOpenerProgressChanged += new AsyncOperationProgressChangedEventHandler(this.GDRomFileSystem_GDRomImageOpenProgressChanged);
this.discOpener.FileOpenerCompleted += new AsyncOperationCompletedEventHandler(this.GDRomFileSystem_GDRomImageOpenCompleted);
this.discOpener.OpenImageAsync(this.SelectedDiscImage, forFileExtension.ImageFileConverter, Settings.Default.ImageReaderComputePathTable);
}
}
}
public void Close()
{
this.tbDiscImageFile.Text = string.Empty;
this.tbDiscImageFile.BackColor = SystemColors.Menu;
this.SelectedDiscImage = string.Empty;
this.discOpener.CloseImage();
if (this.ImageNotLoaded == null)
return;
this.ImageNotLoaded((object) this, new EventArgs());
}
private void btOpen_Click(object sender, EventArgs e) => this.Open();
private void NotifyNewAppStatus(string message)
{
if (!this.NotifyStatusEvents)
return;
AppStatus.NotifyNewAppStatus(message);
}
private string GetErrorMessage(Exception e)
{
switch (e)
{
case DiscFileSystemException _:
return string.Format(Strings.StatusLabelImageError, (object) Strings.DiscViewOpenerNoFileSystemError);
case InitialProgramException _:
return string.Format(Strings.StatusLabelImageError, (object) string.Format(Strings.DiscViewOpenerInvalidInitialProgram, (object) e.Message));
case DiscFormatException _:
return string.Format(Strings.StatusLabelImageError, (object) e.Message);
default:
return string.Format(Strings.StatusLabelImageError, (object) Strings.DiscViewOpenerUnknownError);
}
}
private void GDRomFileSystem_GDRomImageOpenCompleted(
object sender,
UserProcessCompletedEventArgs e)
{
this.formLoading.Close();
this.formLoading = (FormLoading) null;
this.discOpener.FileOpenerProgressChanged -= new AsyncOperationProgressChangedEventHandler(this.GDRomFileSystem_GDRomImageOpenProgressChanged);
this.discOpener.FileOpenerCompleted -= new AsyncOperationCompletedEventHandler(this.GDRomFileSystem_GDRomImageOpenCompleted);
if (e.Error != null)
{
string errorMessage = this.GetErrorMessage(e.Error);
DiscViewOpener.logger.ErrorFormat("Unable to open image {0}: {1}", (object) e.ResourceName, (object) e.Error);
int num = (int) MessageBox.Show((IWin32Window) this, errorMessage, Strings.MsgBoxImageOpenerTitle, MessageBoxButtons.OK, MessageBoxIcon.Hand);
this.NotifyNewAppStatus(errorMessage);
this.Close();
}
else
this.SetLoadedDiscImage(this.discOpener.DiscFileSystem);
}
private void GDRomFileSystem_GDRomImageOpenProgressChanged(UserProcessProgressChangedEventArgs e)
{
if (this.formLoading.Visible)
return;
int num = (int) this.formLoading.ShowDialog((IWin32Window) this);
}
protected override void Dispose(bool disposing)
{
if (disposing && this.components != null)
this.components.Dispose();
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.components = (IContainer) new Container();
this.tableLayoutPanel = new TableLayoutPanel();
this.tbDiscImageFile = new TextBox();
this.btOpen = new Button();
this.groupBox = new GroupBox();
this.openFileDialog = new OpenFileDialog();
this.discOpener = new DiscOpener(this.components);
this.discFormatProvider = new DiscFormatProvider(this.components);
this.tableLayoutPanel.SuspendLayout();
this.groupBox.SuspendLayout();
this.SuspendLayout();
this.tableLayoutPanel.AutoSize = true;
this.tableLayoutPanel.ColumnCount = 2;
this.tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100f));
this.tableLayoutPanel.ColumnStyles.Add(new ColumnStyle());
this.tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 20f));
this.tableLayoutPanel.Controls.Add((Control) this.tbDiscImageFile, 0, 0);
this.tableLayoutPanel.Controls.Add((Control) this.btOpen, 1, 0);
this.tableLayoutPanel.Dock = DockStyle.Fill;
this.tableLayoutPanel.Location = new Point(3, 16);
this.tableLayoutPanel.Margin = new Padding(0);
this.tableLayoutPanel.Name = "tableLayoutPanel";
this.tableLayoutPanel.RowCount = 1;
this.tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100f));
this.tableLayoutPanel.Size = new Size(762, 31);
this.tableLayoutPanel.TabIndex = 0;
this.tbDiscImageFile.BackColor = Color.White;
this.tbDiscImageFile.Dock = DockStyle.Fill;
this.tbDiscImageFile.HideSelection = false;
this.tbDiscImageFile.Location = new Point(3, 3);
this.tbDiscImageFile.Name = "tbDiscImageFile";
this.tbDiscImageFile.ReadOnly = true;
this.tbDiscImageFile.Size = new Size(670, 20);
this.tbDiscImageFile.TabIndex = 1;
this.tbDiscImageFile.TabStop = false;
this.tbDiscImageFile.WordWrap = false;
this.btOpen.Anchor = AnchorStyles.Top | AnchorStyles.Right;
this.btOpen.AutoSize = true;
this.btOpen.FlatStyle = FlatStyle.Popup;
this.btOpen.Font = new Font("Microsoft Sans Serif", 8.25f, FontStyle.Regular, GraphicsUnit.Point, (byte) 0);
this.btOpen.ForeColor = Color.FromArgb(248, 48, 0);
this.btOpen.Location = new Point(679, 1);
this.btOpen.Margin = new Padding(3, 1, 3, 3);
this.btOpen.Name = "btOpen";
this.btOpen.Size = new Size(80, 24);
this.btOpen.TabIndex = 2;
this.btOpen.Text = "&Open";
this.btOpen.UseVisualStyleBackColor = false;
this.btOpen.Click += new EventHandler(this.btOpen_Click);
this.groupBox.BackColor = SystemColors.Window;
this.groupBox.Controls.Add((Control) this.tableLayoutPanel);
this.groupBox.Dock = DockStyle.Fill;
this.groupBox.Location = new Point(4, 4);
this.groupBox.Margin = new Padding(0);
this.groupBox.MaximumSize = new Size(0, 50);
this.groupBox.MinimumSize = new Size(0, 50);
this.groupBox.Name = "groupBox";
this.groupBox.Size = new Size(768, 50);
this.groupBox.TabIndex = 0;
this.groupBox.TabStop = false;
this.groupBox.Text = "disc image";
this.AutoScaleDimensions = new SizeF(6f, 13f);
this.AutoScaleMode = AutoScaleMode.Font;
this.AutoSize = true;
this.Controls.Add((Control) this.groupBox);
this.Name = nameof (DiscViewOpener);
this.Padding = new Padding(4);
this.Size = new Size(776, 55);
this.tableLayoutPanel.ResumeLayout(false);
this.tableLayoutPanel.PerformLayout();
this.groupBox.ResumeLayout(false);
this.groupBox.PerformLayout();
this.ResumeLayout(false);
}
}
}