private void ExtractToolStripMenuItem_Click(object sender, EventArgs e) { TreeViewWithSearchResults.TreeViewPackageTag package = null; TreeNode selectedNode = null; // the context menu can come from a TreeView or a ListView depending on where the user clicked to extract // each option has a difference in where we can get the values to extract if (((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl is TreeView) { var tree = ((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl as TreeView; selectedNode = tree.SelectedNode; package = tree.Tag as TreeViewWithSearchResults.TreeViewPackageTag; } else if (((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl is ListView) { var listView = ((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl as ListView; selectedNode = listView.SelectedItems[0].Tag as TreeNode; package = listView.Tag as TreeViewWithSearchResults.TreeViewPackageTag; } if (selectedNode.Tag.GetType() == typeof(PackageEntry)) { // We are a file var file = selectedNode.Tag as PackageEntry; var dialog = new SaveFileDialog { InitialDirectory = Settings.Config.SaveDirectory, Filter = "All files (*.*)|*.*", FileName = file.GetFileName(), }; var userOK = dialog.ShowDialog(); if (userOK == DialogResult.OK) { Settings.Config.SaveDirectory = Path.GetDirectoryName(dialog.FileName); Settings.Save(); using (var stream = dialog.OpenFile()) { package.Package.ReadEntry(file, out var output); stream.Write(output, 0, output.Length); } } } else { //We are a folder var dialog = new FolderBrowserDialog(); if (dialog.ShowDialog() == DialogResult.OK) { var extractDialog = new ExtractProgressForm(package.Package, selectedNode, dialog.SelectedPath); extractDialog.ShowDialog(); } } }
private void ExtractFiles(object sender, bool decompile) { TreeViewWithSearchResults.TreeViewPackageTag package = null; TreeNode selectedNode = null; // the context menu can come from a TreeView or a ListView depending on where the user clicked to extract // each option has a difference in where we can get the values to extract if (((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl is TreeView) { var tree = ((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl as TreeView; selectedNode = tree.SelectedNode; package = tree.Tag as TreeViewWithSearchResults.TreeViewPackageTag; } else if (((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl is ListView) { var listView = ((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl as ListView; selectedNode = listView.SelectedItems[0].Tag as TreeNode; package = listView.Tag as TreeViewWithSearchResults.TreeViewPackageTag; } if (selectedNode.Tag.GetType() == typeof(PackageEntry)) { // We are a file var file = selectedNode.Tag as PackageEntry; var fileName = file.GetFileName(); package.Package.ReadEntry(file, out var output); if (decompile && fileName.EndsWith("_c", StringComparison.Ordinal)) { using (var resource = new Resource()) using (var memory = new MemoryStream(output)) { resource.Read(memory); var extension = FileExtract.GetExtension(resource); if (extension == null) { fileName = fileName.Substring(0, fileName.Length - 2); } else { fileName = Path.ChangeExtension(fileName, extension); } output = FileExtract.Extract(resource).ToArray(); } } var dialog = new SaveFileDialog { InitialDirectory = Settings.Config.SaveDirectory, Filter = "All files (*.*)|*.*", FileName = fileName, }; var userOK = dialog.ShowDialog(); if (userOK == DialogResult.OK) { Settings.Config.SaveDirectory = Path.GetDirectoryName(dialog.FileName); Settings.Save(); using (var stream = dialog.OpenFile()) { stream.Write(output, 0, output.Length); } } } else { //We are a folder var dialog = new FolderBrowserDialog(); if (dialog.ShowDialog() == DialogResult.OK) { var extractDialog = new ExtractProgressForm(package.Package, selectedNode, dialog.SelectedPath, decompile); extractDialog.ShowDialog(); } } }