1
0
mirror of synced 2024-11-15 11:33:20 +01:00
Switch-Toolbox/Switch_Toolbox_Library/Generics/STGenericWrapper.cs

276 lines
8.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Toolbox.Library;
using Toolbox.Library.Forms;
namespace Toolbox.Library.NodeWrappers
{
//Generic wrapper based on https://github.com/libertyernie/brawltools/blob/40d7431b1a01ef4a0411cd69e51411bd581e93e2/BrawlBox/NodeWrappers/GenericWrapper
//Store useful generic functions in this wrapper for tree nodes
public class STGenericWrapper : TreeNodeCustom, IContextMenuNode
{
public STGenericWrapper(string name) { Text = name; }
int IndexStr = 0;
public string SearchDuplicateNames(string Name)
{
bool IsDuped = false;
foreach (TreeNode node in Nodes)
if (node.Text == Name)
IsDuped = true;
if (IsDuped)
return SearchDuplicateNames($"{Name}{IndexStr++}");
else
return Name;
}
public bool IsFolder = false;
public bool CanExport { get; set; }
public bool CanReplace { get; set; }
public bool CanRename { get; set; }
public bool CanDelete { get; set; }
private void EnableContextMenu(ToolStripItemCollection Items, string Key, bool Enabled)
{
foreach (ToolStripItem item in Items)
{
if (item.Text == Key)
item.Enabled = Enabled;
}
}
public STGenericWrapper(bool LoadMenus = true)
{
CanExport = true;
CanReplace = false;
CanRename = true;
CanDelete = false;
}
public ToolStripItem[] GetContextMenuItems()
{
if (IsFolder)
{
return new ToolStripItem[]
{
new ToolStripMenuItem("Import", null, ImportAction, Keys.Control | Keys.I) {Enabled = CanReplace },
new ToolStripMenuItem("Export All", null, ExportAllAction, Keys.Control | Keys.E) {Enabled = CanExport },
new ToolStripMenuItem("Replace All", null, ReplaceAllAction, Keys.Control | Keys.R) {Enabled = CanReplace },
new ToolStripSeparator(),
new ToolStripMenuItem("Sort", null, SortAction, Keys.Control | Keys.N),
new ToolStripSeparator(),
new ToolStripMenuItem("Clear", null, ClearAction, Keys.Control | Keys.Delete) {Enabled = CanDelete } ,
};
}
else
{
return new ToolStripItem[]
{
new ToolStripMenuItem("Export", null, ExportAction, Keys.Control | Keys.E) {Enabled = CanExport },
new ToolStripMenuItem("Replace", null, ReplaceAction, Keys.Control | Keys.R) {Enabled = CanReplace },
new ToolStripSeparator(),
new ToolStripMenuItem("Rename", null, RenameAction, Keys.Control | Keys.N) {Enabled = CanRename },
new ToolStripSeparator(),
new ToolStripMenuItem("Delete", null, DeleteAction, Keys.Control | Keys.Delete) {Enabled = CanDelete },
};
}
}
public void LoadFolderMenus()
{
CanExport = false;
CanReplace = false;
CanRename = false;
CanDelete = false;
IsFolder = true;
}
protected void ReplaceAllAction(object sender, EventArgs e) {
ReplaceAll();
}
public virtual void ReplaceAll()
{
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
foreach (string file in System.IO.Directory.GetFiles(sfd.SelectedPath))
{
string FileName = System.IO.Path.GetFileNameWithoutExtension(file);
foreach (TreeNode node in Nodes)
{
if (node is STGenericWrapper)
{
if (FileName == node.Text)
{
((STGenericWrapper)node).Replace(file);
}
}
}
}
}
}
protected void ExportAllAction(object sender, EventArgs e)
{
if (Nodes.Count <= 0)
return;
string formats = ExportFilter;
string[] forms = formats.Split('|');
List<string> Formats = new List<string>();
for (int i = 0; i < forms.Length; i++)
{
if (i > 1 || i == (forms.Length - 1)) //Skip lines with all extensions
{
if (!forms[i].StartsWith("*"))
Formats.Add(forms[i]);
}
}
FolderSelectDialog sfd = new FolderSelectDialog();
if (sfd.ShowDialog() == DialogResult.OK)
{
string folderPath = sfd.SelectedPath;
BatchFormatExport form = new BatchFormatExport(Formats);
if (form.ShowDialog() == DialogResult.OK)
{
string extension = form.GetSelectedExtension();
extension.Replace(" ", string.Empty);
foreach (TreeNode node in Nodes)
{
if (node is STGenericWrapper)
{
((STGenericWrapper)node).Export($"{folderPath}\\{node.Text}{extension}");
}
}
}
}
}
protected void ExportAction(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = ExportFilter;
sfd.FileName = Text;
if (sfd.ShowDialog() == DialogResult.OK)
{
Export(sfd.FileName);
}
}
protected void ImportAction(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = ImportFilter;
ofd.Multiselect = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
Import(ofd.FileNames);
}
}
protected void ReplaceAction(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = ReplaceFilter;
ofd.Multiselect = false;
if (ofd.ShowDialog() == DialogResult.OK)
{
Replace(ofd.FileName);
}
}
protected void DeleteAction(object sender, EventArgs e) { Delete();}
protected void RenameAction(object sender, EventArgs e) { Rename(); }
protected void SortAction(object sender, EventArgs e) { Sort(); }
protected void ClearAction(object sender, EventArgs e) { Clear(); }
public virtual string ExportFilter { get { return "All files(*.*)|*.*"; } }
public virtual string ImportFilter { get { return ExportFilter; } }
public virtual string ReplaceFilter { get { return ImportFilter; } }
public virtual void Sort()
{
TreeView.TreeViewNodeSorter = new TreeChildSorter();
TreeView.Sort();
}
public virtual void Export(string FileName)
{
}
public virtual void Import(string[] FileName)
{
}
public virtual void Replace(string FileName)
{
}
public virtual void Clear()
{
var result = MessageBox.Show("Are you sure you want to clear this section? This cannot be undone!",
"", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
foreach (var node in Nodes)
if (node is STGenericWrapper)
{
((STGenericWrapper)node).Unload();
}
Nodes.Clear();
}
}
public virtual void Delete()
{
if (Parent != null)
{
Remove();
}
}
public virtual void Unload()
{
foreach (var node in Nodes)
if (node is STGenericWrapper)
((STGenericWrapper)node).Unload();
Nodes.Clear();
}
public virtual void Rename()
{
RenameDialog dialog = new RenameDialog();
dialog.SetString(Text);
if (dialog.ShowDialog() == DialogResult.OK) { Text = dialog.textBox1.Text; }
}
}
}