Switch-Toolbox/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.cs

294 lines
9.5 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Toolbox.Library.Forms
{
//The panel when a file in an archive is clicked on
//Configures the editor view, ie Hex, Editor, Text Edtior, etc
public partial class ArchiveFilePanel : UserControl
{
ArchiveFileInfo ArchiveFileInfo;
IArchiveFile ArchiveFile;
private bool _IsLoaded = false;
public ArchiveFilePanel()
{
InitializeComponent();
ReloadEditors();
_IsLoaded = true;
saveBtn.Visible = false;
}
public void LoadFile(ArchiveFileInfo archiveFileInfo, IArchiveFile archiveFile)
{
ArchiveFileInfo = archiveFileInfo;
ArchiveFile = archiveFile;
}
public void LoadFile(ArchiveFileInfo archiveFileInfo)
{
ArchiveFileInfo = archiveFileInfo;
}
private void ReloadEditors()
{
stComboBox1.Items.Clear();
stComboBox1.Items.Add("Properties");
stComboBox1.Items.Add("Hex Editor");
stComboBox1.Items.Add("File Editor");
stComboBox1.Items.Add("Text Editor");
if (Runtime.ObjectEditor.EditorDiplayIndex < stComboBox1.Items.Count)
stComboBox1.SelectedIndex = Runtime.ObjectEditor.EditorDiplayIndex;
else
stComboBox1.SelectedIndex = 0;
}
public void SetEditor(int Index) { stComboBox1.SelectedIndex = Index; }
public int GetEditor() { return stComboBox1.SelectedIndex; }
public UserControl GetActiveEditor(Type type)
{
foreach (var control in stPanel1.Controls)
{
if (control.GetType() == type)
return (UserControl)control;
}
return null;
}
public void UpdateEditor()
{
if (GetEditor() == 0)
UpdatePropertiesView();
else if (GetEditor() == 1)
UpdateHexView();
else if (GetEditor() == 2)
UpdateFileEditor();
else if (GetEditor() == 3)
UpdateTextView();
if (GetEditor() == 2 || GetEditor() == 3)
saveBtn.Visible = true;
else
saveBtn.Visible = false;
}
private void UpdateFileEditor()
{
var File = ArchiveFileInfo.FileFormat;
if (File == null) //If the file is not open yet, try temporarily for a preview
File = ArchiveFileInfo.OpenFile();
//If the file is still null, just add a basic control and return
if (File == null)
{
AddControl(new STUserControl());
return;
}
if (File.IFileInfo != null && ArchiveFile != null)
File.IFileInfo.ArchiveParent = ArchiveFile;
ArchiveFileInfo.FileFormat = File;
SetEditorForm(File);
}
private bool CheckActiveType(Type type)
{
return stPanel1.Controls.Count > 0 && stPanel1.Controls[0].GetType() != type;
}
public void SetEditorForm(IFileFormat fileFormat)
{
if (fileFormat == null)
{
AddControl(new STUserControl() { Dock = DockStyle.Fill });
return;
}
Type objectType = fileFormat.GetType();
foreach (var inter in objectType.GetInterfaces())
{
if (inter.IsGenericType && inter.GetGenericTypeDefinition() == typeof(IEditor<>))
{
System.Reflection.MethodInfo method = objectType.GetMethod("OpenForm");
System.Reflection.MethodInfo methodFill = objectType.GetMethod("FillEditor");
var Editor = (UserControl)method.Invoke(fileFormat, new object[0]);
var ActiveEditor = GetActiveEditor(Editor.GetType());
if (ActiveEditor == null)
AddControl(Editor);
else
Editor = ActiveEditor;
methodFill.Invoke(fileFormat, new object[1] { Editor });
return;
}
}
if (fileFormat is STGenericTexture)
{
var Editor = ((STGenericTexture)fileFormat).GetEditor();
var ActiveEditor = GetActiveEditor(Editor.GetType());
if (ActiveEditor == null)
AddControl(Editor);
else
Editor = ActiveEditor;
((STGenericTexture)fileFormat).FillEditor(Editor);
return;
}
if (fileFormat is TreeNodeFile)
{
var Editor = ((TreeNodeFile)fileFormat).GetEditor();
var ActiveEditor = GetActiveEditor(Editor.GetType());
if (ActiveEditor == null)
AddControl(Editor);
else
Editor = ActiveEditor;
((TreeNodeFile)fileFormat).FillEditor(Editor);
return;
}
}
private void UpdateTextView()
{
TextEditor editor = (TextEditor)GetActiveEditor(typeof(TextEditor));
if (editor == null)
{
editor = new TextEditor();
editor.Dock = DockStyle.Fill;
AddControl(editor);
}
editor.Text = Text;
var File = ArchiveFileInfo.FileFormat;
if (File == null)
File = ArchiveFileInfo.OpenFile();
if (File != null && IsConvertableText(File.GetType()))
{
editor.FillEditor(((IConvertableTextFormat)File).ConvertToString());
if (((IConvertableTextFormat)File).TextFileType == TextFileType.Yaml)
editor.IsYAML = true;
}
else if (ArchiveFileInfo.FileDataStream != null)
editor.FillEditor(ArchiveFileInfo.FileDataStream);
else if (ArchiveFileInfo.FileData != null)
editor.FillEditor(ArchiveFileInfo.FileData);
ArchiveFileInfo.FileFormat = File;
}
private void NotifyFormatSwitched()
{
}
private void SaveTextFormat()
{
}
private bool IsConvertableText(Type type)
{
return typeof(IConvertableTextFormat).IsAssignableFrom(type);
}
private void UpdatePropertiesView()
{
STPropertyGrid editor = (STPropertyGrid)GetActiveEditor(typeof(STPropertyGrid));
if (editor == null)
{
editor = new STPropertyGrid();
editor.Dock = DockStyle.Fill;
AddControl(editor);
}
editor.Text = Text;
editor.LoadProperty(ArchiveFileInfo.DisplayProperties);
}
private void UpdateHexView()
{
HexEditor editor = (HexEditor)GetActiveEditor(typeof(HexEditor));
if (editor == null)
{
editor = new HexEditor();
editor.Dock = DockStyle.Fill;
AddControl(editor);
}
editor.Text = Text;
byte[] Data = ArchiveFileInfo.FileData;
if (ArchiveFileInfo.FileDataStream != null)
editor.LoadData(ArchiveFileInfo.FileDataStream);
else
//Only load a certain about of bytes to prevent memory dispose issues
editor.LoadData(Utils.SubArray(Data, 0, 3000));
}
public void AddControl(Control control)
{
foreach (var child in stPanel1.Controls)
if (child is STUserControl)
((STUserControl)child).OnControlClosing();
stPanel1.Controls.Clear();
stPanel1.Controls.Add(control);
}
private void stComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (_IsLoaded && stComboBox1.SelectedIndex != -1)
{
Runtime.ObjectEditor.EditorDiplayIndex = stComboBox1.SelectedIndex;
UpdateEditor();
}
}
private void saveBtn_Click(object sender, EventArgs e)
{
bool IsTextEditor = GetEditor() == 3;
var File = ArchiveFileInfo.FileFormat;
if (IsTextEditor && File != null && IsConvertableText(File.GetType()))
{
if (((IConvertableTextFormat)File).CanConvertBack)
{
TextEditor editor = (TextEditor)GetActiveEditor(typeof(TextEditor));
((IConvertableTextFormat)File).ConvertFromString(editor.GetText());
ArchiveFileInfo.SaveFileFormat();
MessageBox.Show($"Saved {File.FileName} to archive!");
}
else
{
MessageBox.Show($"File format does not support converting back from type: {((IConvertableTextFormat)File).TextFileType}!");
}
}
else if (File != null && File.CanSave)
{
ArchiveFileInfo.SaveFileFormat();
MessageBox.Show($"Saved {File.FileName} to archive!");
}
else
MessageBox.Show($"File format does not support saving!");
}
}
}