Novetus_src/Novetus/NovetusLauncher/Forms/SDK/XMLContentEditor.cs

357 lines
12 KiB
C#

#region Usings
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
#endregion
#region XMLContentType
enum XMLContentType
{
ContentProviders,
PartColors
}
#endregion
#region XML Content Editor
public partial class XMLContentEditor : Form
{
#region Private Variables
public PartColor[] XMLPartColorList;
public Provider[] contentProviders;
List<object> loaderList = new List<object>();
XMLContentType ListType;
#endregion
#region Constructor
public XMLContentEditor()
{
InitializeComponent();
}
#endregion
#region Form Events
private void contentProvidersToolStripMenuItem_Click(object sender, EventArgs e)
{
LoadXML(XMLContentType.ContentProviders);
}
private void partColorsToolStripMenuItem_Click(object sender, EventArgs e)
{
LoadXML(XMLContentType.PartColors);
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveXML();
}
private void deleteRowToolStripMenuItem_Click(object sender, EventArgs e)
{
if (XMLView.Rows.Count == 0)
{
MessageBox.Show("You cannot do this action because no file has been loaded.", "XML Content Editor - File Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (!XMLView.Rows[XMLView.CurrentCell.RowIndex].IsNewRow)
{
XMLView.Rows.RemoveAt(XMLView.CurrentCell.RowIndex);
}
}
private void insertRowToolStripMenuItem_Click(object sender, EventArgs e)
{
if (XMLView.Rows.Count == 0)
{
MessageBox.Show("You cannot do this action because no file has been loaded.", "XML Content Editor - File Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (!XMLView.Rows[XMLView.CurrentCell.RowIndex].IsNewRow)
{
XMLView.Rows.Insert(XMLView.CurrentCell.RowIndex, 1);
}
}
private void reloadCurrentFileToolStripMenuItem_Click(object sender, EventArgs e)
{
if (XMLView.Rows.Count == 0)
{
MessageBox.Show("You cannot do this action because no file has been loaded.", "XML Content Editor - File Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
LoadXML(ListType);
}
//https://stackoverflow.com/questions/14431936/how-to-force-datagridviewcell-to-end-edit-when-row-header-is-clicked/14498870
private void XMLView_MouseClick(object sender, MouseEventArgs e)
{
if (XMLView.HitTest(e.X, e.Y).Type == DataGridViewHitTestType.RowHeader)
{
XMLView.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2;
XMLView.EndEdit();
}
else
{
XMLView.EditMode = DataGridViewEditMode.EditOnEnter;
}
}
private void XMLContentEditor_OnClosing(object sender, FormClosingEventArgs e)
{
DialogResult res = MessageBox.Show("This file may have unsaved changes. Would you like to save?", "XML Content Editor - Save Warning", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
switch (res)
{
case DialogResult.Yes:
SaveXML(true);
break;
case DialogResult.Cancel:
e.Cancel = true;
break;
case DialogResult.No:
default:
break;
}
}
//https://stackoverflow.com/questions/24083959/using-linq-to-get-datagridview-row-index-where-first-column-has-specific-value
private void SearchButton_Click(object sender, EventArgs e)
{
string searchValue = SearchBar.Text;
XMLView.ClearSelection();
XMLView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
bool valueResult = false;
try
{
int index = 0;
var item = XMLView.Rows.Cast<DataGridViewRow>().FirstOrDefault(r => r.Cells[0].Value.ToString().Contains(searchValue, StringComparison.InvariantCultureIgnoreCase));
if (item != null)
{
index = item.Index;
XMLView.Rows[index].Selected = true;
XMLView.FirstDisplayedScrollingRowIndex = index;
valueResult = true;
}
}
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
}
finally
{
if (!valueResult)
{
MessageBox.Show("The item, '" + SearchBar.Text + "', was not found. Please try another term.", "XML Content Editor - Item Not Found");
}
}
}
#endregion
#region Functions
private void LoadXML(XMLContentType type)
{
loaderList.Clear();
switch (type)
{
case XMLContentType.ContentProviders:
if (File.Exists(GlobalPaths.ConfigDir + "\\" + GlobalPaths.ContentProviderXMLName))
{
contentProviders = OnlineClothing.GetContentProviders();
}
else
{
MessageBox.Show("Cannot load the Content Provider list because the Content Provider XML file does not exist.", "XML Content Editor - Content Provider Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
loaderList.AddRange(contentProviders);
break;
case XMLContentType.PartColors:
if (File.Exists(GlobalPaths.ConfigDir + "\\" + GlobalPaths.PartColorXMLName))
{
XMLPartColorList = PartColorLoader.GetPartColors();
}
else
{
MessageBox.Show("Cannot load the Part Color list because the Part Color XML file does not exist.", "XML Content Editor - Part Color Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
loaderList.AddRange(XMLPartColorList);
break;
default:
break;
}
XMLView.Rows.Clear();
XMLView.Columns.Clear();
if (loaderList.Count > 0)
{
if (loaderList.OfType<Provider>().Any())
{
XMLView.ColumnCount = 3;
XMLView.Columns[0].Name = "Name";
XMLView.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable;
XMLView.Columns[1].Name = "URL";
XMLView.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable;
XMLView.Columns[2].Name = "Icon File";
XMLView.Columns[2].SortMode = DataGridViewColumnSortMode.NotSortable;
ListType = XMLContentType.ContentProviders;
}
else if (loaderList.OfType<PartColor>().Any())
{
XMLView.ColumnCount = 3;
XMLView.Columns[0].Name = "Name";
XMLView.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable;
XMLView.Columns[1].Name = "ID";
XMLView.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable;
XMLView.Columns[2].Name = "RGB Value";
XMLView.Columns[2].SortMode = DataGridViewColumnSortMode.NotSortable;
ListType = XMLContentType.PartColors;
}
foreach (var obj in loaderList)
{
if (obj is Provider)
{
Provider pro = obj as Provider;
string[] providerRow = new string[] { pro.Name, pro.URL, pro.Icon };
XMLView.Rows.Add(providerRow);
}
else if (obj is PartColor)
{
PartColor pc = obj as PartColor;
string[] partColorRow = new string[] { pc.ColorRawName, pc.ColorID.ToString(), pc.ColorRGB };
XMLView.Rows.Add(partColorRow);
}
}
}
else
{
MessageBox.Show("Unable to load XML file information because no information exists in the XML file.", "XML Content Editor - File Read Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void SaveXML(bool noReload = false)
{
XMLView.EndEdit();
//https://stackoverflow.com/questions/37145086/datagridview-remove-empty-rows-button
for (int i = XMLView.Rows.Count - 1; i > -1; i--)
{
DataGridViewRow row = XMLView.Rows[i];
if (!row.IsNewRow && row.Cells[0].Value == null)
{
XMLView.Rows.RemoveAt(i);
}
}
List<Provider> providerList = new List<Provider>();
List<PartColor> partColorList = new List<PartColor>();
foreach (DataGridViewRow data in XMLView.Rows)
{
if (data.IsNewRow) continue;
switch (ListType)
{
case XMLContentType.ContentProviders:
Provider pro = new Provider();
pro.Name = data.Cells[0].Value.ToString();
pro.URL = data.Cells[1].Value.ToString();
pro.Icon = data.Cells[2].Value.ToString();
providerList.Add(pro);
break;
case XMLContentType.PartColors:
PartColor pc = new PartColor();
pc.ColorRawName = data.Cells[0].Value.ToString();
pc.ColorID = Convert.ToInt32(data.Cells[1].Value);
pc.ColorRGB = data.Cells[2].Value.ToString();
partColorList.Add(pc);
break;
default:
break;
}
}
//https://stackoverflow.com/questions/2129414/how-to-insert-xml-comments-in-xml-serialization
switch (ListType)
{
case XMLContentType.ContentProviders:
ContentProviders providers = new ContentProviders();
providers.Providers = providerList.ToArray();
XmlSerializer ser = new XmlSerializer(typeof(ContentProviders));
using (FileStream fs = new FileStream(GlobalPaths.ConfigDir + "\\" + GlobalPaths.ContentProviderXMLName, FileMode.Create))
{
XmlWriter writer = XmlWriter.Create(fs, new XmlWriterSettings { Indent = true });
writer.WriteStartDocument();
writer.WriteComment(GenerateComment("content providers"));
ser.Serialize(writer, providers);
writer.WriteEndDocument();
writer.Flush();
}
break;
case XMLContentType.PartColors:
PartColors partColors = new PartColors();
partColors.ColorList = partColorList.ToArray();
XmlSerializer ser2 = new XmlSerializer(typeof(PartColors));
using (FileStream fs = new FileStream(GlobalPaths.ConfigDir + "\\" + GlobalPaths.PartColorXMLName, FileMode.Create))
{
XmlWriter writer = XmlWriter.Create(fs, new XmlWriterSettings { Indent = true });
writer.WriteStartDocument();
writer.WriteComment(GenerateComment("part colors"));
ser2.Serialize(writer, partColors);
writer.WriteEndDocument();
writer.Flush();
}
break;
default:
break;
}
providerList.Clear();
partColorList.Clear();
string fileName = "";
switch (ListType)
{
case XMLContentType.ContentProviders:
fileName = GlobalPaths.ContentProviderXMLName;
break;
case XMLContentType.PartColors:
fileName = GlobalPaths.PartColorXMLName;
break;
default:
break;
}
if (!noReload)
{
MessageBox.Show(fileName + " has been saved! The list will now reload.", "XML Content Editor - File Saved", MessageBoxButtons.OK, MessageBoxIcon.Information);
LoadXML(ListType);
}
else
{
MessageBox.Show(fileName + " has been saved!", "XML Content Editor - File Saved", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//this is completely fucking dumb.
private string GenerateComment(string add)
{
return "Novetus reads through this file in order to grab " + add + " for the Avatar Customization.";
}
#endregion
}
#endregion