Exemplo n.º 1
0
        void Replace(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(azukiBefore.Text))
            {
                MessageBox.Show(
                    "置換前のテキストが入力されていません。",
                    "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (!fileListView.ListValid)
            {
                Progress.Clear();

                Find(sender, e);

                if (Progress.Canceled)
                {
                    // error message has been already shown
                    return;
                }
            }

            if (fileListView.CheckedItems.Count == 0)
            {
                MessageBox.Show(
                    "置換するファイルがありません。",
                    "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (InformAfterTextEmpty && string.IsNullOrEmpty(azukiAfter.Text))
            {
                string msg = "置換後のテキストが入力されていません。置換を実行しますか?\n\n" +
                             string.Format("対象ファイル: {0} 件 ({1} 件中)\nバックアップ: {2}\n正規表現: {3}",
                                           fileListView.CheckedItems.Count, fileListView.Items.Count,
                                           BackupArgs.Enabled ? "する" : "しない",
                                           cbRegex.Checked ? "適用する" : "適用しない");
                DialogResult dr = MessageBox.Show(
                    msg, "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);
                if (dr != DialogResult.Yes)
                {
                    return;
                }
            }
            else if (InformBeforeReplace) // 'else if' to avoid inquiring twice in succession
            {
                string msg = "置換を開始します。よろしいですか?\n\n" +
                             string.Format("対象ファイル: {0} 件 ({1} 件中)\nバックアップ: {2}\n正規表現: {3}",
                                           fileListView.CheckedItems.Count, fileListView.Items.Count,
                                           BackupArgs.Enabled ? "する" : "しない",
                                           cbRegex.Checked ? "適用する" : "適用しない");
                DialogResult dr = MessageBox.Show(
                    msg, "確認", MessageBoxButtons.YesNo, MessageBoxIcon.None);
                if (dr != DialogResult.Yes)
                {
                    return;
                }
            }

            btnReplace.Enabled = false;

            int _fileListView_CheckedItems_Count = fileListView.CheckedItems.Count;

            if (!fileListView.ListValid)
            {
                this.Find(sender, e);
                if (!fileListView.ListValid)
                {
                    btnReplace.Enabled = true;
                    return;
                }
            }

            _dirPath        = DirPath;
            _pattern        = Pattern;
            _beforeText     = BeforeText;
            _afterText      = AfterText;
            _inclSubDir     = InclSubDir;
            _regEx          = RegexEnabled;
            _encNumber      = EncNumber;
            _regExMultiline = RegexMultiline;

            // copy of reference is not approved
            _fileListView.ListValid = fileListView.ListValid;
            _fileListView.Items.Clear();
            foreach (ListViewItem item in fileListView.Items)
            {
                _fileListView.Items.Add(item.Clone() as ListViewItem);
            }

            Progress.Clear();

            using (BackgroundWorker bw = new BackgroundWorker())
            {
                bw.WorkerReportsProgress      = true;
                bw.WorkerSupportsCancellation = true;
                bw.DoWork += new DoWorkEventHandler(DoReplaceBkgnd);

                // progress dialog
                progressDialog      = new ProgressDialog(bw, Progress);
                progressDialog.Text = "置換中...";

                bw.RunWorkerAsync();
            }

            ProgressDialogResult result = progressDialog.ShowDialog();

            if (_fileListView != null)
            {
                fileListView.ListValid = _fileListView.ListValid;
                fileListView.Items.Clear();
                foreach (ListViewItem item in _fileListView.Items)
                {
                    fileListView.Items.Add(item.Clone() as ListViewItem);
                }
            }

            if (result == ProgressDialogResult.Success)
            {
                fileListView.ListValid = _fileListView.ListValid;
                fileListView.Items.Clear();
                foreach (ListViewItem item in _fileListView.Items)
                {
                    fileListView.Items.Add(item.Clone() as ListViewItem);
                }
                if (Progress.ErrorOccured)
                {
                    Progress.ErrorDescription = "アクセスできないファイルは無視されました。\n" +
                                                "バックアップエラーだけであれば、置換は行われています。";
                    ErrorDialog dialog = new ErrorDialog(Progress);
                    if (dialog.ShowDialog() == DialogResult.OK)
                    {
                        fileListView.ListValid = true;
                    }
                    else
                    {
                        fileListView.ListValid = false;
                    }
                }

                btnReplace.Enabled = true;
                btnReplace.Focus();

                if (InformAfterReplace)
                {
                    int    fileNum = fileListView.Items[0].Checked ? fileListView.Items.Count : 0;
                    string msg     = "置換が完了しました。\n\n" +
                                     string.Format("置換に成功したファイル: {0} 件\n置換に失敗したファイル: {1} 件",
                                                   _fileListView_CheckedItems_Count - fileListView.CheckedItems.Count,
                                                   fileListView.CheckedItems.Count);
                    MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else if (result == ProgressDialogResult.Failure)
            {
                Progress.ErrorDescription = "置換に失敗しました。";
                ErrorDialog dialog = new ErrorDialog(Progress);
                dialog.ShowDialog();

                btnReplace.Enabled = true;
                btnReplace.Focus();
            }
        }
Exemplo n.º 2
0
        void Find(object sender, EventArgs e)
        {
            azukiAfter.UpdateNewlineChars();
            azukiBefore.UpdateNewlineChars();

            if (!Directory.Exists(DirPath))
            {
                MessageBox.Show("存在しないフォルダです。", "エラー",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (string.IsNullOrEmpty(Pattern))
            {
                MessageBox.Show("フィルタが入力されていません。", "エラー",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (InformBeforeTextEmpty && string.IsNullOrEmpty(BeforeText))
            {
                string msg = "置換前のテキストが入力されていません。検索を実行しますか?\n\n" +
                             string.Format("場所: {0}\nサブフォルダ: {1}\nフィルタ: {2}\n文字コード: {3}\n正規表現: {4}",
                                           tbDirPath.Text, cbSubDir.Checked ? "含める" : "含めない",
                                           tbPattern.Text, comboBoxEnc.SelectedItem.ToString(),
                                           cbRegex.Checked ? "適用する" : "適用しない");
                DialogResult dr = MessageBox.Show(
                    msg, "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);
                if (dr != DialogResult.Yes)
                {
                    return;
                }
            }
            else if (InformBeforeSearch) // 'else if' to avoid inquiring twice in succession
            {
                string msg = "検索を開始します。よろしいですか?\n\n" +
                             string.Format("場所: {0}\nサブフォルダ: {1}\nフィルタ: {2}\n文字コード: {3}\n正規表現: {4}",
                                           tbDirPath.Text, cbSubDir.Checked ? "含め" : "含めない",
                                           tbPattern.Text, comboBoxEnc.SelectedItem.ToString(),
                                           cbRegex.Checked ? "適用する" : "適用しない");
                DialogResult dr = MessageBox.Show(
                    msg, "確認", MessageBoxButtons.YesNo, MessageBoxIcon.None);
                if (dr != DialogResult.Yes)
                {
                    return;
                }
            }

            fileListView.AzukiBefore  = azukiBefore;
            fileListView.AzukiAfter   = azukiAfter;
            fileListView.RegexEnabled = RegexEnabled;
            fileListView.RegexOptions = RegexMultiline ? RegexOptions.Multiline : RegexOptions.Singleline;  // do not use |=

            _dirPath        = DirPath;
            _pattern        = Pattern;
            _beforeText     = BeforeText;
            _inclSubDir     = InclSubDir;
            _inclHiddenDir  = InclHiddenDir;
            _inclHiddenFile = InclHiddenFile;
            _regEx          = RegexEnabled;
            _encNumber      = EncNumber;
            _regExMultiline = RegexMultiline;

            btnFind.Enabled = false;
            fileListView.Items.Clear();

            Progress.Clear();

            using (BackgroundWorker bw = new BackgroundWorker())
            {
                bw.WorkerReportsProgress      = true;
                bw.WorkerSupportsCancellation = true;
                bw.DoWork += new DoWorkEventHandler(DoFindBkgnd);

                progressDialog      = new ProgressDialog(bw, Progress);
                progressDialog.Text = "検索中...";

                bw.RunWorkerAsync();
            }

            ProgressDialogResult result = progressDialog.ShowDialog();

            if (result == ProgressDialogResult.Success)
            {
                fileListView.Items.Clear();
                foreach (ListViewItem item in _fileListView.Items)
                {
                    fileListView.Items.Add(item.Clone() as ListViewItem);
                }
                fileListView.ListValid = _fileListView.ListValid;
            }

            btnFind.Enabled = true;

            if (btnReplace.Enabled)
            {
                btnReplace.Focus();
            }
            else
            {
                btnFind.Focus();
            }

            if (Progress.Canceled)
            {
                Progress.ErrorDescription = "処理が中断されました。";
                ErrorDialog dialog = new ErrorDialog(Progress);
                dialog.ShowDialog();
                fileListView.ListValid = false;
            }
            else
            {
                if (Progress.ErrorOccured)
                {
                    Progress.ErrorDescription = "アクセスできないファイルまたはフォルダがありました。" + Environment.NewLine + "または、その他のエラーが発生しました。";
                    ErrorDialog dialog = new ErrorDialog(Progress);
                    dialog.ShowDialog();

                    if (fileListView.Items.Count > 0 &&
                        !string.IsNullOrEmpty(fileListView.Items[0].SubItems[1].Text))
                    {
                        fileListView.ListValid = true;
                    }
                    else
                    {
                        fileListView.ListValid = false;
                    }
                }
                if (InformAfterSearch)
                {
                    int    fileNum = fileListView.Items[0].Checked ? fileListView.Items.Count : 0;
                    string msg     = "検索が完了しました。\n\n" +
                                     string.Format("見つかったファイル: {0} 件", fileNum);
                    MessageBox.Show(msg, "確認", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }