//----------------------------------- // ヒストリーデータの初期化 //----------------------------------- private void InitHistoryData() { // ヒストリーデータがない場合のみ初期値をセット if (Instance.ArrayHistoryEditedFiles.Count > 0) { foreach (AppHistory data in Instance.ArrayHistoryEditedFiles) { // どうやらXMLファイルを読んだときに空の要素が1つ作られてしまうため // 最初の1つの要素の内容を精査する。 if (File.Exists(data.md) == true) { return; } } } //初期CSSディレクトリ string CssDirPath = Path.Combine(AppDataPath, "css"); Instance.ArrayHistoryEditedFiles.Clear(); AppHistory histroy = new AppHistory(); histroy.md = Path.Combine(AppDataPath, "help.md"); histroy.css = Path.Combine(CssDirPath, "hibara.org.css"); Instance.ArrayHistoryEditedFiles.Add(histroy); histroy = new AppHistory(); histroy.md = Path.Combine(AppDataPath, "sample.md"); histroy.css = Path.Combine(CssDirPath, "github.css"); Instance.ArrayHistoryEditedFiles.Add(histroy); }
//----------------------------------- // ヒストリーデータの初期化 // Initialize history data //----------------------------------- private void InitHistoryData() { // ヒストリーデータがない場合のみ初期値をセット // Set default data when history data do no exists if (Instance.ArrayHistoryEditedFiles.Count > 0) { foreach (AppHistory data in Instance.ArrayHistoryEditedFiles) { // どうやらXMLファイルを読んだときに空の要素が1つ作られてしまうため、最初の1つの要素の内容を精査する // Inspect first element because blank element is created when XML file is read. if (File.Exists(data.md) == true) { return; } } } //初期CSSディレクトリ //Initial directory of CSS files. string CssDirPath = Path.Combine(AppDataPath, "css"); Instance.ArrayHistoryEditedFiles.Clear(); AppHistory histroy = new AppHistory(); // Check culture if (Thread.CurrentThread.CurrentCulture.Name.StartsWith("ja") == true) { //Japanese first histroy = new AppHistory(); histroy.md = Path.Combine(AppDataPath, "help-ja.md"); histroy.css = Path.Combine(CssDirPath, "hibara.org.css"); Instance.ArrayHistoryEditedFiles.Add(histroy); histroy = new AppHistory(); histroy.md = Path.Combine(AppDataPath, "help.md"); histroy.css = Path.Combine(CssDirPath, "hibara.org.css"); Instance.ArrayHistoryEditedFiles.Add(histroy); } else { //Default English histroy = new AppHistory(); histroy.md = Path.Combine(AppDataPath, "help.md"); histroy.css = Path.Combine(CssDirPath, "hibara.org.css"); Instance.ArrayHistoryEditedFiles.Add(histroy); histroy = new AppHistory(); histroy.md = Path.Combine(AppDataPath, "help-ja.md"); histroy.css = Path.Combine(CssDirPath, "hibara.org.css"); Instance.ArrayHistoryEditedFiles.Add(histroy); } histroy = new AppHistory(); histroy.md = Path.Combine(AppDataPath, "sample.md"); histroy.css = Path.Combine(CssDirPath, "github.css"); Instance.ArrayHistoryEditedFiles.Add(histroy); }
//----------------------------------- // ヒストリーデータの整理(重複削除) // Remove history data if there is a duplicate data. //----------------------------------- public void OptimizeHistoryData() { int ArrayHistoryFilesLimit = 20; for (int i = 0; i < Instance.ArrayHistoryEditedFiles.Count; i++) { AppHistory HistoryData = (AppHistory)Instance.ArrayHistoryEditedFiles[i]; for (int c = i + 1; c < Instance.ArrayHistoryEditedFiles.Count; c++) { AppHistory item = (AppHistory)Instance.ArrayHistoryEditedFiles[c]; if (HistoryData.md == item.md) { Instance.ArrayHistoryEditedFiles.RemoveAt(c); } } } // 制限数を超えたペアは古いものから削除する // Remove older data when limit of history data is over. if (Instance.ArrayHistoryEditedFiles.Count > ArrayHistoryFilesLimit) { Instance.ArrayHistoryEditedFiles.RemoveRange( ArrayHistoryFilesLimit, Instance.ArrayHistoryEditedFiles.Count - ArrayHistoryFilesLimit - 1); } }
//----------------------------------- // ヒストリーデータの整理(重複削除) //----------------------------------- public void OptimizeHistoryData() { int ArrayHistoryFilesLimit = 20; //重複データがあれば削除する for (int i = 0; i < Instance.ArrayHistoryEditedFiles.Count; i++) { AppHistory HistoryData = (AppHistory)Instance.ArrayHistoryEditedFiles[i]; for (int c = i + 1; c < Instance.ArrayHistoryEditedFiles.Count; c++) { AppHistory item = (AppHistory)Instance.ArrayHistoryEditedFiles[c]; if (HistoryData.md == item.md) { Instance.ArrayHistoryEditedFiles.RemoveAt(c); } } } // 制限数を超えたペアは古いものから削除する if (Instance.ArrayHistoryEditedFiles.Count > ArrayHistoryFilesLimit) { Instance.ArrayHistoryEditedFiles.RemoveRange( ArrayHistoryFilesLimit, Instance.ArrayHistoryEditedFiles.Count - 1); } }
//---------------------------------------------------------------------- // OpenFile [ .mdファイルを開く ] //---------------------------------------------------------------------- private bool OpenFile(string FilePath, bool fOpenDialog = false) { //引数 FilePath = "" の場合は「無題」編集で開始する // Argument "FilePath" = "" => Start editing in 'no title' if (FilePath == "") { _fNoTitle = true; // No title flag } else { _fNoTitle = false; } //----------------------------------- //編集中のファイルがある if (richTextBox1.Modified == true) { //"問い合わせ" //"編集中のファイルがあります。保存してから終了しますか?" //"Question" //"This file being edited. Do you wish to save before exiting?" DialogResult ret = MessageBox.Show(Resources.MsgSaveFileToEnd, Resources.DialogTitleQuestion, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (ret == DialogResult.Yes) { if (SaveToEditingFile() == false) { //キャンセルで抜けてきた //Cancel return (false); } } else if (ret == DialogResult.Cancel) { return (false); } //編集履歴に残す //Save file path to editing history foreach (AppHistory data in MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles) { if (data.md == _MarkDownTextFilePath) { //いったん削除して ( delete once ... ) MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Remove(data); break; } } AppHistory HistroyData = new AppHistory(); HistroyData.md = _MarkDownTextFilePath; HistroyData.css = _SelectedCssFilePath; MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Insert(0, HistroyData); //先頭に挿入 ( Insert at the top ) } //----------------------------------- //オープンダイアログ表示 //View open file dialog if (fOpenDialog == true) { if (File.Exists(_MarkDownTextFilePath) == true) { //編集中のファイルがあればそのディレクトリを初期フォルダーに //Set parent directory of editing file to initial folder openFileDialog1.InitialDirectory = Path.GetDirectoryName(_MarkDownTextFilePath); //テンポラリファイルがあればここで削除 //Delete it if temporary file exists Delete_TemporaryHtmlFilePath(); } openFileDialog1.FileName = ""; if (openFileDialog1.ShowDialog() == DialogResult.OK) { FilePath = openFileDialog1.FileName; } else { return (false); } } //編集中のファイルパスとする //Set this file to 'editing file' path _MarkDownTextFilePath = FilePath; //----------------------------------- //文字コードを調査するためにテキストファイルを開く //Detect encoding if (_fNoTitle == false) { byte[] bs; using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read)) { bs = new byte[fs.Length]; fs.Read(bs, 0, bs.Length); } //文字コードを取得する //Get charcter encoding _EditingFileEncoding = GetCode(bs); } else { //「無題」はデフォルトのエンコーディング // Set this file to default encoding in 'No title' _EditingFileEncoding = Encoding.UTF8; } //ステータスバーに表示 //View in statusbar toolStripStatusLabelTextEncoding.Text = _EditingFileEncoding.EncodingName; //編集中のエンコーディングを使用する(&D)か //Use encoding of editing file if (MarkDownSharpEditor.AppSettings.Instance.HtmlEncodingOption == 0) { toolStripStatusLabelHtmlEncoding.Text = _EditingFileEncoding.EncodingName; } //----------------------------------- //ペアとなるCSSファイルがあるか探索してあれば適用する //Apply that the pair CSS file to this file exists foreach (AppHistory data in MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles) { if (data.md == _MarkDownTextFilePath) { if (File.Exists(data.css) == true) { _SelectedCssFilePath = data.css; break; } } } //選択中のCSSファイル名をステータスバーに表示 //View selected CSS file name to stausbar if (File.Exists(_SelectedCssFilePath) == true) { toolStripStatusLabelCssFileName.Text = Path.GetFileName(_SelectedCssFilePath); } else { toolStripStatusLabelCssFileName.Text = Resources.toolTipCssFileName; //"CSSファイル指定なし"; ( not selected CSS file) } _fConstraintChange = true; richTextBox1.Clear(); //RichEditBoxの「フォント」設定 // richTextBox1 font name setting var obj = MarkDownSharpEditor.AppSettings.Instance; FontConverter fc = new FontConverter(); try { richTextBox1.Font = (Font)fc.ConvertFromString(obj.FontFormat); } catch { } //RichEditBoxの「フォントカラー」設定 // richTextBox1 font color setting richTextBox1.ForeColor = Color.FromArgb(obj.richEditForeColor); //View them in statusbar toolStripStatusLabelFontInfo.Text = richTextBox1.Font.Name + "," + richTextBox1.Font.Size.ToString() + "pt"; //----------------------------------- //テキストファイルの読み込み //Read text file if (File.Exists(FilePath) == true) { richTextBox1.Text = File.ReadAllText(FilePath, _EditingFileEncoding); } richTextBox1.BeginUpdate(); richTextBox1.SelectionStart = richTextBox1.Text.Length; richTextBox1.ScrollToCaret(); //richTextBox1の全高さを求める //Get height of richTextBox1 ( for webBrowser sync ) _richEditBoxInternalHeight = richTextBox1.VerticalPosition; //カーソル位置を戻す //Restore cursor position richTextBox1.SelectionStart = 0; richTextBox1.EndUpdate(); //変更フラグOFF richTextBox1.Modified = false; //Undoバッファに追加 //Add all text to undo buffer UndoBuffer.Clear(); UndoBuffer.Add(richTextBox1.Rtf); undoCounter = UndoBuffer.Count; //プレビュー更新 PreviewToBrowser(); _fConstraintChange = false; FormTextChange(); return (true); }
//====================================================================== //----------------------------------- //「新しいファイルを開く」メニュー // "New file" menu //----------------------------------- private void menuNewFile_Click(object sender, EventArgs e) { if (richTextBox1.Modified == true) { //"問い合わせ" //"編集中のファイルがあります。保存してから新しいファイルを開きますか?" //"Question" //"This file being edited. Do you wish to save before starting new file?" DialogResult ret = MessageBox.Show(Resources.MsgSaveFileToNewFile, Resources.DialogTitleQuestion, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (ret == DialogResult.Yes) { if (SaveToEditingFile() == true) { _fNoTitle = false; //無題フラグOFF } else { //キャンセルで抜けてきた //Cancel return; } } else if (ret == DialogResult.Cancel) { return; } } //前の編集していたテンポラリを削除する //Delete edited temporary file before Delete_TemporaryHtmlFilePath(); //無題ファイルのまま編集しているのなら削除 //Delete it if the file is no title if (_fNoTitle == true) { if (File.Exists(_MarkDownTextFilePath) == true) { try { File.Delete(_MarkDownTextFilePath); } catch { } } } //編集履歴に残す //Add editing history if (File.Exists(_MarkDownTextFilePath) == true) { foreach (AppHistory data in MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles) { if (data.md == _MarkDownTextFilePath) { //いったん削除して ( delete once ... ) MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Remove(data); break; } } AppHistory HistroyData = new AppHistory(); HistroyData.md = _MarkDownTextFilePath; HistroyData.css = _SelectedCssFilePath; MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Insert(0, HistroyData); //先頭に挿入 } _fConstraintChange = true; //ブラウザを空白にする //Be blank in browser webBrowser1.Navigate("about:blank"); //テンポラリファイルがあれば削除 //Delete it if temporary file exists Delete_TemporaryHtmlFilePath(); //編集中のファイル情報をクリア //Clear the infomation of editing file _MarkDownTextFilePath = ""; //「無題」編集開始 //Start to edit in no title _fNoTitle = true; richTextBox1.Text = ""; richTextBox1.Modified = false; FormTextChange(); _fConstraintChange = false; }
//---------------------------------------------------------------------- // フォームを表示 // View Main form //---------------------------------------------------------------------- private void Form1_Shown(object sender, EventArgs e) { string DirPath = MarkDownSharpEditor.AppSettings.GetAppDataLocalPath(); ArrayList FileArray = new ArrayList(); //TODO: 「新しいウィンドウで開く」="/new"などの引数も含まれるので、 // その辺りの処理も将来的に入れる。 //コマンドラインでファイルが投げ込まれてきている //Launch with arguments string[] cmds = System.Environment.GetCommandLineArgs(); for (int i = 1; i < cmds.Count(); i++) { if (File.Exists(cmds[i]) == true) { FileArray.Add(cmds[i]); } } try { if (FileArray.Count > 1) { //"問い合わせ" //"複数のファイルが読み込まれました。\n現在の設定内容でHTMLファイルへの一括変換を行いますか? //「いいえ」を選択するとそのまますべてのファイル開きます。" //"Question" //"More than one were read.\nDo you wish to convert all files to HTML files on this options?\n // if you select 'No', all files will be opend without converting." DialogResult ret = MessageBox.Show(Resources.MsgConvertAllFilesToHTML, Resources.DialogTitleQuestion, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information); if (ret == DialogResult.Yes) { //一括でHTMLファイル出力 //Output HTML files in batch process BatchOutputToHtmlFiles((String[])FileArray.ToArray(typeof(string))); return; } else if (ret == DialogResult.Cancel) { //キャンセル //Cancel return; } else { //「いいえ」 // "NO" button bool fOpen = false; foreach (string FilePath in FileArray) { //最初のファイルだけ、このウィンドウだけ開く //First file open in this window if (fOpen == false) { richTextBox1.Modified = false; OpenFile(FilePath); fOpen = true; } else { //他の複数ファイルは順次新しいウィンドウで開く //Other files open in new windows System.Diagnostics.Process.Start( Application.ExecutablePath, string.Format("{0}", FilePath)); } } } } else if (FileArray.Count == 1) { richTextBox1.Modified = false; OpenFile((string)FileArray[0]); } else { //前に編集していたファイルがあればそれを開く //Open it if there is editing file before if (MarkDownSharpEditor.AppSettings.Instance.fOpenEditFileBefore == true) { if (MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Count > 0) { AppHistory EditedFilePath = new AppHistory(); EditedFilePath = (AppHistory)MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles[0]; if (File.Exists(EditedFilePath.md) == true) { _TemporaryHtmlFilePath = ""; richTextBox1.Modified = false; OpenFile(EditedFilePath.md); return; } } } if (_MarkDownTextFilePath == "") { //無ければ「無題」ファイル // "No title" if no file exists richTextBox1.Modified = false; OpenFile(""); } } } finally { _fConstraintChange = false; //SyntaxHighlighter if (backgroundWorker2.IsBusy == false) { //backgroundWorker2.WorkerReportsProgress = true; backgroundWorker2.RunWorkerAsync(richTextBox1.Text); } richTextBox1.Modified = false; //フォームタイトル更新 / Refresh form caption FormTextChange(); } }
//---------------------------------------------------------------------- // フォームを表示 //---------------------------------------------------------------------- private void Form1_Shown(object sender, EventArgs e) { string DirPath = MarkDownSharpEditor.AppSettings.GetAppDataLocalPath(); ArrayList FileArray = new ArrayList(); //TODO: 「新しいウィンドウで開く」="/new"などの引数も含まれるので、 // その辺りの処理も将来的に入れる。 //コマンドラインでファイルが投げ込まれてきている string[] cmds = System.Environment.GetCommandLineArgs(); for ( int i = 1; i < cmds.Count(); i++ ) { if (File.Exists(cmds[i]) == true) { FileArray.Add(cmds[i]); } } try { if (FileArray.Count > 1) { DialogResult ret = MessageBox.Show("複数のファイルが読み込まれました。\n" + "現在の設定内容でHTMLファイルへの一括変換を行いますか?", "問い合わせ", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information); if (ret == DialogResult.Yes) { //一括でHTMLファイル出力 BatchOutputToHtmlFiles((String[])FileArray.ToArray(typeof(string))); return; } else if (ret == DialogResult.Cancel) { //キャンセル return; } else { //「いいえ」 bool fOpen = false; foreach (string FilePath in FileArray) { //最初のファイルだけ、このウィンドウだけ開く if (fOpen == false) { OpenFile(FilePath); fOpen = true; } else { //他の複数ファイルは順次新しいウィンドウで開く System.Diagnostics.Process.Start( Application.ExecutablePath, string.Format("{0}", FilePath)); } } } } else if ( FileArray.Count == 1 ) { OpenFile((string)FileArray[0]); } else { //前に編集していたファイルがあればそれを開く if (MarkDownSharpEditor.AppSettings.Instance.fOpenEditFileBefore == true) { if (MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Count > 0) { AppHistory EditedFilePath = new AppHistory(); EditedFilePath = (AppHistory)MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles[0]; if (File.Exists(EditedFilePath.md) == true) { TemporaryHtmlFilePath = ""; OpenFile(EditedFilePath.md); return; } } } if (MarkDownTextFilePath == "") { //無ければ「無題」ファイル OpenFile(CreateNoTitleFilePath()); } } } finally { fConstraintChange = false; //エディター側のSyntaxHighlighter反映 SyntaxHightlighterWidthRegex(0); richTextBox1.Modified = false; //フォームタイトル更新 FormTextChange(); } }
//---------------------------------------------------------------------- //フォームを閉じる前イベント //---------------------------------------------------------------------- private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (richTextBox1.Modified == true) { DialogResult ret = MessageBox.Show("編集中のファイルがあります。保存してから終了しますか?", "問い合わせ", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information); if (ret == DialogResult.Yes) { if (SaveToEditingFile() == true ) { fNoTitle = false; } else{ //キャンセルで抜けてきた e.Cancel = true; return; } } else if (ret == DialogResult.Cancel) { e.Cancel = true; return; } } fConstraintChange = true; //無題ファイルのまま編集しているのなら削除 if (fNoTitle == true) { if (File.Exists(MarkDownTextFilePath) == true) { try { File.Delete(MarkDownTextFilePath); } catch { } } } //データバージョン System.Reflection.Assembly asmbly = System.Reflection.Assembly.GetExecutingAssembly(); System.Version ver = asmbly.GetName().Version; MarkDownSharpEditor.AppSettings.Instance.Version = ver.Major*1000+ver.Minor*100+ver.Build*10+ver.Revision; //フォーム位置・サイズ MarkDownSharpEditor.AppSettings.Instance.FormPos = new Point(this.Left, this.Top); MarkDownSharpEditor.AppSettings.Instance.FormSize = new Size(this.Width, this.Height); MarkDownSharpEditor.AppSettings.Instance.richEditWidth = this.richTextBox1.Width; FontConverter fc = new FontConverter(); MarkDownSharpEditor.AppSettings.Instance.FontFormat = fc.ConvertToString(richTextBox1.Font); MarkDownSharpEditor.AppSettings.Instance.richEditForeColor = richTextBox1.ForeColor.ToArgb(); //表示オプションなど MarkDownSharpEditor.AppSettings.Instance.fViewToolBar = this.menuViewToolBar.Checked; MarkDownSharpEditor.AppSettings.Instance.fViewStatusBar = this.menuViewStatusBar.Checked; MarkDownSharpEditor.AppSettings.Instance.fSplitBarWidthEvenly = this.menuViewWidthEvenly.Checked; if (File.Exists(MarkDownTextFilePath) == true) { //編集中のファイルパス foreach (AppHistory data in MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles) { if (data.md == MarkDownTextFilePath) { //いったん削除して MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Remove(data); break; } } AppHistory HistroyData = new AppHistory(); HistroyData.md = MarkDownTextFilePath; HistroyData.css = SelectedCssFilePath; MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Insert(0, HistroyData); //先頭に挿入 } //設定の保存 MarkDownSharpEditor.AppSettings.Instance.SaveToXMLFile(); //MarkDownSharpEditor.AppSettings.Instance.SaveToJsonFile(); //ブラウザを空白にする webBrowser1.Navigate("about:blank"); }
//----------------------------------- // TODO:ファイルのドラッグ&ドロップ //----------------------------------- private void richTextBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { string[] FileArray = (string[])e.Data.GetData(DataFormats.FileDrop, false); if (FileArray.Length > 1) { if (FileArray.Length > 0) { DialogResult ret = MessageBox.Show("複数のファイルが読み込まれました。\n" + "現在の設定内容でHTMLファイルへの一括変換を行いますか?\n"+ "「いいえ」を選択するとそのまますべてのファイル開きます。", "問い合わせ", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information); if (ret == DialogResult.Yes) { //一括でHTMLファイル出力 BatchOutputToHtmlFiles(FileArray); return; } else if (ret == DialogResult.Cancel) { //キャンセル return; } else { //「いいえ」 bool fOpen = false; foreach (string FilePath in FileArray) { //最初のファイルだけ、このウィンドウだけ開く if (fOpen == false) { OpenFile(FilePath); fOpen = true; } else { //他の複数ファイルは順次新しいウィンドウで開く System.Diagnostics.Process.Start( Application.ExecutablePath, string.Format("{0}", FilePath)); } } } } else { //前に編集していたファイルがあればそれを開く if (MarkDownSharpEditor.AppSettings.Instance.fOpenEditFileBefore == true) { if (MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Count > 0) { AppHistory EditedFilePath = new AppHistory(); EditedFilePath = (AppHistory)MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles[0]; if (File.Exists(EditedFilePath.md) == true) { OpenFile(EditedFilePath.md); } } } } fConstraintChange = false; //フォームタイトル更新 FormTextChange(); ArrayList ArrayFileList = new ArrayList(); foreach (string FilePath in FileArray) { ArrayFileList.Add(FilePath); } BatchOutputToHtmlFiles((String[])ArrayFileList.ToArray(typeof(string))); } else if ( FileArray.Count() == 1 ) { //ファイルが一個の場合は編集中のウィンドウで開く OpenFile(FileArray[0]); } }
//====================================================================== //----------------------------------- //「新しいファイルを開く」メニュー //----------------------------------- private void menuNewFile_Click(object sender, EventArgs e) { if (richTextBox1.Modified == true ) { DialogResult ret = MessageBox.Show("編集中のファイルがあります。保存してから新しいファイルを開きますか?", "問い合わせ", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information); if (ret == DialogResult.Yes) { if (SaveToEditingFile() == true) { fNoTitle = false; //無題フラグOFF } else { //キャンセルで抜けてきた return; } } else if (ret == DialogResult.Cancel) { return; } } //前の編集していたテンポラリを削除する DeleteTemporaryHtmlFilePath(); //無題ファイルのまま編集しているのなら削除 if (fNoTitle == true) { if (File.Exists(MarkDownTextFilePath) == true) { try { File.Delete(MarkDownTextFilePath); } catch { } } } //編集履歴に残す if (File.Exists(MarkDownTextFilePath) == true) { foreach (AppHistory data in MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles) { if (data.md == MarkDownTextFilePath) { //いったん削除して MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Remove(data); break; } } AppHistory HistroyData = new AppHistory(); HistroyData.md = MarkDownTextFilePath; HistroyData.css = SelectedCssFilePath; MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Insert(0, HistroyData); //先頭に挿入 } fConstraintChange = true; //ブラウザを空白にする webBrowser1.Navigate("about:blank"); //テンポラリファイルがあれば削除 DeleteTemporaryHtmlFilePath(); //編集中のファイル情報をクリア MarkDownTextFilePath = CreateNoTitleFilePath(); fNoTitle = true; richTextBox1.Text = ""; richTextBox1.Modified = false; FormTextChange(); fConstraintChange = false; }
//---------------------------------------------------------------------- // TODO: OpenFile [ .mdファイルを開く ] //---------------------------------------------------------------------- private bool OpenFile(string FilePath) { //引数 FilePath = "" の場合は「無題」編集で開始する if (FilePath == "") { fNoTitle = true; //無題フラグON } else { fNoTitle = false; } //----------------------------------- //編集中のファイルがある if (richTextBox1.Modified == true) { DialogResult ret = MessageBox.Show( "編集中のファイルがあります。保存してか らファイルを開きますか?", "問い合わせ", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (ret == DialogResult.Yes) { if (SaveToEditingFile() == false) { //キャンセルで抜けてきた return (false); } } else if (ret == DialogResult.Cancel) { return (false); } //編集履歴に残す foreach (AppHistory data in MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles) { if (data.md == MarkDownTextFilePath) { //いったん削除して MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Remove(data); break; } } AppHistory HistroyData = new AppHistory(); HistroyData.md = MarkDownTextFilePath; HistroyData.css = SelectedCssFilePath; MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Insert(0, HistroyData); //先頭に挿入 } //----------------------------------- //オープンダイアログ表示 if (fNoTitle == false && File.Exists(FilePath) == false) { if (File.Exists(MarkDownTextFilePath) == true) { //編集中のファイルがあればそのディレクトリを初期フォルダーに openFileDialog1.InitialDirectory = Path.GetDirectoryName(MarkDownTextFilePath); //テンポラリファイルがあればここで削除 DeleteTemporaryHtmlFilePath(); } openFileDialog1.FileName = ""; if (openFileDialog1.ShowDialog() == DialogResult.OK) { FilePath = openFileDialog1.FileName; } else { return (false); } } //編集中のファイルパスとする MarkDownTextFilePath = FilePath; //----------------------------------- //文字コードを調査するためにテキストファイルを開く if (fNoTitle == false) { byte[] bs; using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read)) { bs = new byte[fs.Length]; fs.Read(bs, 0, bs.Length); } //文字コードを取得する EditingFileEncoding = GetCode(bs); } else { //「無題」はデフォルトのエンコーディング EditingFileEncoding = Encoding.UTF8; } //ステータスバーに表示 toolStripStatusLabelTextEncoding.Text = EditingFileEncoding.EncodingName; //編集中のエンコーディングを使用する(&D)か if (MarkDownSharpEditor.AppSettings.Instance.HtmlEncodingOption == 0) { toolStripStatusLabelHtmlEncoding.Text = EditingFileEncoding.EncodingName; } //----------------------------------- //ペアとなるCSSファイルがあるか探索してあれば適用する foreach (AppHistory data in MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles) { if (data.md == MarkDownTextFilePath) { if (File.Exists(data.css) == true) { SelectedCssFilePath = data.css; break; } } } //選択中のCSSファイル名をステータスバーに表示 if (File.Exists(SelectedCssFilePath) == true) { toolStripStatusLabelCssFileName.Text = Path.GetFileName(SelectedCssFilePath); } else { toolStripStatusLabelCssFileName.Text = "CSSファイル指定なし"; } //----------------------------------- //RichEditBoxに表示 fConstraintChange = true; richTextBox1.Clear(); //RichEditBoxの「フォント」設定 var obj = MarkDownSharpEditor.AppSettings.Instance; FontConverter fc = new FontConverter(); try { richTextBox1.Font = (Font)fc.ConvertFromString(obj.FontFormat); } catch { } //RichEditBoxの「フォントカラー」設定 richTextBox1.ForeColor = Color.FromArgb(obj.richEditForeColor); //ステータスバーに表示 toolStripStatusLabelFontInfo.Text = richTextBox1.Font.Name + "," + richTextBox1.Font.Size.ToString() + "pt"; //----------------------------------- //テキストファイルの読み込み if (fNoTitle == false) { richTextBox1.Text = File.ReadAllText(FilePath, EditingFileEncoding); } richTextBox1.BeginUpdate(); richTextBox1.SelectionStart = richTextBox1.Text.Length; richTextBox1.ScrollToCaret(); //richTextBox1の全高さを求める richEditBoxInternalHeight = richTextBox1.VerticalPosition; //カーソル位置を戻す richTextBox1.SelectionStart = 0; richTextBox1.EndUpdate(); //変更フラグOFF richTextBox1.Modified = false; //Undoバッファに追加 undoCounter = 0; UndoBuffer.Clear(); UndoBuffer.Add(richTextBox1.Text.ToString()); //シンタックスハイライター SyntaxHightlighterWidthRegex(); //プレビュー更新 PreviewToBrowser(); fConstraintChange = false; FormTextChange(); return (true); }
//----------------------------------- // richTextBox1 Drag and Drop event //----------------------------------- private void richTextBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) { string[] FileArray = (string[])e.Data.GetData(DataFormats.FileDrop, false); if (FileArray.Length > 1) { if (FileArray.Length > 0) { //"問い合わせ" //"複数のファイルが読み込まれました。\n現在の設定内容でHTMLファイルへの一括変換を行いますか? //「いいえ」を選択するとそのまますべてのファイル開きます。" //"Question" //"More than one were read.\nDo you wish to convert all files to HTML files on this options?\n // if you select 'No', all files will be opend without converting." DialogResult ret = MessageBox.Show("MsgConvertAllFilesToHTML", Resources.DialogTitleQuestion, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information); if (ret == DialogResult.Yes) { //一括でHTMLファイル出力 //Output HTML files in batch process BatchOutputToHtmlFiles(FileArray); return; } else if (ret == DialogResult.Cancel) { //キャンセル //Cancel return; } else { //「いいえ」 // "No" button bool fOpen = false; foreach (string FilePath in FileArray) { //最初のファイルだけ、このウィンドウだけ開く //First file open in this window if (fOpen == false) { OpenFile(FilePath); fOpen = true; } else { //他の複数ファイルは順次新しいウィンドウで開く //Other files open in new windows System.Diagnostics.Process.Start( Application.ExecutablePath, string.Format("{0}", FilePath)); } } } } else { //前に編集していたファイルがあればそれを開く //Open it if there is editing file before if (MarkDownSharpEditor.AppSettings.Instance.fOpenEditFileBefore == true) { if (MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Count > 0) { AppHistory EditedFilePath = new AppHistory(); EditedFilePath = (AppHistory)MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles[0]; if (File.Exists(EditedFilePath.md) == true) { OpenFile(EditedFilePath.md); } } } } _fConstraintChange = false; //フォームタイトル更新 //Refresh form caption FormTextChange(); ArrayList ArrayFileList = new ArrayList(); foreach (string FilePath in FileArray) { ArrayFileList.Add(FilePath); } BatchOutputToHtmlFiles((String[])ArrayFileList.ToArray(typeof(string))); } else if (FileArray.Count() == 1) { //ファイルが一個の場合は編集中のウィンドウで開く //Open it in this window if file is one OpenFile(FileArray[0]); } }
//---------------------------------------------------------------------- // Form Closing event //---------------------------------------------------------------------- private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (richTextBox1.Modified == true) { //"問い合わせ" //"編集中のファイルがあります。保存してから終了しますか?" //"Question" //"This file being edited. Do you wish to save before exiting?" DialogResult ret = MessageBox.Show(Resources.MsgSaveFileToEnd, Resources.DialogTitleQuestion, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (ret == DialogResult.Yes) { if (SaveToEditingFile() == true) { _fNoTitle = false; } else { //キャンセルで抜けてきた //user cancel e.Cancel = true; return; } } else if (ret == DialogResult.Cancel) { e.Cancel = true; return; } } _fConstraintChange = true; //無題ファイルのまま編集しているのなら削除 //Delete file if the file is no title if (_fNoTitle == true) { if (File.Exists(_MarkDownTextFilePath) == true) { try { File.Delete(_MarkDownTextFilePath); } catch { } } } //データバージョン //Data version System.Reflection.Assembly asmbly = System.Reflection.Assembly.GetExecutingAssembly(); System.Version ver = asmbly.GetName().Version; MarkDownSharpEditor.AppSettings.Instance.Version = ver.Major * 1000 + ver.Minor * 100 + ver.Build * 10 + ver.Revision; //フォーム位置・サイズ ( Form position & size ) if (this.WindowState == FormWindowState.Minimized) { //最小化 ( Minimize ) MarkDownSharpEditor.AppSettings.Instance.FormState = 1; //一時記憶していた位置・サイズを保存 ( Save temporary position & size value ) MarkDownSharpEditor.AppSettings.Instance.FormPos = new Point(_preFormPos.X, _preFormPos.Y); MarkDownSharpEditor.AppSettings.Instance.FormSize = new Size(_preFormSize.Width, _preFormSize.Height); } else if (this.WindowState == FormWindowState.Maximized) { //最大化 ( Maximize ) MarkDownSharpEditor.AppSettings.Instance.FormState = 2; //一時記憶していた位置・サイズを保存 ( Save temporary position & size value ) MarkDownSharpEditor.AppSettings.Instance.FormPos = new Point(_preFormPos.X, _preFormPos.Y); MarkDownSharpEditor.AppSettings.Instance.FormSize = new Size(_preFormSize.Width, _preFormSize.Height); } else { //通常 ( Normal window ) MarkDownSharpEditor.AppSettings.Instance.FormState = 0; MarkDownSharpEditor.AppSettings.Instance.FormPos = new Point(this.Left, this.Top); MarkDownSharpEditor.AppSettings.Instance.FormSize = new Size(this.Width, this.Height); } MarkDownSharpEditor.AppSettings.Instance.richEditWidth = this.richTextBox1.Width; FontConverter fc = new FontConverter(); MarkDownSharpEditor.AppSettings.Instance.FontFormat = fc.ConvertToString(richTextBox1.Font); MarkDownSharpEditor.AppSettings.Instance.richEditForeColor = richTextBox1.ForeColor.ToArgb(); //表示オプションなど //Save view options etc MarkDownSharpEditor.AppSettings.Instance.fViewToolBar = this.menuViewToolBar.Checked; MarkDownSharpEditor.AppSettings.Instance.fViewStatusBar = this.menuViewStatusBar.Checked; MarkDownSharpEditor.AppSettings.Instance.fSplitBarWidthEvenly = this.menuViewWidthEvenly.Checked; //検索オプション //Save search options MarkDownSharpEditor.AppSettings.Instance.fSearchOptionIgnoreCase = chkOptionCase.Checked ? false : true; if (File.Exists(_MarkDownTextFilePath) == true) { //編集中のファイルパス //Save editing file path foreach (AppHistory data in MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles) { if (data.md == _MarkDownTextFilePath) { //いったん削除して ( delete once ... ) MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Remove(data); break; } } AppHistory HistroyData = new AppHistory(); HistroyData.md = _MarkDownTextFilePath; HistroyData.css = _SelectedCssFilePath; MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Insert(0, HistroyData); //先頭に挿入 ( Insert at the top ) } //設定の保存 //Save settings MarkDownSharpEditor.AppSettings.Instance.SaveToXMLFile(); //MarkDownSharpEditor.AppSettings.Instance.SaveToJsonFile(); timer1.Enabled = false; //webBrowser1.Navigate("about:blank"); //クリック音対策 //Constraint click sounds if (webBrowser1.Document != null) { webBrowser1.Document.OpenNew(true); webBrowser1.Document.Write(""); } }
//---------------------------------------------------------------------- // TODO: .mdファイルを開く(OpenFile) //---------------------------------------------------------------------- private bool OpenFile(string FilePath) { if (richTextBox1.Modified == true) { DialogResult ret = MessageBox.Show( "編集中のファイルがあります。保存してか らファイルを開きますか?", "問い合わせ", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (ret == DialogResult.Yes) { if (SaveToEditingFile() == false) { //キャンセルで抜けてきた return (false); } } else if (ret == DialogResult.Cancel) { return (false); } //編集履歴に残す foreach (AppHistory data in MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles) { if (data.md == MarkDownTextFilePath) { //いったん削除して MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Remove(data); break; } } AppHistory HistroyData = new AppHistory(); HistroyData.md = MarkDownTextFilePath; HistroyData.css = SelectedCssFilePath; MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles.Insert(0, HistroyData); //先頭に挿入 } //ファイル名指定で来ている(ドラッグ&ドロップされた等) if (File.Exists(FilePath) == true) { } else { //オープンダイアログ表示 if (openFileDialog1.ShowDialog() == DialogResult.OK) { FilePath = openFileDialog1.FileName; } else { return (false); } } //テンポラリファイルがあればここで削除 DeleteTemporaryHtmlFilePath(); //テキストファイルを開く byte[] bs; using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read)) { bs = new byte[fs.Length]; fs.Read(bs, 0, bs.Length); } //文字コードを取得する EditingFileEncoding = GetCode(bs); //ステータスバーに表示 toolStripStatusLabelTextEncoding.Text = EditingFileEncoding.EncodingName; //編集中のエンコーディングを使用する(&D)か if (MarkDownSharpEditor.AppSettings.Instance.HtmlEncodingOption == 0) { toolStripStatusLabelHtmlEncoding.Text = EditingFileEncoding.EncodingName; } fConstraintChange = true; MarkDownTextFilePath = FilePath; //編集中のファイルパスとする fNoTitle = false; //無題フラグOFF //ペアとなるCSSファイルがあるか探索してあれば適用する foreach (AppHistory data in MarkDownSharpEditor.AppSettings.Instance.ArrayHistoryEditedFiles) { if (data.md == MarkDownTextFilePath) { if (File.Exists(data.css) == true) { SelectedCssFilePath = data.css; break; } } } //選択中のCSSファイル名をステータスバーに表示 if (File.Exists(SelectedCssFilePath) == true) { toolStripStatusLabelCssFileName.Text = Path.GetFileName(SelectedCssFilePath); } else { toolStripStatusLabelCssFileName.Text = "CSSファイル指定なし"; } //RichEditBoxに表示 fConstraintChange = true; richTextBox1.Clear(); //RichEditBoxの「フォント」設定 var obj = MarkDownSharpEditor.AppSettings.Instance; FontConverter fc = new FontConverter(); try { richTextBox1.Font = (Font)fc.ConvertFromString(obj.FontFormat); } catch { } //RichEditBoxの「フォントカラー」設定 richTextBox1.ForeColor = Color.FromArgb(obj.richEditForeColor); //ステータスバーに表示 toolStripStatusLabelFontInfo.Text = richTextBox1.Font.Name + "," + richTextBox1.Font.Size.ToString() + "pt"; //テキストファイルの読み込み richTextBox1.Text = File.ReadAllText(FilePath, EditingFileEncoding); richTextBox1.Modified = false; //Undoバッファに追加 undoCount = 0; UndoBuffer.Clear(); UndoBuffer.Add(richTextBox1.Text.ToString()); fConstraintChange = false; FormTextChange(); //シンタックスハイライター SyntaxHightlighterWidthRegex(); //PreviewToBrowser(); if (timer1.Enabled == false) { timer1.Enabled = true; } return (true); }