using System; using System.Collections.Generic; using System.Data; using System.IO; namespace HändlerEditor.Code { /// /// Class for Shine Tables. /// public partial class ShineTable { #region Variablen und Konstructoren public readonly List CommentHeader; public readonly List FileHeader; private int _curTable; private bool _eof; private string _fileName; private StreamReader _srFile; private bool _stop; private StreamWriter _swFile; private List _tables; public ShineTable() { _fileName = ""; _stop = false; _eof = false; _srFile = null; _swFile = null; FileHeader = new List(); CommentHeader = new List(); _tables = new List
(); _curTable = 0; } /// /// List of ShineTable.Table's in the opened File. /// public IEnumerable
Tables { get { return _tables; } } #endregion #region Open und Save /// /// Opens a Shine Table File. /// /// Path to the File public void Open(string fileName) { _fileName = fileName; ResetValues(); _tables = new List
(); if (_srFile != null) _srFile.Close(); _srFile = new StreamReader(_fileName); ReadFile(); _curTable = 0; } /// /// Saves a Shine Table File. /// /// Path to the File public void Save(string fileName) { _fileName = fileName; if (File.Exists(_fileName + ".bak")) File.Delete(_fileName + ".bak"); if (File.Exists(_fileName)) { File.Copy(_fileName, _fileName + ".bak"); File.Delete(_fileName); } var tmp = File.Create(_fileName); tmp.Close(); _swFile = new StreamWriter(_fileName); foreach (var str in FileHeader) _swFile.WriteLine(str); foreach (var str in CommentHeader) _swFile.WriteLine(str); _swFile.Flush(); _swFile.AutoFlush = true; foreach (var tData in _tables) { _swFile.WriteLine(); _swFile.WriteLine(tData.NameLine); _swFile.WriteLine(tData.TypeLine); _swFile.WriteLine(tData.CollumnNameLine); foreach (DataRow drData in tData.Content.Rows) { _swFile.Write("#Record"); foreach (var oData in drData.ItemArray) { if (oData == DBNull.Value) { _swFile.Write("\t" + ""); } else _swFile.Write("\t" + (string) oData); } _swFile.WriteLine(); } foreach (var comment in tData.Comments) _swFile.WriteLine(comment); _swFile.Flush(); } _swFile.WriteLine("#end"); _swFile.Close(); } #endregion #region alte Funktionen... private void NextTable() { _curTable++; if (_curTable >= _tables.Count) _curTable = _tables.Count - 1; } #endregion #region private Helfer funktionen private void ResetValues() { _eof = false; _stop = false; } private bool Reading() { return (!(_eof || _stop || _srFile.EndOfStream)); } #endregion #region Verarbeitung der Datei private void ReadFile() { string line; // Verarbeite Datei while (Reading()) { line = _srFile.ReadLine(); if (line != null) { var rec = line.Split('\t'); var inx = 0; for (var i = 0; i < rec.Length; ++i) if (rec[i].StartsWith("#")) inx = i; #region Verarbeitung switch (rec[inx].ToLower()) { // Ende der Datei case "#end": ProcessEnd(); break; // Definition der Spalten-Typen (wird vorerst nur gespeichert, um danach ganze datei speichern zu können) case "#columntype": ProcessColumntype(line); break; case "#columnname": ProcessColumnname(line); break; // Beginn einer neuen Tabelle case "#table": ProcessTable(line, rec, inx); break; // Begin einer neuen Zeile case "#recordin": ProcessRecordin(rec); break; case "#record": ProcessRecord(rec, inx); break; default: ProcessDefault(line, rec, inx); break; } } #endregion } _srFile.Close(); } #region Verarbeitungs-Funktionen /// /// Processes a #End line /// private void ProcessEnd() { _eof = true; // Ende der Datei } /// /// Processes a #Columntype line. /// /// Complete line wich starts with "#Columntype" private void ProcessColumntype(string line) { _tables[_curTable].TypeLine = line; while (_tables[_curTable].TypeLine.StartsWith("\t")) _tables[_curTable].TypeLine = _tables[_curTable].TypeLine.Remove(0, 1); } /// /// Processes a #Columnname line /// /// Complete line private void ProcessColumnname(string line) { var rec = line.Split("\t\n".ToCharArray()); var y = 0; foreach (var str in rec) { if (!str.StartsWith("#")) if (!_tables[_curTable].Content.Columns.Contains(str)) if (!str.StartsWith(";")) if (str == "") { _tables[_curTable].Content.Columns.Add("Empty" + y); ++y; } else _tables[_curTable].Content.Columns.Add(str); } _tables[_curTable].CollumnNameLine = line; while (_tables[_curTable].CollumnNameLine.StartsWith("\t")) _tables[_curTable].CollumnNameLine = _tables[_curTable].CollumnNameLine.Remove(0, 1); } /// /// Processes a #table line /// /// /// /// private void ProcessTable(string line, string[] rec, int inx) { var dt = new Table {Name = rec[inx + 1], Content = new DataTable()}; _tables.Add(dt); NextTable(); _tables[_curTable].NameLine = line; while (_tables[_curTable].NameLine.StartsWith("\n")) _tables[_curTable].NameLine = _tables[_curTable].NameLine.Remove(0, 1); } /// /// Processes a #recordin line /// /// private void ProcessRecordin(string[] rec) { // TODO: BUG int nextVal; for (nextVal = 1; nextVal < rec.Length; nextVal++) if (rec[nextVal] != "") break; var tab = new Table(); foreach (var table in _tables) if (table.Name == rec[nextVal]) tab = table; var dData = tab.Content.NewRow(); var x = 0; for (var i = nextVal + 1; i < rec.Length; i++) { if (x < tab.Content.Columns.Count) { dData[x + 1] = rec[i]; x++; } } tab.Content.Rows.Add(dData); } /// /// processes a unknown line /// /// /// /// private void ProcessDefault(string line, string[] rec, int inx) { if (_tables.Count >= 1) { // nur fals tabellen vorhanden sind if (rec[inx].StartsWith(";") || rec[inx].Contains(";")) _tables[_curTable].Comments.Add(line); } else if (rec[inx].StartsWith(";")) CommentHeader.Add(line); else FileHeader.Add(line); } /// /// processes a #record line /// /// /// private void ProcessRecord(string[] rec, int inx) { var drData = _tables[_curTable].Content.NewRow(); var u = 0; for (var i = inx + 1; i < rec.Length; i++) { if (u < _tables[_curTable].Content.Columns.Count) { drData[u] = rec[i]; u++; } } _tables[_curTable].Content.Rows.Add(drData); } #endregion #endregion public void AddTable(Table tab) { _tables.Add(tab); } } }