public MesEditor(string path) { InitializeComponent(); treeViewLine.HideSelection = false; this.Name = path; treeViewLine.ImageList = imageList1; // groupboxを下にしてツリーをうえにするとサイズの自動計算がおかしい open(path); // mes tree //System.IO.FileInfo info = new System.IO.FileInfo( Mod.FilePath ); TreeNode root = new TreeNode(FileName); root.ImageIndex = root.SelectedImageIndex = 2; // nodeのlistだとセット関係が分からないからnodeのchunkのlistがいるのかなあ if (Original.Type == File.FileType.MES) { //int size = Mod.Chunks.Count; int size = Mod.IDs.Count; for (int i = 0; i < size; ++i) { //File.Chunk chunk = Mod.Chunks[ i ] as File.Chunk; File.Chunk chunk = Mod.Chunks[Mod.IDs[i]] as File.Chunk; File.Node id = chunk.ID; File.Node message = chunk.Message; // 空は編集できないようにする if (message.Original != null && message.Original.Length > 0) { TreeNode node = new TreeNode(id.Original); node.Text = chunk.NodeText; node.Tag = chunk; root.Nodes.Add(node); node.ImageIndex = node.SelectedImageIndex = getNodeImageIndex(id.Original); } } root.Expand(); treeViewLine.Nodes.Add(root); } treeViewLine.AfterSelect += new TreeViewEventHandler(treeViewLine_AfterSelect); treeViewLine.MouseDown += new MouseEventHandler(treeViewLine_MouseDown); textBoxModify.ModifiedChanged += new EventHandler(textBoxModify_ModifiedChanged); textBoxModify.TextChanged += new EventHandler(textBoxModify_TextChanged); toolStripButtonNext.Click += new EventHandler(Next_Click); toolStripButtonRestore.Click += new EventHandler(toolStripButtonRestore_Click); textBoxOriginal.ContextMenu = createMenuOriginal(); textBoxModify.ContextMenu = createMenuModify(); // 右押された時点でフォーカス移さないと右クリックメニュー処理がめんどい //textBoxOriginal.ContextMenu.Popup += new EventHandler( ContextMenu_Popup ); }
void textBoxModify_TextChanged(object sender, EventArgs e) { TextBox box = sender as TextBox; if (box != null) { TreeNode node = box.Tag as TreeNode; if (node != null) { File.Chunk chunk = node.Tag as File.Chunk; File.Node id = chunk.ID; File.Node text = chunk.Message; history.TextChange(chunk.ID.Original, textBoxModify); text.Modify = box.Text; // ここで必要以上に書き戻されるのが少々気になるが・・・ // 書き戻すのは最後のセーブ時にするか? // 重いし node.Text = chunk.NodeText; // image key node.ImageIndex = node.SelectedImageIndex = getNodeImageIndex(chunk.ID.Original); } } }
void toolStripButtonRestore_Click(object sender, EventArgs e) { TreeNode node = textBoxModify.Tag as TreeNode; if (node != null) { File.Chunk chunk = node.Tag as File.Chunk; File.Node text = chunk.Message; text.Modify = text.Original.Clone() as string; textBoxModify.Text = text.Modify; MainForm.setStatus(@"編集前に戻す"); } }
void treeViewLine_AfterSelect(object sender, TreeViewEventArgs e) { if (e.Node != null) { File.Chunk chunk = e.Node.Tag as File.Chunk; if (chunk != null) { textBoxModify.Tag = e.Node; File.Node id = chunk.ID; File.Chunk origin = Original.Chunks[id.Original] as File.Chunk; File.Node otext = origin.Message; File.Node text = chunk.Message; history.NodeChange(chunk.ID.Original); groupBoxID.Text = id.Original; MainForm.setTitle(" - " + FileName + " {" + id.Original + "}"); textBoxOriginal.Text = otext.Original; textBoxModify.Text = text.Modify; // textchangeが呼ばれる //textBoxModify.Modified = false; } } }
void calcProgress(string name, List <ProgressCount> progress, System.Collections.Hashtable ignore) { if (System.IO.Directory.Exists(name) == false) { return; } { // dir part string current = System.IO.Directory.GetCurrentDirectory(); string[] dirs = System.IO.Directory.GetDirectories(name); foreach (string dir in dirs) { if (IOController.validDirectory(dir)) { calcProgress(dir, progress, ignore); } } } { // file part string dname = System.IO.Path.GetFileName(name); dname = dname.ToLower(); if (dname == Path.Data.DialogDirectoryName || dname == Path.Data.MessageDirectoryName) { string[] files = System.IO.Directory.GetFiles(name); foreach (string file in files) { // 除外ファイル if (IOController.validDlgMesFile(file) && ignore.ContainsKey(file) == false) { File ori = new File(); ori.open(file, true); int num = 0; int idnum = ori.IDs.Count; string modpath = Path.Data.ModifiedDirectory + file; bool exist = System.IO.File.Exists(modpath); if (exist) { File mod = new File(); mod.open(modpath, false); int count = 0; // compair for (int i = 0; i < idnum; ++i) { string id = ori.IDs[i] as string; if (id != null) { File.Chunk oc = ori.Chunks[id] as File.Chunk; File.Chunk mc = mod.Chunks[id] as File.Chunk; if (oc != null && mc != null) { // この比較回数を削りたい if (ori.Type == File.FileType.MES) { File.Node omes = oc.Message; File.Node mmes = mc.Message; if (File.checkAvailable(omes.Original)) { ++count; if (omes.Original.CompareTo(mmes.Modify) != 0) { ++num; } } else { //++num; } } else { File.Node omale = oc.MaleLine; File.Node ofemale = oc.FemaleLine; File.Node mmale = mc.MaleLine; File.Node mfemale = mc.FemaleLine; // 二つあるしどういう条件にしようかなと 0.5? // 空はどうするかね // ある程度除外しないとあれだが、その辺はしょうがないのかねえ // だが[E:]みたいなのは、別ファイル参照なので除外してもいいかも // 男女別でカウント if (File.checkAvailable(omale.Original)) { if (omale.Original.CompareTo(mmale.Modify) != 0) { if (File.checkAvailable(ofemale.Original)) { ++count; if (ofemale.Original.CompareTo(mfemale.Modify) != 0) { ++num; } } else { //++num; } } } if (File.checkAvailable(ofemale.Original)) { ++count; if (ofemale.Original.CompareTo(mfemale.Modify) != 0) { ++num; } } else { //++num; } } } } } idnum = count; #if false if (num < idnum) { System.Console.WriteLine("\t" + modpath + ": " + num + " / " + idnum); } else { System.Console.WriteLine(modpath + ": " + num + " / " + idnum); } #endif } else { int count = 0; for (int i = 0; i < idnum; ++i) { string id = ori.IDs[i] as string; if (id != null) { File.Chunk oc = ori.Chunks[id] as File.Chunk; if (oc != null) { // この比較回数を削りたいのう if (ori.Type == File.FileType.MES) { File.Node omes = oc.Message; if (File.checkAvailable(omes.Original)) { ++count; } } else { File.Node omale = oc.MaleLine; File.Node ofemale = oc.FemaleLine; // 二つあるしどういう条件にしようかなと 0.5? // 空はどうするかね // ある程度除外しないとあれだが、その辺はしょうがないのかねえ // だが[E:]みたいなのは、別ファイル参照なので除外してもいいかも // 男女別でカウント if (File.checkAvailable(omale.Original)) { ++count; } if (File.checkAvailable(ofemale.Original)) { ++count; } #if false if (File.checkAvailable(omale.Original) || File.checkAvailable(ofemale.Original)) { ++count; } #endif } } } } idnum = count; } progress.Add(new ProgressCount(file, num, idnum, exist)); } else { //System.Console.WriteLine( "invalid format:" + file ); } incrementProgressBar(); } } } }
public bool open(string path, bool original) { System.IO.FileInfo info = new System.IO.FileInfo(path); if (!info.Exists) { // not found return(false); } switch (info.Extension.ToLower()) { case Path.Ext.DialogExtention: this.Type = FileType.DLG; break; case Path.Ext.MessageExtention: this.Type = FileType.MES; break; default: // not found extension break; } System.Text.Encoding encode = System.Text.Encoding.GetEncoding("shift_jis"); if (original) { encode = System.Text.Encoding.GetEncoding("Windows-1252"); } using (System.IO.StreamReader reader = new System.IO.StreamReader(path, encode)) { string file = reader.ReadToEnd(); bool isJoint = true; //dlg.Substring; int startIndex = 0; int nodecount = 0; int idcount = 0; int type = 0; Chunk chunk = new Chunk(this); for (int index = 0; index < file.Length; ++index) { char p = file[index]; // マルチバイトもちゃんと入る模様 // だがsjisで取るとunicodeに変換されるのでアクサン認識できず // asciiで取るとエンコードミスで?になってしまい認識できず // バイナリで取るしかないのか? //西ヨーロッパ言語で取れば取れるが、 //sjisで保存すると英文字になるなあ //Windows-1252のほうがよさげ?どうせwindowsで作ったんだろうし // iso-8859-1またはWindows-1252でぐぐるとwikipediaに符号表もあるでよ switch (p) { //case '/': // comment out1 case '{': if (isJoint) { string sub = file.Substring(startIndex, index - startIndex); // 節 // 空なら飛ばす if (sub.Length > 0) { //sub = sub.Replace( "}", "" );// 駄目文字誤爆しねえ? File.Node node = new File.Node(this); node.setOriginal(sub, this); node.Modify = node.Original; node.Type = File.Node.NodeType.Joint; node.Editable = false; //this.Nodes.Add( nodecount, node ); this.Nodes.Add(node); ++nodecount; } isJoint = false; // 腹 startIndex = index + 1; } else { // error } break; case '}': if (!isJoint) { string sub = file.Substring(startIndex, index - startIndex); // 腹 //sub = sub.Replace("{","");// 駄目文字誤爆しねえ? File.Node node = new File.Node(this); switch (this.Type) { case FileType.DLG: node.Type = File.DlgState[type]; ++type; type = type % File.DlgState.Length; break; case FileType.MES: node.Type = File.MesState[type]; ++type; type = type % File.MesState.Length; break; default: // error break; } // 節時の改行なんぞで二重にチェックしたいな // しないと03042Blue_Stone_EXA.dlgとか不完全なファイルがあるなあ node.Editable = (node.Type == Node.NodeType.MaleLine || node.Type == Node.NodeType.FemaleLine || node.Type == Node.NodeType.Message); // temp node.setOriginal(sub, this); if (node.Editable) { node.Modify = node.Original.Clone() as string; } else { node.Modify = node.Original; } //this.Nodes.Add( nodecount, node ); this.Nodes.Add(node); //chunk.Key[ ( int )node.Type ] = nodecount; chunk.Keys[( int )node.Type] = node; // dlg or mesでごそっとわけたほうがいいのかね if (node.Type == Node.NodeType.Result || node.Type == Node.NodeType.Message) { #if false // debug // 8文字以上にしてみたよ string filename = System.IO.Path.GetFileNameWithoutExtension(path); if (Type == FileType.MES) { if (chunk.Message.Modify != null && chunk.Message.Modify.Length > 2) { chunk.Message.Modify = filename + "-" + chunk.ID.Original + " " + chunk.Message.Modify; } } else { if (chunk.MaleLine.Modify != null && chunk.MaleLine.Modify.Length > 2) { chunk.MaleLine.Modify = filename + "-" + chunk.ID.Original + " " + chunk.MaleLine.Modify; } if (chunk.FemaleLine.Modify != null && chunk.FemaleLine.Modify.Length > 2) { chunk.FemaleLine.Modify = filename + "-" + chunk.ID.Original + " " + chunk.FemaleLine.Modify; } } #endif // なんか重複IDがあるんだが、バグじゃねえのこれ if (Chunks.ContainsKey(chunk.ID.Original)) { System.Console.WriteLine("[WARINIG] found duplicating ID: " + chunk.ID.Original + " in " + path); } else { IDs.Add(idcount, chunk.ID.Original); ++idcount; Chunks.Add(chunk.ID.Original, chunk.clone()); } chunk.clear(); // deepcopyしないと消えちゃうな } ++nodecount; // endof hara isJoint = true; startIndex = index + 1; } else { // error } break; case '\n': // 条件チェック中 // とりあえずフォーマットがおかしいファイルは限られているのでなんとかなりそう。 if (isJoint) { if (type != ( int )Node.NodeType.ID) { System.Console.WriteLine("[WARINIG] not fullfill elements: " + path); #if true if (chunk.ID != null) { if (Chunks.ContainsKey(chunk.ID.Original)) { System.Console.WriteLine("[WARINIG] found duplicating ID: " + chunk.ID.Original + " in " + path); } else { IDs.Add(idcount, chunk.ID.Original); ++idcount; Chunks.Add(chunk.ID.Original, chunk.clone()); } } chunk.clear(); // deepcopyしないと消えちゃうな type = 0; #endif } } break; default: break; } } // 腹のままならエラー if (!isJoint) { MainForm.setStatus("構文エラー: " + path); //return false; } // chunkも中途半端だと足したいが、そもそもそれはデータがおかしいような // 最後の残り if (startIndex < (file.Length - 1)) { string sub = file.Substring(startIndex); // 節 // 空なら飛ばす if (sub.Length > 0) { //sub = sub.Replace( "}", "" );// 駄目文字誤爆しねえ? File.Node node = new File.Node(this); node.setOriginal(sub, this); node.Modify = node.Original; node.Type = File.Node.NodeType.Joint; node.Editable = false; //this.Nodes.Add( nodecount, node ); this.Nodes.Add(node); //++count; } //startIndex = index; } // 変なデータだとエラーチェックめんどくさそうだなあ } if (original) { // read onlyにしたいが…アクセッサでなんとかしろと? #if false foreach (File.Node node in this.Nodes) { } #endif } this.FilePath = path; this.IsOriginal = original; return(true); }