// Decompiled with JetBrains decompiler // Type: GDRomExplorer.UserControls.DiscViewExplorer // 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.DiscView; using GDRomExplorer.Events; using GDRomExplorer.Forms; using GDRomExplorer.Others; using GDRomExplorer.ShellDataTransfert; using ImageReader.ISO9660.DirectoryRecords; using ImageReader.ISO9660.VolumeDescriptors; using SEGATools.CueSheet; using SEGATools.Disc; using SEGATools.DiscFileSystem; using SEGATools.Encrypt; using SEGATools.Security; using SEGATools.SortFile; using SEGATools.VirtualFile; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; using System.Linq; using System.Windows.Forms; namespace GDRomExplorer.UserControls { public class DiscViewExplorer : UserControl { private static readonly Logger.ILog logger = Logger.CreateLog(); private IDiscFileSystem discFileSystem; private TreeNode treeNodeInListView; private Control lastControlWithFocus; private MenuItemFactory menuItemFactory; private ContextMenuManager contextMenuManager; private UserActions userActions; private ToolStripItem[] discMenuItems; private DiscSelectionHandlerFactory treeViewSelectionHandlerFactory; private DiscSelectionHandlerFactory listViewSelectionHandlerFactory; private IContainer components; private GroupBox groupBox; private SplitContainer splitContainer; private TreeView treeView; private ListView listView; private DiscExtractor discExtractor; private SaveFileDialog saveFileDialogForInitialProgram; private SaveFileDialog saveFileDialogForExtraction; private SaveFileDialog saveFileDialogForCueSheet; private SaveFileDialog saveFileDialogForSortFile; private FolderBrowserDialog folderBrowserDialogForExtraction; private SaveFileDialog saveFileDialogForDesDecrypt; private GDDAConverterTool gddaConverterTool; private ImageList treeViewImageList; private ImageList listViewImageList; private ImageList contextMenuImageList; public event EventHandler> SelectionChanged; public string Title { get => this.groupBox.Text; private set => this.groupBox.Text = string.Format(GDRomExplorer.Resources.Strings.DiscViewExplorerGroupLabelWithFormat, (object) value); } public string Filename => this.discFileSystem != null ? this.discFileSystem.FileName : string.Empty; public DiscViewExplorer() { this.InitializeComponent(); this.userActions = new UserActions(); this.userActions.SetHandler(UserActions.Action.ExportForGDEmu, new EventHandler(this.UserActionExportForGDEmu)); this.userActions.SetHandler(UserActions.Action.CreateCueSheet, new EventHandler(this.UserActionCreateCueSheet)); this.userActions.SetHandler(UserActions.Action.ShowGDDAConversion, new EventHandler(this.UserActionShowGDDAConversionForm)); this.userActions.SetHandler(UserActions.Action.ShowBootSector, new EventHandler(this.UserActionShowBootSector)); this.userActions.SetHandler(UserActions.Action.ExtractBootSector, new EventHandler(this.UserActionExtractInitialProgram)); this.userActions.SetHandler(UserActions.Action.ExtractItem, new EventHandler(this.UserActionExtractItem)); this.userActions.SetHandler(UserActions.Action.CreateSortFile, new EventHandler(this.UserActionGenerateSortFile)); this.userActions.SetHandler(UserActions.Action.ShowPrimaryVolumeDescriptor, new EventHandler(this.UserActionShowPrimaryVolumeDescriptor)); this.userActions.SetHandler(UserActions.Action.ConvertGDDA, new EventHandler(this.UserActionConvertGDDA)); this.userActions.SetHandler(UserActions.Action.DecryptNaomiBinary, new EventHandler(this.UserActionDecryptBinaryFromDisc)); this.treeViewSelectionHandlerFactory = (DiscSelectionHandlerFactory) new DiscTreeViewSelectionHandlerFactory(this, this.treeView); this.listViewSelectionHandlerFactory = (DiscSelectionHandlerFactory) new DiscListViewSelectionHandlerFactory(this, this.listView); this.menuItemFactory = new MenuItemFactory(this.userActions, this.contextMenuImageList); this.contextMenuManager = new ContextMenuManager(this.menuItemFactory); this.Resize += new EventHandler(this.DiscViewExplorer_Resize); this.Leave += new EventHandler(this.DiscViewExplorer_Leave); this.listView.Columns.Add(GDRomExplorer.Resources.Strings.DiscViewListColumnFileName, -2, HorizontalAlignment.Left); this.listView.Columns.Add(GDRomExplorer.Resources.Strings.DiscViewListColumnSize, -2, HorizontalAlignment.Right); this.listView.Columns.Add(GDRomExplorer.Resources.Strings.DiscViewListColumnSizeInBytes, -2, HorizontalAlignment.Right); this.listView.Columns.Add(GDRomExplorer.Resources.Strings.DiscViewListColumnLBA, -2, HorizontalAlignment.Right); this.listView.Columns.Add(GDRomExplorer.Resources.Strings.DiscViewListColumnModifiedDate, -2, HorizontalAlignment.Right); this.listView.MouseClick += new MouseEventHandler(this.listView_MouseClick); this.listView.MouseDoubleClick += new MouseEventHandler(this.listView_MouseClick); this.listView.MouseUp += new MouseEventHandler(this.listView_MouseClick); this.listView.ColumnClick += new ColumnClickEventHandler(this.listView_ColumnClick); this.listView.KeyDown += new KeyEventHandler(this.listView_KeyDown); this.listView.KeyUp += new KeyEventHandler(this.listView_KeyUp); this.listView.ItemDrag += new ItemDragEventHandler(this.DiscViewExplorer_ItemDrag); this.listView.GotFocus += new EventHandler(this.listView_GotFocus); this.listView.LostFocus += new EventHandler(this.DiscViewExplorer_Leave); this.listView.ListViewItemSorter = (IComparer) new ListViewColumnSorter() { Order = SortOrder.Ascending }; this.treeView.AfterSelect += new TreeViewEventHandler(this.treeView_AfterSelect); this.treeView.MouseClick += new MouseEventHandler(this.treeView_MouseClick); this.treeView.MouseDoubleClick += new MouseEventHandler(this.treeView_MouseClick); this.treeView.ItemDrag += new ItemDragEventHandler(this.DiscViewExplorer_ItemDrag); this.treeView.GotFocus += new EventHandler(this.treeView_GotFocus); this.treeView.Leave += new EventHandler(this.DiscViewExplorer_Leave); this.saveFileDialogForInitialProgram.Title = GDRomExplorer.Resources.Strings.SfdInitialProgramTitle; this.saveFileDialogForInitialProgram.Filter = GDRomExplorer.Resources.Strings.SfdInitialProgramFilter; this.saveFileDialogForExtraction.Title = GDRomExplorer.Resources.Strings.SfdExtractTitle; this.saveFileDialogForExtraction.Filter = GDRomExplorer.Resources.Strings.SfdExtractFilter; this.saveFileDialogForCueSheet.Title = GDRomExplorer.Resources.Strings.SfdCueSheetTitle; this.saveFileDialogForCueSheet.Filter = GDRomExplorer.Resources.Strings.SfdCueSheetFilter; this.saveFileDialogForSortFile.Title = GDRomExplorer.Resources.Strings.SfdSortFileTitle; this.saveFileDialogForSortFile.Filter = GDRomExplorer.Resources.Strings.SfdSortFileFilter; this.saveFileDialogForDesDecrypt.Title = GDRomExplorer.Resources.Strings.NaomiEncryptDecryptToolSfdDecTitle; this.saveFileDialogForDesDecrypt.Filter = GDRomExplorer.Resources.Strings.NaomiEncryptDecryptToolSfdDecFilter; this.folderBrowserDialogForExtraction.Description = GDRomExplorer.Resources.Strings.FbdExtractFilesTitle; this.folderBrowserDialogForExtraction.RootFolder = Environment.SpecialFolder.Desktop; } private void DiscViewExplorer_ItemDrag(object sender, ItemDragEventArgs e) { if (e.Button != MouseButtons.Left) return; if (sender == this.listView) { this.HandleDragAndDropFrom(this.listView); } else { if (sender != this.treeView) throw new NotSupportedException(); this.treeView.SelectedNode = e.Item as TreeNode; this.HandleDragAndDropFrom(this.treeView); } } private void DiscViewExplorer_Load(object sender, EventArgs e) => this.CloseDisc(); private void DiscViewExplorer_Resize(object sender, EventArgs e) => this.ResizeListView(); private void DiscViewExplorer_Leave(object sender, EventArgs e) => this.contextMenuManager.CloseContextMenuIfAny(); public void LoadDisc(IDiscFileSystem discFileSystem) { this.EnableUIElements(); this.discFileSystem = discFileSystem; this.discExtractor.DiscFileSystem = discFileSystem; this.Title = discFileSystem.DiscName; this.discMenuItems = this.menuItemFactory.CreateDiscWithSessionTopMenuItem(discFileSystem); this.UpdateDialogsPath(Path.GetDirectoryName(discFileSystem.FileName)); TreeNode tree = ExplorerTreeNodeFactory.CreateTree(discFileSystem); this.treeView.Nodes.Add(tree); this.UpdateTreeViewSelectedNode(this.FindFileSystemTreeNode(discFileSystem, tree)); } public void CloseDisc() { this.DisableUIElements(); this.treeNodeInListView = (TreeNode) null; this.discFileSystem = (IDiscFileSystem) null; this.DisableSelectionAndNotify(); } private TreeNode FindFileSystemTreeNode(IDiscFileSystem disc, TreeNode rootNode) { TreeNode treeNode1 = rootNode; foreach (IDiscSession discSession in (IEnumerable) disc.Sessions.OrderByDescending((Func) (session => session.Index))) { TreeNode[] treeNodeArray = rootNode.Nodes.Find(discSession.Name, false); if (treeNodeArray.Length != 0) { TreeNode treeNode2 = treeNodeArray[0]; treeNode1 = treeNode2; if (treeNode2.FirstNode != null) { TreeNode firstNode = treeNode2.FirstNode; if (firstNode.Tag is IDiscTrack tag && tag.TrackData == TrackModeType.Data && (firstNode.LastNode != null && firstNode.LastNode.Tag is DirectoryRecord)) { treeNode1 = firstNode.LastNode; break; } } } } return treeNode1; } private void DisableUIElements() { this.Title = GDRomExplorer.Resources.Strings.DiscViewNoDiscTitle; this.treeView.Enabled = false; this.treeView.Nodes.Clear(); this.treeView.BackColor = SystemColors.Control; this.listView.Enabled = false; this.listView.Items.Clear(); this.listView.Scrollable = false; } private void EnableUIElements() { this.treeView.BackColor = SystemColors.Window; this.treeView.Nodes.Clear(); this.treeView.Enabled = true; this.listView.Items.Clear(); this.listView.Scrollable = true; this.listView.Enabled = true; } private void ShowBootSector(InitialProgramExtended ip) { using (FormInitialProgram formInitialProgram = new FormInitialProgram(ip, Path.GetDirectoryName(this.discFileSystem.FileName))) { int num = (int) formInitialProgram.ShowDialog((IWin32Window) this); } } private void ShowPVD(PrimaryVolumeDescriptor PrimVolDesc) { using (FormPrimaryVolumeDescriptor volumeDescriptor = new FormPrimaryVolumeDescriptor(PrimVolDesc)) { int num = (int) volumeDescriptor.ShowDialog((IWin32Window) this); } } private void FillListView(DirectoryRecord directoryRecordToRead, TreeNode origin) { this.listView.Cursor = Cursors.AppStarting; this.listView.BeginUpdate(); this.listView.Items.Clear(); ListViewItem listViewItem1 = (ListViewItem) null; if (!directoryRecordToRead.IsRoot) { ListViewItem parentDirectoryItem = ExplorerListItemFactory.CreateParentDirectoryItem(directoryRecordToRead); this.listView.Items.Add(parentDirectoryItem); listViewItem1 = parentDirectoryItem; } ListViewItem[] items = new ListViewItem[directoryRecordToRead.SubDirectories.Count]; int num = 0; foreach (DirectoryRecord subDirectory in directoryRecordToRead.SubDirectories) { ListViewItem listViewItem2 = ExplorerListItemFactory.CreateItem(subDirectory, this.discFileSystem); items[num++] = listViewItem2; if (origin != null && listViewItem2.Tag == origin.Tag) listViewItem1 = listViewItem2; } this.listView.Items.AddRange(items); this.listView.FocusedItem = listViewItem1; this.listView.Cursor = Cursors.Default; this.listView.EndUpdate(); this.ResizeListView(); } private void ConvertGDDA(IDiscTrack discTrack) { using (FormAudioConversionSettings conversionSettings = new FormAudioConversionSettings()) { if (conversionSettings.ShowDialog((IWin32Window) this) != DialogResult.OK) return; this.gddaConverterTool.ConvertGDDATracks(discTrack, conversionSettings.AudioConversionSettings); } } private void ExtractAndDecryptFile(DirectoryRecord directoryRecord) { if (directoryRecord == null || directoryRecord.IsDirectory) return; DESKey desKey; using (FormGetDESKey extractAndDecryptLabel = FormGetDESKey.aGetDESKeyFormWithExtractAndDecryptLabel(this.discFileSystem.NaomiDESKey)) { if (extractAndDecryptLabel.ShowDialog((IWin32Window) this) != DialogResult.OK) return; desKey = extractAndDecryptLabel.DESKey; } this.saveFileDialogForDesDecrypt.FileName = Path.GetFileNameWithoutExtension(directoryRecord.Name); if (this.saveFileDialogForDesDecrypt.ShowDialog((IWin32Window) this) != DialogResult.OK) return; string fileName = this.saveFileDialogForDesDecrypt.FileName; this.UpdateDialogsPath(Path.GetDirectoryName(fileName)); this.saveFileDialogForDesDecrypt.FileName = Path.GetFileNameWithoutExtension(fileName); IVirtualFile virtualFile1 = VirtualFileFactory.createVirtualFile(directoryRecord, this.discFileSystem); IVirtualFile virtualFile2 = VirtualFileFactory.createVirtualFile(fileName); DesEncryptDecryptTool desDecryptor = new DesEncryptDecryptTool(); Guid TaskId = Guid.NewGuid(); FormProcess.createForDesDecryptor(desDecryptor, TaskId); desDecryptor.DecryptAsync((IVirtualFile) virtualFile1, (IVirtualFile) virtualFile2, desKey, (object) TaskId); } private void ExtractInitialProgram(InitialProgramExtended initialProgramExtended) { this.saveFileDialogForInitialProgram.FileName = initialProgramExtended.FileName; if (this.saveFileDialogForInitialProgram.ShowDialog((IWin32Window) this) != DialogResult.OK) return; string fileName = this.saveFileDialogForInitialProgram.FileName; this.UpdateDialogsPath(Path.GetDirectoryName(fileName)); try { this.discExtractor.ExtractBootStrap((InitialProgram) initialProgramExtended, fileName); AppStatus.NotifyNewAppStatus(string.Format(GDRomExplorer.Resources.Strings.MsgBoxInitialProgramExtractionSuccessWithFormat, (object) fileName)); } catch (Exception ex) { DiscViewExplorer.logger.ErrorFormat("Unable to extract the boot file: {0}", (object) ex); int num = (int) MessageBox.Show((IWin32Window) this, GDRomExplorer.Resources.Strings.MsgBoxInitialProgramExtractionErrorWithFormat, GDRomExplorer.Resources.Strings.MsgBoxInitialProgramExtractionTitle, MessageBoxButtons.OK, MessageBoxIcon.Hand); AppStatus.NotifyNewAppStatus(string.Format(GDRomExplorer.Resources.Strings.MsgBoxInitialProgramExtractionErrorWithFormat, (object) fileName)); } } private void ExportForGDEmu(IDiscFileSystem discFileSystem) { using (FormGDEmuExportSettings emuExportSettings = new FormGDEmuExportSettings(discFileSystem)) { int num = (int) emuExportSettings.ShowDialog((IWin32Window) this); } } private void CreateCueSheet(IDiscSession discSession) { string Title = string.Format("{0} ({1})", (object) this.discFileSystem.DiscName, (object) discSession.Name); this.saveFileDialogForCueSheet.FileName = Title; if (this.saveFileDialogForCueSheet.ShowDialog((IWin32Window) this) != DialogResult.OK) return; string fileName = this.saveFileDialogForCueSheet.FileName; this.UpdateDialogsPath(Path.GetDirectoryName(fileName)); this.saveFileDialogForCueSheet.FileName = Path.GetFileNameWithoutExtension(fileName); try { CueSheetCreator.CreateFromDiscSession(discSession, fileName, Title); AppStatus.NotifyNewAppStatus(GDRomExplorer.Resources.Strings.MsgBoxCueCreatorSuccess); } catch (Exception ex) { DiscViewExplorer.logger.ErrorFormat("Unable to create the sort file: {0}", (object) ex); int num = (int) MessageBox.Show((IWin32Window) this, GDRomExplorer.Resources.Strings.MsgBoxCueCreatorError, GDRomExplorer.Resources.Strings.MsgBoxCueCreatorTitle, MessageBoxButtons.OK, MessageBoxIcon.Hand); AppStatus.NotifyNewAppStatus(GDRomExplorer.Resources.Strings.MsgBoxCueCreatorError); } } private void CreateSortFile(IDiscSession discSession) { string pathPrefix; int lowestFileWeight; using (FormSortFileOptions formSortFileOptions = new FormSortFileOptions()) { if (formSortFileOptions.ShowDialog((IWin32Window) this) != DialogResult.OK) return; pathPrefix = formSortFileOptions.PathPrefix; lowestFileWeight = formSortFileOptions.LowestFileWeight; } if (string.IsNullOrEmpty(Path.GetFileName(this.saveFileDialogForSortFile.FileName))) this.saveFileDialogForSortFile.FileName = SortFileCreator.DefaultFileName; if (this.saveFileDialogForSortFile.ShowDialog((IWin32Window) this) != DialogResult.OK) return; string fileName = this.saveFileDialogForSortFile.FileName; this.saveFileDialogForSortFile.FileName = Path.GetFileNameWithoutExtension(fileName); this.UpdateDialogsPath(Path.GetDirectoryName(fileName)); try { SortFileCreator.CreateSortFile(discSession, pathPrefix, lowestFileWeight, fileName); AppStatus.NotifyNewAppStatus(GDRomExplorer.Resources.Strings.MsgBoxSortFileCreationSuccess); } catch (Exception ex) { DiscViewExplorer.logger.ErrorFormat("Unable to create the sort file: {0}", (object) ex); int num = (int) MessageBox.Show((IWin32Window) this, GDRomExplorer.Resources.Strings.MsgBoxSortFileCreationError, GDRomExplorer.Resources.Strings.MsgBoxSortFileCreationTitle, MessageBoxButtons.OK, MessageBoxIcon.Hand); AppStatus.NotifyNewAppStatus(GDRomExplorer.Resources.Strings.MsgBoxSortFileCreationError); } } private void OpenExtractNodesDialog(List DirectoryRecords) { if (DirectoryRecords == null || DirectoryRecords.Count == 0) { DiscViewExplorer.logger.Debug((object) "Nothing to extract!"); } else { string str; if (DirectoryRecords.Count == 1 && !DirectoryRecords[0].IsDirectory) { this.saveFileDialogForExtraction.FileName = DirectoryRecords[0].Name; if (this.saveFileDialogForExtraction.ShowDialog((IWin32Window) this) != DialogResult.OK) return; str = this.saveFileDialogForExtraction.FileName; this.UpdateDialogsPath(Path.GetDirectoryName(str)); } else { if (this.folderBrowserDialogForExtraction.ShowDialog((IWin32Window) this) != DialogResult.OK) return; str = this.folderBrowserDialogForExtraction.SelectedPath; this.UpdateDialogsPath(str); } Guid TaskId = Guid.NewGuid(); FormProcess.createForDiscExtractor(this.discExtractor, TaskId); this.discExtractor.ExtractPathsAsync(DirectoryRecords, str, (object) TaskId); } } private void OpenExtractNodesDialogForDiscTrack(IDiscTrack discTrack) { this.saveFileDialogForExtraction.FileName = Path.GetFileName(discTrack.VirtualName); if (this.saveFileDialogForExtraction.ShowDialog((IWin32Window) this) != DialogResult.OK) return; string fileName = this.saveFileDialogForExtraction.FileName; this.UpdateDialogsPath(Path.GetDirectoryName(fileName)); Guid TaskId = Guid.NewGuid(); FormProcess.createForDiscExtractor(this.discExtractor, TaskId); this.discExtractor.ExtractDiscTracksAsync(discTrack, fileName, (object) TaskId); } private void UpdateDialogsPath(string outputPath) => this.saveFileDialogForInitialProgram.InitialDirectory = this.saveFileDialogForExtraction.InitialDirectory = this.saveFileDialogForCueSheet.InitialDirectory = this.saveFileDialogForSortFile.InitialDirectory = this.saveFileDialogForDesDecrypt.InitialDirectory = this.folderBrowserDialogForExtraction.SelectedPath = outputPath; private void ResizeListView() { this.listView.SuspendLayout(); for (int index = 0; index < this.listView.Columns.Count; ++index) this.listView.Columns[index].Width = -2; this.listView.ResumeLayout(false); } private void DisableSelectionAndNotify() { if (this.SelectionChanged == null) return; this.SelectionChanged((object) this, new EventArgs(DiscViewExplorer.ActionsForEditMenuItem.NoEditActions())); } private void RemoveSelectionAndNotify() { if (this.SelectionChanged == null) return; this.SelectionChanged((object) this, this.CreateNewSelectionEvent(this.menuItemFactory.CreateSelectionDisabledTopMenuItem())); } private void NotifySelectionChanged(ToolStripItem[] NewSelectionMenuItems) { if (this.SelectionChanged == null) return; this.SelectionChanged((object) this, this.CreateNewSelectionEvent(NewSelectionMenuItems)); } private EventArgs CreateNewSelectionEvent( ToolStripItem[] NewSelectionMenuItems) { return new EventArgs(new DiscViewExplorer.ActionsForEditMenuItem(this.discMenuItems, NewSelectionMenuItems)); } private void UpdateTreeViewSelectedNode(TreeNode newSelection) { this.treeView.SelectedNode = newSelection; this.treeView.SelectedNode.EnsureVisible(); this.treeView.SelectedNode.Expand(); } private void NagivateUp() { if (this.treeNodeInListView.Parent == null || !(this.treeNodeInListView.Parent.Tag is DirectoryRecord)) return; this.treeView.SelectedNode = this.treeNodeInListView.Parent; } private void NavigateDown() { if (this.listView.FocusedItem == null || !(this.listView.FocusedItem.Tag is DirectoryRecord) || !(this.listView.FocusedItem.Tag as DirectoryRecord).IsDirectory) return; if (this.treeNodeInListView.Tag == this.listView.FocusedItem.Tag) { this.NagivateUp(); } else { TreeNode[] treeNodeArray = this.treeNodeInListView.Nodes.Find(this.listView.FocusedItem.Name, false); if (treeNodeArray.Length != 1) return; this.NotifySelectionChanged(this.menuItemFactory.CreateSelectionMenuItemsForTreeView(treeNodeArray[0].Tag)); } } private void SelectAllListViewItems() { foreach (ListViewItem listViewItem in this.listView.Items) { if (!DirectoryRecord.PARENT_DIRECTORY_NAME.Equals(listViewItem.Text)) listViewItem.Selected = true; } } private void UserActionExportForGDEmu(object sender, EventArgs e) { if (!(sender is ToolStripItem)) return; ToolStripItem toolStripItem = sender as ToolStripItem; if (!(toolStripItem.Tag is IDiscFileSystem)) return; this.ExportForGDEmu(toolStripItem.Tag as IDiscFileSystem); } private void UserActionCreateCueSheet(object sender, EventArgs e) { if (!(sender is ToolStripItem)) return; ToolStripItem toolStripItem = sender as ToolStripItem; if (!(toolStripItem.Tag is IDiscSession)) return; this.CreateCueSheet(toolStripItem.Tag as IDiscSession); } private void UserActionShowGDDAConversionForm(object sender, EventArgs e) { if (!(sender is ToolStripItem)) return; ToolStripItem toolStripItem = sender as ToolStripItem; if (!(toolStripItem.Tag is IDiscSession)) return; using (FormGdda formGdda = new FormGdda(toolStripItem.Tag as IDiscSession)) { if (formGdda.ShowDialog((IWin32Window) this) != DialogResult.OK) return; this.gddaConverterTool.ConvertGDDATracks((IList) formGdda.SelectedDiscTracks, formGdda.AudioConversionSettings); } } private void UserActionShowBootSector(object sender, EventArgs e) { if (!(sender is ToolStripItem)) return; ToolStripItem toolStripItem = sender as ToolStripItem; if (!(toolStripItem.Tag is InitialProgramExtended)) return; this.ShowBootSector(toolStripItem.Tag as InitialProgramExtended); } private void UserActionExtractInitialProgram(object sender, EventArgs eventArgs) { if (!(sender is ToolStripItem)) return; ToolStripItem toolStripItem = sender as ToolStripItem; if (!(toolStripItem.Tag is InitialProgramExtended)) return; this.ExtractInitialProgram(toolStripItem.Tag as InitialProgramExtended); } private void UserActionExtractItem(object sender, EventArgs e) { if (!(sender is ToolStripItem)) return; ToolStripItem toolStripItem = sender as ToolStripItem; List DirectoryRecords = new List(); if (toolStripItem.Tag is List) this.OpenExtractNodesDialog(toolStripItem.Tag as List); else if (toolStripItem.Tag is DirectoryRecord) { DirectoryRecords.Add(toolStripItem.Tag as DirectoryRecord); this.OpenExtractNodesDialog(DirectoryRecords); } else if (toolStripItem.Tag is IDiscTrack) this.OpenExtractNodesDialogForDiscTrack(toolStripItem.Tag as IDiscTrack); else DiscViewExplorer.logger.ErrorFormat("Unhandled tag object {0} for ToolStripItem {1}", toolStripItem.Tag, (object) toolStripItem); } private void UserActionGenerateSortFile(object sender, EventArgs e) { if (!(sender is ToolStripItem)) return; ToolStripItem toolStripItem = sender as ToolStripItem; if (!(toolStripItem.Tag is IDiscSession)) return; this.CreateSortFile(toolStripItem.Tag as IDiscSession); } private void UserActionShowPrimaryVolumeDescriptor(object sender, EventArgs e) { if (!(sender is ToolStripItem)) return; ToolStripItem toolStripItem = sender as ToolStripItem; if (!(toolStripItem.Tag is IDiscTrack)) return; this.ShowPVD((toolStripItem.Tag as IDiscTrack).Session.PrimaryVolumeDescriptor); } private void UserActionConvertGDDA(object sender, EventArgs e) { if (!(sender is ToolStripItem)) return; ToolStripItem toolStripItem = sender as ToolStripItem; if (!(toolStripItem.Tag is IDiscTrack)) return; this.ConvertGDDA(toolStripItem.Tag as IDiscTrack); } private void UserActionDecryptBinaryFromDisc(object sender, EventArgs e) { if (this.listView.SelectedItems.Count != 1 || !(this.listView.SelectedItems[0].Tag is DirectoryRecord)) return; this.ExtractAndDecryptFile(this.listView.SelectedItems[0].Tag as DirectoryRecord); } private void HandleDragAndDropFrom(ListView ListView) { List list = ListView.SelectedItems.Cast().Select((Func) (item => (DirectoryRecord) item.Tag)).ToList(); DataObject dataObject = FileDescriptorFactory.createDataObject((object) list, this.discFileSystem); if (dataObject != null) { int num = (int) this.DoDragDrop((object) dataObject, DragDropEffects.Copy); } else DiscViewExplorer.logger.WarnFormat("Drag'n Drop canceled: FileDescriptorFactory does not support {0}", (object) list); } private void HandleDragAndDropFrom(TreeView TreeView) { object tag = TreeView.SelectedNode.Tag; DataObject dataObject = FileDescriptorFactory.createDataObject(tag, this.discFileSystem); if (dataObject != null) { int num = (int) this.DoDragDrop((object) dataObject, DragDropEffects.Copy); } else DiscViewExplorer.logger.WarnFormat("Drag'n Drop canceled: FileDescriptorFactory does not support {0}", tag); } public void Disc_AfterSelectHandler(IDiscFileSystem disc) => this.NotifySelectionChanged(this.menuItemFactory.CreateSelectionMenuItemsForTreeView((object) disc)); public void Disc_MouseRightClickHandler(IDiscFileSystem disc) { ToolStripItem[] itemsForTreeView = this.menuItemFactory.CreateSelectionMenuItemsForTreeView((object) disc); this.contextMenuManager.CreateAndShowContextMenu(itemsForTreeView); this.NotifySelectionChanged(itemsForTreeView); } public void DirectoryRecord_AfterSelectClickHandler(DirectoryRecord DirectoryRecord) { DiscViewExplorer.logger.InfoFormat("Opening path \"{0}\"", (object) DirectoryRecord.FullPath); ToolStripItem[] itemsForTreeView = this.menuItemFactory.CreateSelectionMenuItemsForTreeView((object) DirectoryRecord); TreeNode treeNodeInListView = this.treeNodeInListView; this.treeNodeInListView = this.treeView.SelectedNode; this.FillListView(DirectoryRecord, treeNodeInListView); this.NotifySelectionChanged(itemsForTreeView); } public void DirectoryRecord_MouseRightClickHandler(DirectoryRecord DirectoryRecord) { ToolStripItem[] itemsForTreeView = this.menuItemFactory.CreateSelectionMenuItemsForTreeView((object) DirectoryRecord); this.contextMenuManager.CreateAndShowContextMenu(itemsForTreeView); this.NotifySelectionChanged(itemsForTreeView); } public void DirectoryRecords_MouseLeftClickHandler(IList DirectoryRecords) { DirectoryRecord firstDirectoryRecord = DirectoryRecords[0]; if (!DirectoryRecords.All((Func) (directoryRecord => directoryRecord.ParentDirectory == firstDirectoryRecord.ParentDirectory))) this.RemoveSelectionAndNotify(); else this.NotifySelectionChanged(this.menuItemFactory.CreateSelectionMenuItemsForListView((object) DirectoryRecords, this.discFileSystem)); } public void DirectoryRecords_MouseDoubleLeftClicksHandler( IList DirectoryRecords) { DirectoryRecord directoryRecord = DirectoryRecords[0]; if (!directoryRecord.IsDirectory) return; this.UpdateTreeViewSelectedNode(this.treeNodeInListView.Tag as DirectoryRecord != directoryRecord || this.treeNodeInListView.Parent == null ? this.treeNodeInListView.Nodes[directoryRecord.Name] : this.treeNodeInListView.Parent); } public void DirectoryRecords_MouseRightClickHandler(IList DirectoryRecords) { DirectoryRecord firstDirectoryRecord = DirectoryRecords[0]; if (!DirectoryRecords.All((Func) (directoryRecord => directoryRecord.ParentDirectory == firstDirectoryRecord.ParentDirectory))) { this.RemoveSelectionAndNotify(); } else { ToolStripItem[] itemsForListView = this.menuItemFactory.CreateSelectionMenuItemsForListView((object) DirectoryRecords, this.discFileSystem); this.contextMenuManager.CreateAndShowContextMenu(itemsForListView); this.NotifySelectionChanged(itemsForListView); } } public void InitialProgram_AfterSelectHandler(InitialProgramExtended InitialProgram) => this.NotifySelectionChanged(this.menuItemFactory.CreateSelectionMenuItemsForTreeView((object) InitialProgram)); public void InitialProgram_MouseDoubleLeftClicksHandler(InitialProgramExtended InitialProgram) { ToolStripItem[] itemsForTreeView = this.menuItemFactory.CreateSelectionMenuItemsForTreeView((object) InitialProgram); this.ShowBootSector(InitialProgram); this.NotifySelectionChanged(itemsForTreeView); } public void InitialProgram_MouseRightClickHandler(InitialProgramExtended InitialProgram) => this.contextMenuManager.CreateAndShowContextMenu(this.menuItemFactory.CreateSelectionMenuItemsForTreeView((object) InitialProgram)); public void DiscSession_AfterSelectHandler(IDiscSession DiscSession) => this.NotifySelectionChanged(this.menuItemFactory.CreateSelectionMenuItemsForTreeView((object) DiscSession)); public void DiscSession_MouseRightClickHandler(IDiscSession DiscSession) { ToolStripItem[] itemsForTreeView = this.menuItemFactory.CreateSelectionMenuItemsForTreeView((object) DiscSession); this.contextMenuManager.CreateAndShowContextMenu(itemsForTreeView); this.NotifySelectionChanged(itemsForTreeView); } public void DiscTrack_AfterSelectHandler(IDiscTrack DiscTrack) => this.NotifySelectionChanged(this.menuItemFactory.CreateSelectionMenuItemsForTreeView((object) DiscTrack)); public void DiscTrack_MouseRightClickHandler(IDiscTrack DiscTrack) { ToolStripItem[] itemsForTreeView = this.menuItemFactory.CreateSelectionMenuItemsForTreeView((object) DiscTrack); this.contextMenuManager.CreateAndShowContextMenu(itemsForTreeView); this.NotifySelectionChanged(itemsForTreeView); } private void treeView_MouseClick(object sender, MouseEventArgs e) { TreeNode nodeAt = this.treeView.GetNodeAt(e.Location); if (nodeAt == null) return; this.treeView.SelectedNode = nodeAt; IDiscViewSelection discViewSelection = this.treeViewSelectionHandlerFactory.newSelectionHandlers(this.treeView.SelectedNode.Tag); if (discViewSelection != null) discViewSelection.HandleMouseEvent(e); else DiscViewExplorer.logger.ErrorFormat("Unhandled object {0}", (object) this.Handle); } private void treeView_AfterSelect(object sender, TreeViewEventArgs e) { TreeNode node = e.Node; if (node == null) return; this.treeViewSelectionHandlerFactory.newSelectionHandlers(node.Tag)?.HandleAfterSelect(); } private void treeView_GotFocus(object sender, EventArgs e) { if (this.lastControlWithFocus == this.treeView) return; this.lastControlWithFocus = (Control) this.treeView; if (this.treeView.SelectedNode != null) this.NotifySelectionChanged(this.menuItemFactory.CreateSelectionMenuItemsForTreeView(this.treeView.SelectedNode.Tag)); else this.RemoveSelectionAndNotify(); } private void listView_MouseClick(object sender, MouseEventArgs mouseEvent) { if (this.listView.SelectedItems.Count == 0) this.RemoveSelectionAndNotify(); else this.listViewSelectionHandlerFactory.newSelectionHandlers((object) this.listView.SelectedItems.Cast().Select((Func) (item => (DirectoryRecord) item.Tag)).ToList()).HandleMouseEvent(mouseEvent); } private void listView_ColumnClick(object sender, ColumnClickEventArgs e) { this.listView.BeginUpdate(); this.listView.Sorting = this.listView.Sorting != SortOrder.Ascending ? (((ListViewColumnSorter) this.listView.ListViewItemSorter).Order = SortOrder.Ascending) : (((ListViewColumnSorter) this.listView.ListViewItemSorter).Order = SortOrder.Descending); ((ListViewColumnSorter) this.listView.ListViewItemSorter).SortColumn = e.Column; this.listView.Sort(); this.listView.EndUpdate(); } private void listView_KeyUp(object sender, KeyEventArgs e) { if (this.listView.SelectedItems.Count == 0) this.RemoveSelectionAndNotify(); else this.listViewSelectionHandlerFactory.newSelectionHandlers((object) this.listView.SelectedItems.Cast().Select((Func) (item => (DirectoryRecord) item.Tag)).ToList()).HandleLeftClick(); } private void listView_KeyDown(object sender, KeyEventArgs e) { if (e.Control) { if (e.KeyCode != Keys.A) return; this.SelectAllListViewItems(); } else if (e.KeyCode == Keys.Return) { this.NavigateDown(); } else { if (e.KeyCode != Keys.Back) return; this.NagivateUp(); } } private void listView_GotFocus(object sender, EventArgs e) { if (this.lastControlWithFocus == this.listView) return; this.lastControlWithFocus = (Control) this.listView; if (this.listView.SelectedItems.Count > 0) this.NotifySelectionChanged(this.menuItemFactory.CreateSelectionMenuItemsForListView((object) this.listView.SelectedItems.Cast().Select((Func) (item => (DirectoryRecord) item.Tag)).ToList(), this.discFileSystem)); else this.RemoveSelectionAndNotify(); } 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(); ComponentResourceManager componentResourceManager = new ComponentResourceManager(typeof (DiscViewExplorer)); this.groupBox = new GroupBox(); this.splitContainer = new SplitContainer(); this.treeView = new TreeView(); this.treeViewImageList = new ImageList(this.components); this.listView = new ListView(); this.listViewImageList = new ImageList(this.components); this.saveFileDialogForInitialProgram = new SaveFileDialog(); this.saveFileDialogForExtraction = new SaveFileDialog(); this.saveFileDialogForCueSheet = new SaveFileDialog(); this.saveFileDialogForSortFile = new SaveFileDialog(); this.folderBrowserDialogForExtraction = new FolderBrowserDialog(); this.saveFileDialogForDesDecrypt = new SaveFileDialog(); this.discExtractor = new DiscExtractor(this.components); this.contextMenuImageList = new ImageList(this.components); this.gddaConverterTool = new GDDAConverterTool(this.components); this.groupBox.SuspendLayout(); this.splitContainer.Panel1.SuspendLayout(); this.splitContainer.Panel2.SuspendLayout(); this.splitContainer.SuspendLayout(); this.SuspendLayout(); this.groupBox.AutoSize = true; this.groupBox.BackColor = SystemColors.Window; this.groupBox.Controls.Add((Control) this.splitContainer); this.groupBox.Dock = DockStyle.Fill; this.groupBox.Location = new Point(4, 4); this.groupBox.Name = "groupBox"; this.groupBox.Size = new Size(632, 472); this.groupBox.TabIndex = 0; this.groupBox.TabStop = false; this.groupBox.Text = "Disc title"; this.splitContainer.Dock = DockStyle.Fill; this.splitContainer.Location = new Point(3, 16); this.splitContainer.Name = "splitContainer"; this.splitContainer.Panel1.Controls.Add((Control) this.treeView); this.splitContainer.Panel2.Controls.Add((Control) this.listView); this.splitContainer.Size = new Size(626, 453); this.splitContainer.SplitterDistance = 207; this.splitContainer.TabIndex = 0; this.splitContainer.TabStop = false; this.treeView.BackColor = SystemColors.Window; this.treeView.Dock = DockStyle.Fill; this.treeView.HideSelection = false; this.treeView.HotTracking = true; this.treeView.ImageIndex = 0; this.treeView.ImageList = this.treeViewImageList; this.treeView.Indent = 18; this.treeView.ItemHeight = 18; this.treeView.Location = new Point(0, 0); this.treeView.Name = "treeView"; this.treeView.SelectedImageIndex = 0; this.treeView.ShowLines = false; this.treeView.ShowNodeToolTips = true; this.treeView.Size = new Size(207, 453); this.treeView.TabIndex = 1; this.treeViewImageList.ImageStream = (ImageListStreamer) componentResourceManager.GetObject("treeViewImageList.ImageStream"); this.treeViewImageList.TransparentColor = Color.Transparent; this.treeViewImageList.Images.SetKeyName(0, "gd_icon.png"); this.treeViewImageList.Images.SetKeyName(1, "dclogo_black.png"); this.treeViewImageList.Images.SetKeyName(2, "cdrom_data.png"); this.treeViewImageList.Images.SetKeyName(3, "cdrom_audio.png"); this.treeViewImageList.Images.SetKeyName(4, "file_binary.png"); this.treeViewImageList.Images.SetKeyName(5, "iso9660.png"); this.treeViewImageList.Images.SetKeyName(6, "folder_closed.ico"); this.treeViewImageList.Images.SetKeyName(7, "folder_open.ico"); this.listView.AllowColumnReorder = true; this.listView.Dock = DockStyle.Fill; this.listView.Font = new Font("Microsoft Sans Serif", 8.25f); this.listView.FullRowSelect = true; this.listView.HideSelection = false; this.listView.LabelWrap = false; this.listView.Location = new Point(0, 0); this.listView.Name = "listView"; this.listView.ShowGroups = false; this.listView.ShowItemToolTips = true; this.listView.Size = new Size(415, 453); this.listView.SmallImageList = this.listViewImageList; this.listView.Sorting = SortOrder.Ascending; this.listView.TabIndex = 2; this.listView.UseCompatibleStateImageBehavior = false; this.listView.View = View.Details; this.listViewImageList.ImageStream = (ImageListStreamer) componentResourceManager.GetObject("listViewImageList.ImageStream"); this.listViewImageList.TransparentColor = Color.Transparent; this.listViewImageList.Images.SetKeyName(0, "file.ico"); this.listViewImageList.Images.SetKeyName(1, "folder_closed.ico"); this.listViewImageList.Images.SetKeyName(2, "folder_up.ico"); this.discExtractor.DiscFileSystem = (IDiscFileSystem) null; this.contextMenuImageList.ImageStream = (ImageListStreamer) componentResourceManager.GetObject("contextMenuImageList.ImageStream"); this.contextMenuImageList.TransparentColor = Color.Transparent; this.contextMenuImageList.Images.SetKeyName(0, "extract_icon.ico"); this.contextMenuImageList.Images.SetKeyName(1, "file.ico"); this.contextMenuImageList.Images.SetKeyName(2, "zoom.ico"); this.contextMenuImageList.Images.SetKeyName(3, "help.ico"); this.contextMenuImageList.Images.SetKeyName(4, "folder_open.ico"); this.contextMenuImageList.Images.SetKeyName(5, "folder_up.ico"); this.AutoScaleDimensions = new SizeF(6f, 13f); this.AutoScaleMode = AutoScaleMode.Font; this.AutoSize = true; this.Controls.Add((Control) this.groupBox); this.DoubleBuffered = true; this.Name = nameof (DiscViewExplorer); this.Padding = new Padding(4); this.Size = new Size(640, 480); this.Load += new EventHandler(this.DiscViewExplorer_Load); this.Leave += new EventHandler(this.DiscViewExplorer_Leave); this.groupBox.ResumeLayout(false); this.splitContainer.Panel1.ResumeLayout(false); this.splitContainer.Panel2.ResumeLayout(false); this.splitContainer.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); } public sealed class ActionsForEditMenuItem { public bool AnyAvailable { get; private set; } public bool SelectionMenuAvailable { get; private set; } public ToolStripItem[] DiscMenuItems { get; private set; } public ToolStripItem[] SelectionMenuItems { get; private set; } internal ActionsForEditMenuItem( ToolStripItem[] DiscMenuItems, ToolStripItem[] SelectionMenuItems) { this.DiscMenuItems = DiscMenuItems; this.SelectionMenuItems = SelectionMenuItems; this.SelectionMenuAvailable = SelectionMenuItems != null && SelectionMenuItems.Length > 0; this.AnyAvailable = this.SelectionMenuAvailable || DiscMenuItems != null && DiscMenuItems.Length > 0; } internal static DiscViewExplorer.ActionsForEditMenuItem NoEditActions() => new DiscViewExplorer.ActionsForEditMenuItem((ToolStripItem[]) null, (ToolStripItem[]) null); } } }