Exemple #1
0
        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 );
        }
Exemple #2
0
        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);
                }
            }
        }
Exemple #3
0
        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(@"編集前に戻す");
            }
        }
Exemple #4
0
        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;
                }
            }
        }
Exemple #5
0
        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();
                    }
                }
            }
        }
Exemple #6
0
        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);
        }