Sfall-ScriptEditor
1183 строки · 44.0 Кб
1using System;2using System.Collections.Generic;3using System.Drawing;4using System.IO;5using System.Linq;6using System.Text;7using System.Windows.Forms;8
9using ScriptEditor.TextEditorUI;10using ScriptEditor.TextEditorUtilities;11
12namespace ScriptEditor13{
14public delegate void SendLineHandler(string msgLine);15
16partial class MessageEditor : Form17{18private const int WM_SETREDRAW = 0x000B;19
20[System.Runtime.InteropServices.DllImport("user32.dll")]21public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);22
23public event SendLineHandler SendMsgLine;24
25private List<string> linesMsg;26private string msgPath;27private bool isCancelEdit;28private bool allow;29
30private Color editColor;31private bool editAllowed = true;32private bool isEditMode = false;33private bool shiftKeyDown = false;34
35private const string COMMENT = "#";36private const string pcMarker = "\u25CF ";37
38private Color pcColor = Color.FromArgb(0, 0, 220);39private Color cmColor;40
41private Encoding enc = Settings.EncCodePage;42
43private TabInfo associateTab;44private Form scriptForm;45
46internal bool closeOnSend = false;47
48private cell SelectLine = new cell();49
50private struct cell51{52public int row;53public int col;54}55
56public enum CommentColor { LightYellow, PaleGreen, Lavender }57
58//List<Entry> rowsEntry = new List<Entry>();59//List<List<Entry>> rowsUndo = new List<Entry>();60
61private void RowsClear()62{63dgvMessage.Rows.Clear();64//rowsEntry.Clear();65}66
67#region Entry DGV68private class Entry69{70static private bool wrapLine = false;71
72public string msgLine = string.Empty;73public string msglip = string.Empty;74public string msgText = string.Empty;75public string description = string.Empty;76
77public bool pcMark = false;78public bool commentLine = false;79
80public int tabCount = 1;81
82static public bool IsWrap83{84get { return wrapLine; }85}86
87public Entry() { }88
89public Entry(string line)90{91//wrapLine = false;92if (line.Length == 0) return;93if (line.TrimStart().StartsWith(COMMENT)) {94msgLine = "-";95msgText = line;96commentLine = true;97} else {98string[] splitLine = line.Split(new char[] {'}'}, 4);99if (splitLine.Length == 0) return; // msg bad100
101wrapLine = splitLine.Length == 3;102
103if (splitLine[0].StartsWith("\t")) {104tabCount = splitLine[0].Length;105splitLine[0] = splitLine[0].TrimStart('\t');106tabCount -= splitLine[0].Length;107pcMark = true;108}109int z = splitLine[0].IndexOf('{');110msgLine = splitLine[0].Substring(z + 1); // номер строки111
112z = splitLine[1].IndexOf('{');113msglip = splitLine[1].Substring(z + 1);114
115z = splitLine[2].IndexOf('{');116msgText = splitLine[2].Substring(z + 1);117if (splitLine.Length > 3 && splitLine[3].Length > 0)118description = splitLine[3].TrimEnd();119}120}121
122public void Append(string line)123{124int end = line.IndexOf('}');125wrapLine = (end == -1);126if (wrapLine) {127msgText += Environment.NewLine + line;128} else {129msgText += Environment.NewLine + line.Remove(end);130description = line.Substring(end + 1).TrimEnd();131}132}133
134public string ToString(out bool prev)135{136prev = false;137int result;138if (int.TryParse(msgLine, out result)) {139string tab = (pcMark) ? new String('\t', tabCount) : String.Empty;140return (tab + "{" + msgLine + "}{" + msglip + "}{" + msgText + "}" + description);141}142return (msgText + description);143}144}145#endregion146
147private void AddRow(Entry e)148{149//if (dgvMessage.VirtualMode) {150// rowsEntry.Add(e);151// return;152//}153
154string message = (e.pcMark) ? pcMarker + e.msgText : e.msgText;155dgvMessage.Rows.Add(e.msgLine, message, e.msglip);156int row = dgvMessage.Rows.Count - 1;157dgvMessage.Rows[row].Cells[0].Tag = e;158dgvMessage.Rows[row].Cells[1].ToolTipText = e.description.Trim();159
160if (e.commentLine)161MarkCommentLine(row);162else if (e.pcMark)163dgvMessage.Rows[row].Cells[1].Style.ForeColor = pcColor;164}165
166private void InsertRow(int i, Entry e)167{168if (i >= dgvMessage.Rows.Count) {169SelectLine.row = dgvMessage.Rows.Count;170AddRow(e);171} else {172string message = (e.pcMark) ? pcMarker + e.msgText : e.msgText;173dgvMessage.Rows.Insert(i, e.msgLine, message, e.msglip);174dgvMessage.Rows[i].Cells[0].Tag = e;175}176if (e.commentLine)177MarkCommentLine(i);178}179
180private void MarkCommentLine(int row)181{182if (!Settings.msgHighlightComment)183return;184
185foreach (DataGridViewCell cell in dgvMessage.Rows[row].Cells)186cell.Style.BackColor = cmColor;187}188
189private void HighlightingCommentUpdate()190{191Color clr = (Settings.msgHighlightComment) ? cmColor : dgvMessage.RowsDefaultCellStyle.BackColor;192for (int row = 0; row < dgvMessage.Rows.Count; row++)193{194Entry ent = (Entry)dgvMessage.Rows[row].Cells[0].Tag;195if (ent.commentLine) {196for (int col = 0; col < dgvMessage.Rows[row].Cells.Count; col++)197dgvMessage.Rows[row].Cells[col].Style.BackColor = clr;198}199}200}201
202private void SetCommentColor()203{204Color lineColumnColor;205switch ((CommentColor)Settings.msgHighlightColor)206{207case CommentColor.LightYellow:208default:209cmColor = Color.FromArgb(255, 255, 200);210lineColumnColor = Color.LightYellow;211break;212case CommentColor.Lavender:213cmColor = Color.Lavender;214lineColumnColor = Color.FromArgb(240, 240, 250);215break;216case CommentColor.PaleGreen:217cmColor = Color.FromArgb(195, 255, 195);218lineColumnColor = Color.FromArgb(215, 255, 215);219break;220}221dgvMessage.Columns[0].DefaultCellStyle.BackColor = lineColumnColor;222}223
224#region Initial form225// call from testing dialog tools and node code editor226public static MessageEditor MessageEditorInit(string msgPath, int line, TabInfo tab = null, bool sendState = false)227{228MessageEditor msgEdit = new MessageEditor(msgPath, tab);229
230for (int i = 0; i < msgEdit.dgvMessage.RowCount; i++)231{232int number;233if (int.TryParse(msgEdit.dgvMessage.Rows[i].Cells[0].Value.ToString(), out number))234if (number == line) {235msgEdit.dgvMessage.Rows[i].Cells[1].Selected = true;236msgEdit.dgvMessage.FirstDisplayedScrollingRowIndex = (i <= 5) ? i : i - 5;237break;238}239}240msgEdit.SendStripButton.Enabled = sendState;241
242return msgEdit;243}244
245// call from main script editor246public static MessageEditor MessageEditorInit(TabInfo tab, Form frm)247{248string msgPath = null;249if (tab != null) {250if (!MessageFile.GetAssociatePath(tab, true, out msgPath))251return null;252
253tab.msgFilePath = msgPath;254}255
256// Show form257MessageEditor msgEdit = new MessageEditor(msgPath, tab);258msgEdit.scriptForm = frm;259if (tab != null)260msgEdit.alwaysOnTopToolStripMenuItem.Checked = true;261msgEdit.Show();262//if (Settings.autoOpenMsgs && msgEdit.scrptEditor.msgAutoOpenEditorStripMenuItem.Checked)263// msgEdit.WindowState = FormWindowState.Minimized;264
265return msgEdit;266}267
268// for open custom message file269public static MessageEditor MessageEditorOpen(string msgPath, Form frm)270{271if (msgPath == null)272MessageBox.Show("No output path selected.", "Error");273
274// Show form275MessageEditor msgEdit = new MessageEditor(msgPath, null);276msgEdit.scriptForm = frm;277msgEdit.WindowState = FormWindowState.Maximized;278frm.TopMost = false;279msgEdit.Show();280
281return msgEdit;282}283#endregion284
285#region Constructor286public MessageEditor(string msgfile) : this (msgfile, null)287{288SendStripButton.Enabled = false;289}290
291private MessageEditor(string msg, TabInfo ti)292{293InitializeComponent();294
295//dgvMessage.DoubleBuffered(true);296//dgvMessage.VirtualMode = true;297
298dgvMessage.Columns[2].Visible = Settings.msgLipColumn;299showLIPColumnToolStripMenuItem.Checked = Settings.msgLipColumn;300
301FontSizeComboBox.SelectedIndex = Settings.msgFontSize;302if (Settings.msgFontSize != 0)303FontSizeChanged(null, null);304FontSizeComboBox.SelectedIndexChanged += FontSizeChanged;305
306ColorComboBox.SelectedIndex = Settings.msgHighlightColor;307HighlightingCommToolStripMenuItem.Checked = Settings.msgHighlightComment;308
309if (Settings.encoding == (byte)EncodingType.OEM866)310encodingTextDOSToolStripMenuItem.Checked = true;311
312StripComboBox.SelectedIndex = 2;313if (!Settings.msgLipColumn) {314dgvMessage.Columns[2].Visible = false;315showLIPColumnToolStripMenuItem.Checked = false;316}317
318UpdateRecentList();319
320msgPath = msg;321if (msgPath != null)322ReadMsgFile();323else {324this.Text = "Empty" + this.Tag;325AddRow(new Entry());326linesMsg = new List<string>();327}328
329associateTab = ti;330if (associateTab != null)331MessageFile.ParseMessages(associateTab, linesMsg.ToArray());332}333#endregion334
335#region Load/Save Msg File336private void ReadMsgFile()337{338linesMsg = new List<string>(File.ReadAllLines(msgPath, enc));339
340ProgressBarForm progress = null;341if (linesMsg.Count > 250)342progress = new ProgressBarForm(this, linesMsg.Count);343
344dgvMessage.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;345SendMessage(dgvMessage.Handle, WM_SETREDRAW, false, 0);346
347for (int i = 0; i < linesMsg.Count; i++)348{349Entry entry;350try {351entry = new Entry(linesMsg[i]);352} catch (Exception) {353MessageBox.Show("Message file is bad!\nLine Error: " + i.ToString());354break;355}356while (Entry.IsWrap && ++i < linesMsg.Count) entry.Append(linesMsg[i]);357
358AddRow(entry);359if (progress != null) progress.SetProgress = i;360}361//if (dgvMessage.VirtualMode) dgvMessage.RowCount = rowsEntry.Count;362
363SendMessage(dgvMessage.Handle, WM_SETREDRAW, true, 0);364dgvMessage.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders;365
366if (progress != null)367progress.Dispose();368
369this.Text = Path.GetFileName(msgPath) + this.Tag;370groupBox.Text = msgPath;371msgSaveButton.Enabled = false;372}373
374private void SaveFileMsg()375{376bool prevLine;377bool replaceX = (enc.CodePage == 866);378dgvMessage.EndEdit();379linesMsg.Clear();380for (int i = 0; i < dgvMessage.Rows.Count; i++)381{382Entry entries = (Entry)dgvMessage.Rows[i].Cells[0].Tag;383string line = entries.ToString(out prevLine);384
385if (replaceX)386line = line.Replace('\u0425', '\u0058'); //Replacement of Russian letter "X", to English letter387
388linesMsg.Add(line);389
390if (prevLine)391linesMsg[i - 1] = linesMsg[i - 1].TrimEnd('}');392
393foreach (DataGridViewCell cells in dgvMessage.Rows[i].Cells)394{395switch (cells.ColumnIndex) {396case 0:397cells.Style.ForeColor = Color.Chocolate;398break;399case 2:400cells.Style.ForeColor = Color.Gray;401break;402default:403if (entries.pcMark)404cells.Style.ForeColor = pcColor;405else406cells.Style.ForeColor = dgvMessage.RowsDefaultCellStyle.ForeColor;407break;408}409}410}411File.WriteAllLines(msgPath, linesMsg.ToArray(), enc);412msgSaveButton.Enabled = false;413
414if (associateTab != null)415MessageFile.ParseMessages(associateTab, linesMsg.ToArray());416}417#endregion418
419private void dgvMessage_CellValueChanged(object sender, DataGridViewCellEventArgs e)420{421if (e.RowIndex == -1 || e.ColumnIndex == -1 || isCancelEdit) return;422
423DataGridViewCell cell = dgvMessage.Rows[e.RowIndex].Cells[e.ColumnIndex];424Entry entry = (Entry)dgvMessage.Rows[e.RowIndex].Cells[0].Tag;425
426string valCell = (string)cell.Value;427if (valCell == null) valCell = string.Empty;428
429switch (e.ColumnIndex) {430case 0: // line431int result;432if (!int.TryParse(valCell, out result)) {433MessageBox.Show("Line must contain only numbers.", "Line Error");434isCancelEdit = true;435cell.Value = entry.msgLine;436} else437entry.msgLine = valCell;438break;439case 1: // message440if (valCell.IndexOfAny(new char[] { '{', '}' }) != -1) {441isCancelEdit = true;442valCell = entry.msgText; // cancel443} else {444if (valCell.Length > 0 && valCell.TrimStart().StartsWith(pcMarker[0].ToString())) {445entry.msgText = valCell.Remove(0, 1).TrimStart(); // удалить лишний маркер446} else {447entry.msgText = valCell;448}449}450// добавить/удалить маркер для отображения в таблице451if (valCell.Length > 0) {452if (entry.pcMark) {453if (!valCell.TrimStart().StartsWith(pcMarker)) {454valCell = pcMarker + valCell; // добавить455}456} else if (valCell.TrimStart().StartsWith(pcMarker)) {457valCell = entry.msgText; // удалить458}459}460cell.Value = valCell;461break;462case 2: // lipfile463if (valCell.IndexOfAny(new char[] { '{', '}' }) != -1) {464isCancelEdit = true;465cell.Value = entry.msglip;466} else467entry.msglip = valCell;468break;469}470if (!isCancelEdit) {471dgvMessage.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.ForeColor = Color.Red;472msgSaveButton.Enabled = true;473}474isCancelEdit = false;475}476
477private void dgvMessage_SelectionChanged(object sender, EventArgs e)478{479if (allow) {480SelectLine.row = (dgvMessage.CurrentRow == null) ? 0 : dgvMessage.CurrentRow.Index;481SelectLine.col = (dgvMessage.CurrentRow == null) ? 0 : dgvMessage.CurrentCell.ColumnIndex;482} else483allow = true;484
485editAllowed = false;486}487
488private void SendStripButton_Click(object sender, EventArgs e)489{490if (SendMsgLine == null) return;491
492string line = (string)dgvMessage.Rows[SelectLine.row].Cells[0].Value;493int result;494if (int.TryParse(line, out result)) {495SendMsgLine(line);496if (closeOnSend)497this.Close();498}499}500
501private void NewStripButton_Click(object sender, EventArgs e)502{503RowsClear();504
505AddRow(new Entry("# Look Name"));506AddRow(new Entry("{100}{}{}"));507AddRow(new Entry("# Description"));508AddRow(new Entry("{101}{}{}"));509
510this.Text = "unsaved.msg" + this.Tag;511this.groupBox.Text = "Messages";512
513linesMsg = new List<string>();514msgPath = null;515msgSaveButton.Enabled = false;516}517
518private void msgOpenButton_ButtonClick(object sender, EventArgs e)519{520string path = msgPath;521if (path == null && Settings.outputDir != null)522path = Path.GetFullPath(Path.Combine(Settings.outputDir, MessageFile.MessageTextSubPath));523
524openFileDialog.InitialDirectory = Path.GetDirectoryName(path);525if (openFileDialog.ShowDialog() == DialogResult.OK) {526msgPath = openFileDialog.FileName;527RowsClear();528ReadMsgFile();529if (Path.IsPathRooted(msgPath)) {530Settings.AddMsgRecentFile(msgPath);531UpdateRecentList();532}533}534}535
536private void msgSaveButton_ButtonClick(object sender, EventArgs e)537{538if (msgPath == null)539SaveAsStripButton_Click(null, null);540else541SaveFileMsg();542}543
544private void SaveAsStripButton_Click(object sender, EventArgs e)545{546string path = msgPath;547
548if (path == null && Settings.outputDir != null)549path = Path.GetFullPath(Path.Combine(Settings.outputDir, MessageFile.MessageTextSubPath));550
551saveFileDialog.InitialDirectory = Path.GetDirectoryName(path);552saveFileDialog.FileName = Path.GetFileName(msgPath);553if (saveFileDialog.ShowDialog() == DialogResult.OK) {554msgPath = saveFileDialog.FileName;555SaveFileMsg();556this.Text = Path.GetFileName(msgPath) + this.Tag;557groupBox.Text = msgPath;558Settings.AddMsgRecentFile(msgPath);559UpdateRecentList();560}561}562
563private bool AddNewLine()564{565int Line = 0, nLine;566bool _comm = false;567bool isEdit = dgvMessage.IsCurrentCellInEditMode;568
569for (int n = SelectLine.row; n >= 0; n--)570{571if (int.TryParse((string)dgvMessage.Rows[n].Cells[0].Value, out Line)) break;572string val = (string)dgvMessage.Rows[n].Cells[1].Value;573if (/*val != null &&*/ val.StartsWith("#")) _comm = true;574}575if (_comm) {576Line = (int)Math.Round((decimal)Line / 10) * 10;577Line += Convert.ToInt32(StripComboBox.Text);578} else Line++;579for (int n = 0; n < dgvMessage.Rows.Count; n++)580{581if (int.TryParse((string)dgvMessage.Rows[n].Cells[0].Value, out nLine)) {582if (Line == nLine) {583return false;584}585}586}587
588dgvMessage.EndEdit();589
590if ((string)dgvMessage.Rows[SelectLine.row].Cells[0].Value != string.Empty) SelectLine.row++;591InsertRow(SelectLine.row, new Entry("{" + Line + "}{}{}"));592msgSaveButton.Enabled = true;593allow = false;594try { dgvMessage.Rows[SelectLine.row].Cells[SelectLine.col].Selected = true; }595catch { };596
597if (isEdit)598dgvMessage.BeginEdit(false);599
600return true;601}602
603private void IncAddStripButton_Click(object sender, EventArgs e)604{605if (!AddNewLine()) System.Media.SystemSounds.Question.Play();606}607
608private void InsertEmptyStripButton_Click(object sender, EventArgs e)609{610if (sender != null && !shiftKeyDown)611SelectLine.row++;612
613InsertRow(SelectLine.row, new Entry(""));614allow = false;615
616if (sender == null || shiftKeyDown)617SelectLine.row++;618try { dgvMessage.Rows[SelectLine.row].Cells[SelectLine.col].Selected = true; }619catch { };620
621msgSaveButton.Enabled = true;622}623
624private void DeleteLineStripButton_Click(object sender, EventArgs e)625{626if (dgvMessage.Rows.Count <= 1) return;627
628DataGridViewSelectedRowCollection selRows = dgvMessage.SelectedRows;629if (selRows.Count > 0) {630foreach (DataGridViewRow row in selRows)631dgvMessage.Rows.Remove(row);632if (dgvMessage.RowCount == 0) AddRow(new Entry());633} else {634dgvMessage.Rows.RemoveAt(SelectLine.row);635if (SelectLine.row >= dgvMessage.Rows.Count) SelectLine.row--;636}637msgSaveButton.Enabled = true;638}639
640private void InsertCommentStripButton_Click(object sender, EventArgs e)641{642if (dgvMessage.IsCurrentCellInEditMode || dgvMessage.MultiSelect)643return;644
645string comment = COMMENT;646if ((string)dgvMessage.Rows[SelectLine.row].Cells[0].Value == String.Empty) {647comment += dgvMessage.Rows[SelectLine.row].Cells[1].Value;648dgvMessage.Rows.RemoveAt(SelectLine.row);649} else650SelectLine.row++;651
652InsertRow(SelectLine.row, new Entry(comment));653allow = false;654try { dgvMessage.Rows[SelectLine.row].Cells[SelectLine.col].Selected = true; }655catch { };656msgSaveButton.Enabled = true;657}658
659#region Search function660private void Finds(int rowStart, int colStart, int rev = 1)661{662string find_str = SearchStripTextBox.Text.Trim();663if (find_str.Length == 0) {664MessageBox.Show("Nothing found.");665return;666}667
668cell findPosition = new cell();669findPosition.col = -1;670
671if (rev == -1 && rowStart == 0) rowStart = dgvMessage.RowCount - 1;672
673for (int row = rowStart; row < dgvMessage.RowCount; row += rev)674{675if (row < 0) break;676for (int col = colStart; col < dgvMessage.ColumnCount; col++)677{678if (dgvMessage.Rows[row].Cells[col].Value == null)679continue;680string value = dgvMessage.Rows[row].Cells[col].Value.ToString();681if (value.IndexOf(find_str, 0, StringComparison.OrdinalIgnoreCase) != -1) {682findPosition.row = row;683findPosition.col = col;684break;685}686}687if (findPosition.col != 0) break;688colStart = 0;689}690if (findPosition.col != 0) {691dgvMessage.FirstDisplayedScrollingRowIndex = (findPosition.row <= 5) ? findPosition.row : findPosition.row - 5;692dgvMessage.Rows[findPosition.row].Cells[findPosition.col].Selected = true;693}694
695if (findPosition.col == -1)696System.Media.SystemSounds.Exclamation.Play();697else {698SelectLine = findPosition;699}700}701
702private void Downbutton_Click(object sender, EventArgs e)703{704Finds(SelectLine.row, SelectLine.col + 1);705}706
707private void Upbutton_Click(object sender, EventArgs e)708{709Finds(SelectLine.row, SelectLine.col + 1, -1);710}711#endregion712
713private void showLIPColumnToolStripMenuItem_Click(object sender, EventArgs e)714{715dgvMessage.Columns[2].Visible = showLIPColumnToolStripMenuItem.Checked;716Settings.msgLipColumn = showLIPColumnToolStripMenuItem.Checked;717}718
719private void UpdateRecentList()720{721string[] items = Settings.GetMsgRecent();722msgOpenButton.DropDownItems.Clear();723for (int i = items.Length - 1; i >= 0; i--) {724msgOpenButton.DropDownItems.Add(items[i], null, MsgRecentClick);725}726}727
728private void MsgRecentClick(object sender, EventArgs e)729{730string rFile = ((ToolStripMenuItem)sender).Text;731// Check recent file732bool delete = false;733if (File.Exists(rFile)) {734msgPath = rFile;735RowsClear();736ReadMsgFile();737} else if (MessageBox.Show("Message file not found.\n Delete this recent link?", "Warning", MessageBoxButtons.YesNo) == DialogResult.Yes)738delete = true; // delete from recent list739Settings.AddMsgRecentFile(rFile, delete);740UpdateRecentList();741}742
743private void encodingTextDOSToolStripMenuItem_Click(object sender, EventArgs e)744{745enc = (encodingTextDOSToolStripMenuItem.Checked) ? Encoding.GetEncoding("cp866") : Encoding.Default;746if (msgPath != null) {747dgvMessage.SelectionChanged -= dgvMessage_SelectionChanged;748
749RowsClear();750ReadMsgFile();751dgvMessage.FirstDisplayedScrollingRowIndex = (SelectLine.row <= 5) ? SelectLine.row : SelectLine.row - 5;752if (SelectLine.row > 0 || SelectLine.col > 0)753dgvMessage.Rows[SelectLine.row].Cells[SelectLine.col].Selected = true;754
755dgvMessage.SelectionChanged += dgvMessage_SelectionChanged;756}757}758
759private void MessageEditor_KeyDown(object sender, KeyEventArgs e)760{761if (e.KeyCode == Keys.ShiftKey) {762shiftKeyDown = true;763}764else if (e.KeyCode == Keys.Escape) {765e.Handled = true;766Close();767}768else if (e.KeyCode == Keys.Delete && e.Modifiers == Keys.Control &&769!dgvMessage.Rows[SelectLine.row].Cells[SelectLine.col].IsInEditMode)770DeleteLineStripButton_Click(sender, e);771else if (e.Control && e.KeyCode == Keys.Subtract) {772if (FontSizeComboBox.SelectedIndex == 0)773return;774FontSizeComboBox.SelectedIndex--;775}776else if (e.Control && e.KeyCode == Keys.Add) {777if (FontSizeComboBox.SelectedIndex == FontSizeComboBox.Items.Count - 1)778return;779FontSizeComboBox.SelectedIndex++;780}781}782
783private void MessageEditor_KeyUp(object sender, KeyEventArgs e)784{785if (e.KeyCode == Keys.ShiftKey) shiftKeyDown = false;786}787
788private void MessageEditor_FormClosing(object sender, FormClosingEventArgs e)789{790if (msgSaveButton.Enabled) {791var result = MessageBox.Show("Do you want to save changes to message file?", "Warning", MessageBoxButtons.YesNoCancel);792if (result == DialogResult.Yes) {793msgSaveButton.PerformClick();794} else if (result == DialogResult.Cancel)795e.Cancel = true;796}797}798
799string restoreText;800bool textNeedRestore = false;801
802protected override bool ProcessCmdKey(ref Message msg, Keys keyData)803{804bool cancelPress = false;805if (textNeedRestore && keyData == Keys.Escape) {806isCancelEdit = true;807dgvMessage.Rows[SelectLine.row].Cells[SelectLine.col].Value = restoreText;808isCancelEdit = false;809} else if (isEditMode) {810int keyPress = (int)msg.WParam;811int caretPossiton = ((TextBox)dgvMessage.EditingControl).SelectionStart;812if ((keyPress == 40 || keyPress == 38)) { // Up/Down813var lines = ((TextBox)dgvMessage.EditingControl).Lines;814if (lines.Length == 1) {815if (keyPress == 40) // down816msg.WParam = (IntPtr)35;817else818msg.WParam = (IntPtr)36;819} else {820int len = lines[0].Length;821if (keyPress == 40) { // down822for (int i = 1; i < lines.Length - 1; i++) len += lines[i].Length + 2;823if (caretPossiton > len)824cancelPress = true;825} else {826if (caretPossiton <= len)827cancelPress = true;828}829}830} else if (keyPress == 37) { // Left831if (caretPossiton == 0)832cancelPress = true;833} else if (keyPress == 39) { // Right834if (caretPossiton == ((TextBox)dgvMessage.EditingControl).TextLength)835cancelPress = true;836} else if ((keyPress == 35 || keyPress == 36)) { // Home/End837if (keyPress == 36)838((TextBox)dgvMessage.EditingControl).SelectionStart = 0;839else840((TextBox)dgvMessage.EditingControl).SelectionStart = ((TextBox)dgvMessage.EditingControl).TextLength;841cancelPress = true;842}843}844if (cancelPress) msg.WParam = (IntPtr)0;845return base.ProcessCmdKey(ref msg, keyData);846}847
848private void dgvMessage_KeyPress(object sender, KeyPressEventArgs e)849{850if (!Char.IsControl(e.KeyChar)) {851if (SelectLine.col == 1)852dgvMessage.BeginEdit(true);853else {854textNeedRestore = true;855restoreText = (string)dgvMessage.Rows[SelectLine.row].Cells[SelectLine.col].Value;856isCancelEdit = true;857dgvMessage.Rows[SelectLine.row].Cells[SelectLine.col].Value = restoreText + e.KeyChar;858isCancelEdit = false;859dgvMessage.BeginEdit(false);860}861}862}863
864private void dgvMessage_KeyDown(object sender, KeyEventArgs e)865{866if (e.KeyCode == Keys.Enter && e.Control && !dgvMessage.MultiSelect) {867InsertEmptyStripButton_Click(sender, EventArgs.Empty);868e.SuppressKeyPress = true;869} else if (e.KeyCode == Keys.Enter && e.Shift && !dgvMessage.MultiSelect) {870InsertEmptyStripButton_Click(null, EventArgs.Empty);871e.SuppressKeyPress = true;872} else if (e.KeyCode == Keys.Enter && !dgvMessage.MultiSelect) {873string _cell = (string)dgvMessage.Rows[SelectLine.row].Cells[SelectLine.col].Value;874if (_cell != null && _cell.Length > 0 || !AddNewLine()) {875dgvMessage.BeginEdit(false);876}877e.SuppressKeyPress = true;878} else if ((e.KeyCode == Keys.Delete && !e.Control) || e.KeyCode== Keys.Back && !dgvMessage.MultiSelect) {879BackspaceEdit();880}881}882
883private void BackspaceEdit()884{885var _cell = dgvMessage.Rows[SelectLine.row].Cells[SelectLine.col];886var data = _cell.Value;887isCancelEdit = true;888_cell.Value = String.Empty;889dgvMessage.BeginEdit(false);890_cell.Value = data;891isCancelEdit = false;892}893
894private void playerMarkerToolStripMenuItem_Click(object sender, EventArgs e)895{896Entry entry = (Entry)dgvMessage.Rows[SelectLine.row].Cells[0].Tag;897if (entry.msgLine == "-")898return;899
900isCancelEdit = true;901
902bool changed = (dgvMessage.Rows[SelectLine.row].Cells[1].Style.ForeColor == Color.Red);903
904string text;905if (entry.pcMark) {906text = entry.msgText;907entry.pcMark = false;908if (!changed)909dgvMessage.Rows[SelectLine.row].Cells[1].Style.ForeColor = dgvMessage.RowsDefaultCellStyle.ForeColor;910} else {911text = pcMarker + entry.msgText;912entry.pcMark = true;913if (!changed)914dgvMessage.Rows[SelectLine.row].Cells[1].Style.ForeColor = pcColor;915}916
917dgvMessage.Rows[SelectLine.row].Cells[1].Value = text;918isCancelEdit = false;919msgSaveButton.Enabled = true;920}921
922private void MoveToolStripButton_Click(object sender, EventArgs e)923{924if (MoveToolStripButton.Checked) {925EnabledControls(false);926dgvMessage.EditMode = DataGridViewEditMode.EditProgrammatically;927dgvMessage.SelectionMode = DataGridViewSelectionMode.FullRowSelect;928dgvMessage.Cursor = Cursors.Hand;929} else {930EnabledControls(true);931dgvMessage.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2;932dgvMessage.SelectionMode = DataGridViewSelectionMode.CellSelect;933dgvMessage.Cursor = DefaultCursor;934}935}936
937private void EnabledControls(bool status)938{939dgvMessage.MultiSelect = !status;940SendStripButton.Enabled = status;941IncAddStripButton.Enabled = status;942InsertEmptyStripButton.Enabled = status;943InsertCommentStripButton.Enabled = status;944addToolStripMenuItem.Enabled = status;945BackStripButton.Enabled = status;946NextStripButton.Enabled = status;947playerMarkerToolStripMenuItem.Enabled = status;948sendLineToolStripMenuItem.Enabled = status;949addDescriptionToolStripMenuItem.Enabled = status;950}951
952private void moveUpToolStripMenuItem_Click(object sender, EventArgs e)953{954if (dgvMessage.MultiSelect) {955DataGridViewSelectedRowCollection rows = dgvMessage.SelectedRows;956int index_min = Math.Min(rows[0].Index, rows[rows.Count - 1].Index) - 1;957int index_max = Math.Max(rows[0].Index, rows[rows.Count - 1].Index);958
959if (index_min < 0) return;960
961DataGridViewRow row = dgvMessage.Rows[index_min];962dgvMessage.Rows.RemoveAt(index_min);963dgvMessage.Rows.Insert(index_max, row);964
965msgSaveButton.Enabled = true;966
967} else if (SelectLine.row > 0) {968DataGridViewRow row = dgvMessage.Rows[--SelectLine.row];969dgvMessage.Rows.RemoveAt(SelectLine.row);970dgvMessage.Rows.Insert(SelectLine.row + 1, row);971
972msgSaveButton.Enabled = true;973}974}975
976private void moveDownToolStripMenuItem_Click(object sender, EventArgs e)977{978if (dgvMessage.MultiSelect) {979DataGridViewSelectedRowCollection rows = dgvMessage.SelectedRows;980int index_min = Math.Min(rows[0].Index, rows[rows.Count - 1].Index);981int index_max = Math.Max(rows[0].Index, rows[rows.Count - 1].Index) + 1;982
983if (index_max > dgvMessage.Rows.Count - 1) return;984
985DataGridViewRow row = dgvMessage.Rows[index_max];986dgvMessage.Rows.RemoveAt(index_max);987dgvMessage.Rows.Insert(index_min, row);988
989msgSaveButton.Enabled = true;990
991} else if (SelectLine.row < dgvMessage.Rows.Count - 1) {992DataGridViewRow row = dgvMessage.Rows[++SelectLine.row];993dgvMessage.Rows.RemoveAt(SelectLine.row);994dgvMessage.Rows.Insert(SelectLine.row - 1, row);995
996msgSaveButton.Enabled = true;997}998}999
1000private void dgvMessage_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)1001{1002var _cell = dgvMessage.Rows[e.RowIndex].Cells[e.ColumnIndex];1003editColor = _cell.Style.BackColor;1004_cell.Style.BackColor = Color.Beige;1005dgvMessage.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;1006isEditMode = true;1007}1008
1009private void dgvMessage_CellEndEdit(object sender, DataGridViewCellEventArgs e)1010{1011dgvMessage.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = editColor;1012dgvMessage.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders;1013textNeedRestore = false;1014isEditMode = false;1015}1016
1017private void alwaysOnTopToolStripMenuItem_CheckedChanged(object sender, EventArgs e)1018{1019if (alwaysOnTopToolStripMenuItem.Checked)1020this.Owner = scriptForm;1021else1022this.Owner = null;1023}1024
1025private void FontSizeChanged(object sender, EventArgs e)1026{1027int size = int.Parse(FontSizeComboBox.Text);1028dgvMessage.Columns[1].DefaultCellStyle.Font = new Font(dgvMessage.Columns[1].DefaultCellStyle.Font.Name, size, FontStyle.Regular);1029
1030// set for line column1031switch (size) {1032case 24:1033size -= 10; // 141034break;1035case 20:1036size -= 7; // 131037break;1038case 18:1039size -= 6; // 121040break;1041case 16:1042size -= 5; // 111043break;1044case 14:1045size -= 4; // 101046break;1047case 12:1048size -= 3; // 91049break;1050default:1051size -= 1; // 9/81052break;1053}1054dgvMessage.Columns[0].DefaultCellStyle.Font = new Font(dgvMessage.Columns[0].DefaultCellStyle.Font.Name, size, FontStyle.Bold);1055
1056if (size >= 13) {1057dgvMessage.Columns[0].Width = 75;1058} else if (size >= 11) {1059dgvMessage.Columns[0].Width = 65;1060} else {1061dgvMessage.Columns[0].Width = 50;1062}1063
1064if (sender != null) Settings.msgFontSize = (byte)FontSizeComboBox.SelectedIndex;1065}1066
1067private void HighlightingCheck(object sender, EventArgs e)1068{1069Settings.msgHighlightComment = HighlightingCommToolStripMenuItem.Checked;1070
1071if (dgvMessage.RowCount > 0)1072HighlightingCommentUpdate();1073}1074
1075private void ColorComboBox_SelectedIndexChanged(object sender, EventArgs e)1076{1077if (dgvMessage.RowCount > 0)1078Settings.msgHighlightColor = (byte)ColorComboBox.SelectedIndex;1079
1080SetCommentColor();1081
1082if (dgvMessage.RowCount > 0)1083HighlightingCommentUpdate();1084}1085
1086private void dgvMessage_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)1087{1088if (e.RowIndex > -1 && e.Button == MouseButtons.Middle) {1089dgvMessage.Rows[e.RowIndex].Selected = true;1090SelectLine.row = e.RowIndex;1091sendLineToolStripMenuItem.PerformClick();1092}1093}1094
1095private void dgvMessage_CellDoubleClick(object sender, DataGridViewCellEventArgs e)1096{1097if (e.RowIndex > -1)1098dgvMessage.BeginEdit(true);1099}1100
1101private void dgvMessage_CellClick(object sender, DataGridViewCellEventArgs e)1102{1103if (e.RowIndex == -1)1104return;1105
1106if (editAllowed && dgvMessage.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected)1107dgvMessage.BeginEdit(false);1108
1109editAllowed = true;1110}1111
1112private void addDescriptionToolStripMenuItem_Click(object sender, EventArgs e)1113{1114Entry entry = (Entry)dgvMessage.Rows[SelectLine.row].Cells[0].Tag;1115string desc = entry.description.TrimStart();1116if (InputBox.ShowDialog("Add/Edit Description line", ref desc, 125) == DialogResult.OK) {1117desc = desc.Trim();1118if (desc.Length > 0 && !desc.StartsWith("#")) {1119desc = desc.Insert(0, " # ");1120}1121entry.description = desc;1122dgvMessage.Rows[SelectLine.row].Cells[1].ToolTipText = entry.description;1123msgSaveButton.Enabled = true;1124}1125}1126
1127private void OpenNotepadtoolStripButton_Click(object sender, EventArgs e)1128{1129if (msgPath != null)1130Settings.OpenInExternalEditor(msgPath);1131}1132
1133private void MessageEditor_Resize(object sender, EventArgs e)1134{1135int width = this.Width - toolStripDropDownButton1.Bounds.Right - 120;1136SearchStripTextBox.Width = (width >= 100) ? width : 100;1137
1138toolStrip.PerformLayout();1139if (SearchStripTextBox.IsOnOverflow) SearchStripTextBox.Width = 240;1140}1141
1142private void openAsTextToolStripMenuItem_Click(object sender, EventArgs e)1143{1144if (msgPath == null) return;1145
1146this.Close();1147if (!this.IsDisposed) return;1148
1149TabInfo ti = ((TextEditor)scriptForm).Open(msgPath, TextEditor.OpenType.File, false);1150if (associateTab != null) associateTab.msgFileTab = ti;1151}1152
1153private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e)1154{1155if (isEditMode) e.Cancel = true;1156}1157
1158#region Virtual mode events1159
1160private void dgvMessage_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)1161{1162//Entry entry = rowsEntry[e.RowIndex];1163
1164//switch (e.ColumnIndex) {1165//case 0:1166// e.Value = entry.msgLine;1167// if (entry.commentLine && Settings.msgHighlightComment)1168// dgvMessage.Rows[e.RowIndex].DefaultCellStyle.BackColor = cmColor;1169// break;1170//case 1:1171// e.Value = entry.msgText;1172// if (entry.pcMark)1173// dgvMessage.Rows[e.RowIndex].Cells[1].Style.ForeColor = pcColor;1174// break;1175//case 2:1176// e.Value = entry.msglip;1177// break;1178//}1179}1180
1181#endregion1182}1183}
1184