MainWindow.xaml.cs 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. using System.IO;
  2. using System.Linq;
  3. using System.Windows;//using System.IO.Pipes; using System.Threading;
  4. using FarsiLibrary.Win;
  5. using FastColoredTextBoxNS;
  6. using System.Windows.Input;
  7. using System.Windows.Controls;
  8. using System.Text.RegularExpressions;
  9. namespace MPE
  10. {
  11. public partial class MainWindow : Window
  12. {
  13. bool startTimer = false, fileBeAded = false;
  14. readonly Properties.Settings param = Properties.Settings.Default;
  15. Settings settings; replaceWindow rw; findWindow fw; SpecInput si;
  16. readonly static string taskList = DataHelper.workDir + "taskList.txt", backUpDir = Directory.GetCurrentDirectory() + "\\Backups\\";
  17. readonly System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog() { Title = "Открытие шаблона", Filter = "Текстовый документ (.txt)|*.txt" };
  18. readonly System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog() { Title = "Создание нового шаблона", Filter = "Текстовый документ (.txt)|*.txt" };
  19. readonly System.Windows.Threading.DispatcherTimer checkErrorTimer = new System.Windows.Threading.DispatcherTimer() { Interval = System.TimeSpan.FromMilliseconds(100), IsEnabled = false };
  20. static readonly System.Windows.Forms.MenuItem[] mi = new System.Windows.Forms.MenuItem[] { new System.Windows.Forms.MenuItem("Копировать Ctrl+C"), new System.Windows.Forms.MenuItem("Вставить Ctrl+V"), new System.Windows.Forms.MenuItem("Вырезать Ctrl+X"), new System.Windows.Forms.MenuItem("Выделить параметр", SelectParam_Click), new System.Windows.Forms.MenuItem("Закомментировать код Ctrl+E"), new System.Windows.Forms.MenuItem("Раскомментировать код Ctrl+Shift+E"), new System.Windows.Forms.MenuItem("Специальная вставка") };
  21. readonly Regex beOpened = new Regex(@"\*.+");
  22. readonly System.Collections.Generic.List<string> taskListLines = new System.Collections.Generic.List<string>();
  23. //Thread serverThread; NamedPipeServerStream pipeServer = new NamedPipeServerStream("MPE_pipe1", PipeDirection.InOut, 6); bool miss = false; public async void StartServer() { StreamReader sr = new StreamReader(pipeServer); StreamWriter sw = new StreamWriter(pipeServer); do try { pipeServer.WaitForConnection(); await System.Threading.Tasks.Task.Run(() => { if (!miss) { miss = true; } else { string line = sr.ReadLine(); if (line != null && line.Length > 0) { string[] arguments = line.Split(new char[] { ' ' }); if (arguments.Length > 1) for (int i = 0; i < arguments.Length; i++) if (arguments[i] == "-o") {/* Паредан ключ для открытия файлов*/ do if (i + 1 < arguments.Length) { i++; Tabs.BeginInvoke((InvokeDelegate)delegate { bool good = true; if (File.Exists(arguments[i])) good = CreateTab(arguments[i]); this.Activate(); field.Focus(); }, arguments[i]).AsyncWaitHandle.WaitOne(); } while (i + 1 < arguments.Length); } } } }); } catch (System.Exception ex) { MessageBox.Show("Возникла ошибка: " + ex.Message); pipeServer.Dispose(); pipeServer = new NamedPipeServerStream("MPE_pipe1", PipeDirection.InOut, 6); sr = new StreamReader(pipeServer); sw = new StreamWriter(pipeServer); } finally { if (pipeServer.IsConnected) { pipeServer.Disconnect(); } } while (true); }delegate void InvokeDelegate(string s);
  24. /*Проверяем есть ли уже запущенный экземпляр программы*///if (DataHelper.TryConnect()) {/* Этот экземпляр приложения является клиентом => если нужно открыть файлы, то отправляем их серверу; если нет файлов, то передаём фокус серверу и завершаю работу этого экземпляра*/ if (arguments.Length > 1) { string send = ""; for (int i = 1; i < arguments.Length; i++) { if (arguments[i] == "-o") {/* Паредан ключ для открытия файла*/ do if (File.Exists(arguments[i])) send += ' ' + arguments[i]; while (++i < arguments.Length); } else if (File.Exists(arguments[i])) send += ' ' + arguments[i]; } if (send.Length > 0) DataHelper.SendToServer("-o" + send); } DataHelper.DisposeService(); pipeServer.Dispose(); if (serverThread != null) serverThread.Abort(); System.Environment.Exit(0); } else {/* Этот экземпляр приложения является сервером => запускаем сервер и продолжаем нормальную загрузку*/ serverThread = new Thread(new ThreadStart(StartServer)); serverThread.Start(); }
  25. public MainWindow()
  26. {
  27. InitializeComponent();
  28. if (ToolTipUpdater.getToolTips() != null)
  29. MessageBox.Show("good");
  30. return;
  31. string[] arguments = System.Environment.GetCommandLineArgs();
  32. Title = ("MiniPoster Editor v" + param.version).Replace(",", ".");
  33. if (!Directory.Exists(DataHelper.workDir)) Directory.CreateDirectory(DataHelper.workDir);
  34. checkErrorTimer.Tick += CheckErrorTimer_Tick;
  35. mi[0].Click += fieldCopySelectedText; mi[1].Click += fieldPasteText; mi[2].Click += fieldCutSelectedText; mi[4].Click += TextCommenting; mi[5].Click += DellTextCommenting; mi[6].Click += specInsert;
  36. DataHelper.Init(ref Tabs, ref commandsToolTip, ref commandTipsCB, ref commandsControl, ref commandCB, ref checkErrorTimer, ref codeMapCB, ref fieldProvider, ref stateGrid, ref codeMapProvider, ref stateLineCB, ref syntaxHighlighting);
  37. if (param.isCheckUpdates) Updater.FindNewVersion();//Если проверка обновлений включена => проверить новую версию
  38. if (arguments.Length > 1) for (int i = 1; i < arguments.Length; i++)
  39. if (arguments[i] == "-o" && i + 1 < arguments.Length)
  40. {// Паредан ключ для открытия файла
  41. do
  42. {
  43. if (File.Exists(arguments[++i]))
  44. CreateTab(arguments[i]);
  45. }
  46. while (i + 1 < arguments.Length);
  47. }
  48. else if (File.Exists(arguments[i]))
  49. CreateTab(arguments[i]);
  50. if (param.isSaveWindowSize)
  51. {// Восстановление предыдущего разрешения экрана
  52. Width = param.lastWindowSize.Width < 400 ? 800 : param.lastWindowSize.Width;
  53. Height = param.lastWindowSize.Height < 200 ? 771 : param.lastWindowSize.Height;
  54. }
  55. if (File.Exists(taskList))
  56. {
  57. taskListLines = File.ReadAllLines(taskList).ToList();
  58. int d = 0;
  59. while (d < taskListLines.Count)
  60. {
  61. for (int i = d; i < taskListLines.Count; i++)
  62. {// Обрабатываем ранее открытые файлы
  63. if (File.Exists(taskListLines[i]))
  64. {// просто добавить в список ранее открытых
  65. if (!delDublicatMenuItems(taskListLines[i]))
  66. {
  67. MenuItem mi = new System.Windows.Controls.MenuItem() { Header = taskListLines[i] };
  68. mi.Click += Item_Click; oldTasks.Items.Add(mi);
  69. }
  70. }
  71. else if (param.isOpenLastFile && beOpened.Match(taskListLines[i]).Success)
  72. {// *путь - нужно открыть
  73. string header = taskListLines[i].Remove(0, 1);
  74. if (File.Exists(header))
  75. {
  76. if (!delDublicatMenuItems(header))
  77. {
  78. MenuItem mi = new System.Windows.Controls.MenuItem() { Header = header };
  79. mi.Click += Item_Click; oldTasks.Items.Add(mi);
  80. }
  81. CreateTab(header);
  82. }
  83. else taskListLines.RemoveAt(i);
  84. }
  85. else taskListLines.RemoveAt(i);
  86. d++;
  87. }
  88. }
  89. Save_taskList();
  90. }
  91. else File.Create(taskList).Close();
  92. if (Tabs.Controls.Count == 0) CreateTab(null, true);
  93. LineNumbersCB_Click(null, null);//Предыдущее состояние нумерации строк
  94. ShowErrorsCB_Click(null, null);//Предыдущее состояние проверки ошибок
  95. ShowCurrlineColorCB_Click(null, null);
  96. DataHelper.SetColorsForAllTabs();
  97. //ErrorChecker.initTimer();
  98. fileBeAded = startTimer = true; DataHelper.SetColors(field.Range);// Field_TextChanged(null, null);// new FastColoredTextBoxNS.TextChangedEventArgs(field.Range));
  99. field.IsChanged = false; needSaveL.Visibility = Visibility.Hidden;
  100. }
  101. static System.Drawing.Point p;// Точка указывает где нужно искать параметры функции
  102. static void SelectParam_Click(object sender, System.EventArgs e) { if (p != null) DataHelper.Field_MouseDoubleClick(p); }
  103. bool nowClosingTab = false;
  104. void removeTabFromTaskListLines(object tab)
  105. {//Удаляет закрытую вкладку из списка
  106. if (taskListLines.Contains("*" + tab as string))
  107. {
  108. taskListLines.Remove("*" + tab as string);
  109. Save_taskList();
  110. }
  111. }
  112. void Tabs_TabStripItemClosing(TabStripItemClosingEventArgs e)
  113. {
  114. object tab = e.Item.Tag;
  115. nowClosingTab = true;
  116. removeTabFromTaskListLines(tab);
  117. if (Tabs.Items.Count == 1)
  118. {//Закрывается последняя вкладка
  119. e.Cancel = true;
  120. Tabs.SelectedItem.Tag = field.Text = "";
  121. Tabs.SelectedItem.Title = "[new1]";
  122. field.IsChanged = false;
  123. needSaveL.Visibility = Visibility.Hidden;
  124. }
  125. nowClosingTab = false;
  126. }
  127. void Tabs_TabStripItemSelectionChanged(FarsiLibrary.Win.TabStripItemChangedEventArgs e)
  128. {
  129. if (fileBeAded && !nowClosingTab)
  130. {
  131. Title = "Edit - " + currentFile;
  132. UpdateDocumentMap();
  133. Tabs.SelectedItem.Controls[0].Focus();
  134. errorCount.Visibility = Visibility.Hidden;
  135. if (param.isSyntaxHighlighting)
  136. DataHelper.SetColors(field.Range);
  137. else field.Range.ClearStyle(StyleIndex.All);
  138. // if (param.isErrorList && param.isErrorTimer) ErrorChecker.needCheckErrors(ref errorCount);
  139. if ((Tabs.SelectedItem.Controls[0] as FastColoredTextBox).IsChanged)
  140. needSaveL.Visibility = Visibility.Visible;
  141. else needSaveL.Visibility = Visibility.Hidden;
  142. }
  143. }
  144. static readonly System.Windows.Forms.ContextMenu MouseMenu = new System.Windows.Forms.ContextMenu(mi);
  145. bool CreateTab(string fileName, bool empty = false)
  146. {
  147. if (!empty)
  148. if (fileName == null) return false;
  149. var tb = new FastColoredTextBox { Font = param.fieldFont, Dock = System.Windows.Forms.DockStyle.Fill, BorderStyle = System.Windows.Forms.BorderStyle.None, LeftPadding = 17, HighlightingRangeType = HighlightingRangeType.ChangedRange, AllowMacroRecording = false };
  150. var tab = new FATabStripItem(fileName != null ? Path.GetFileName(fileName) : "[new]", tb);
  151. tab.Tag = fileName;
  152. if (fileName != null && !IsFileAlreadyOpen(fileName) && File.Exists(fileName))
  153. tb.OpenFile(fileName, System.Text.Encoding.Default);
  154. else if (fileName != null) return false;
  155. tb.BackColor = DataHelper.getColorFromHex(DataHelper.getThemeColor(0));
  156. tb.ForeColor = DataHelper.getColorFromHex(DataHelper.getThemeColor(1));
  157. tb.LineNumberColor = DataHelper.getColorFromHex(DataHelper.getThemeColor(2));
  158. tb.IndentBackColor = DataHelper.getColorFromHex(DataHelper.getThemeColor(3));
  159. tb.SelectionColor = DataHelper.getColorFromHex(DataHelper.getThemeColor(4));
  160. tb.ChangedLineColor = DataHelper.getColorFromHex(DataHelper.getThemeColor(12));
  161. tb.CaretColor = DataHelper.getColorFromHex(DataHelper.getThemeColor(13));
  162. tb.CurrentLineColor = DataHelper.getColorFromHex(DataHelper.getThemeColor(14));
  163. tb.Font = param.fieldFont;
  164. AutoCompleete.Init(tb);
  165. tb.ContextMenu = MouseMenu;
  166. tb.MouseUp += Field_MouseUp;
  167. tb.KeyUp += Field_KeyUp;
  168. tb.ToolTipNeeded += getToolTip;
  169. tb.AutoIndentNeeded += Field_AutoIndentNeeded;
  170. tb.MouseDoubleClick += Field_MouseDoubleClick;
  171. tb.VisibleRangeChanged += Tb_VisibleRangeChanged;
  172. tb.TextChanged += Field_TextChanged;
  173. Tabs.AddTab(tab, true);
  174. codeMap.Target = tb;
  175. tb.Focus();
  176. if (fileName != null)
  177. {
  178. checkNeedMakeBackUp(ref fileName);
  179. if (taskListLines.Contains(fileName))
  180. taskListLines.Remove(fileName);
  181. addFileToTaskList();
  182. Save_taskList();
  183. if (param.isSyntaxHighlighting && fileBeAded)
  184. DataHelper.SetColors(field.Range);
  185. field.IsChanged = false;
  186. if (param.isErrorList && fileBeAded) ErrorChecker.needCheckErrors(ref errorCount);
  187. }
  188. return true;
  189. }
  190. void Tb_VisibleRangeChanged(object sender, System.EventArgs e) => codeMap.Refresh();
  191. void CreateTab() => CreateTab(null);
  192. FastColoredTextBox field
  193. {
  194. get => Tabs.SelectedItem.Controls[0] as FastColoredTextBox;
  195. set { Tabs.SelectedItem = (value.Parent as FATabStripItem); value.Focus(); }
  196. }
  197. string currentFile
  198. {
  199. get
  200. {
  201. if (Tabs.SelectedItem != null) return Tabs.SelectedItem.Tag as string;
  202. return "";
  203. }
  204. }
  205. string fName => Tabs.SelectedItem.Tag != null ? (Tabs.SelectedItem.Tag as string).Split(new char[] { '\\' }).Last() : "";
  206. bool IsFileAlreadyOpen(string fileName)
  207. {
  208. foreach (FATabStripItem tab in Tabs.Items)
  209. if (tab.Tag as string == fileName)
  210. {
  211. Tabs.SelectedItem = tab;
  212. return true;
  213. }
  214. return false;
  215. }
  216. void UpdateDocumentMap()
  217. {
  218. if (Tabs.SelectedItem != null)
  219. {
  220. codeMap.Target = field;
  221. codeMap.Refresh();
  222. }
  223. }
  224. bool delDublicatMenuItems(string header)
  225. {
  226. bool find = false;
  227. int d = 0;
  228. while (d < oldTasks.Items.Count)
  229. {
  230. find = false;
  231. foreach (System.Windows.Controls.MenuItem item in oldTasks.Items)
  232. {
  233. d++;
  234. if (find && item.Header.ToString() == header) { oldTasks.Items.Remove(item); break; }
  235. if (item.Header.ToString() == header) { find = true; continue; }
  236. }
  237. }
  238. return find;
  239. }
  240. void addFileToTaskList()
  241. {// Добавляет файл в начало списка
  242. if (!taskListLines.Contains("*" + currentFile))
  243. {
  244. if (!taskListLines.Contains(currentFile))
  245. taskListLines.Add(currentFile);
  246. taskListLines.Add("*" + currentFile);
  247. if (!delDublicatMenuItems(currentFile))
  248. {
  249. System.Windows.Controls.MenuItem mi = new System.Windows.Controls.MenuItem() { Header = currentFile };
  250. mi.Click += Item_Click; oldTasks.Items.Insert(0, mi);
  251. }
  252. if (oldTasks.Items.Count > 10) oldTasks.Items.RemoveAt(oldTasks.Items.Count - 1);//Показываем только последние 10 файлов
  253. }
  254. }
  255. void CheckErrorTimer_Tick(object sender, System.EventArgs e)
  256. { checkErrorTimer.IsEnabled = false; ErrorChecker.needCheckErrors(ref errorCount); }
  257. void checkNeedMakeBackUp(ref string file)
  258. {// Создание резервной копии файла, если включено в настройках
  259. if (file == null) return;
  260. if (!File.Exists(file)) return;
  261. if (!param.isMakeBackUp) return;
  262. if (!Directory.Exists(backUpDir)) Directory.CreateDirectory(backUpDir);
  263. if (!File.Exists(backUpDir + fName))
  264. File.Create(backUpDir + fName).Close();
  265. File.WriteAllText(backUpDir + fName, File.ReadAllText(file));
  266. }
  267. bool isNeedSave()
  268. {
  269. foreach (FATabStripItem item in Tabs.Items)
  270. if ((item.Controls[0] as FastColoredTextBox).IsChanged)
  271. {
  272. Tabs.SelectedItem = item;
  273. if (System.Windows.MessageBox.Show("В текущем файле есть изменения, сохранить?", "Сохранить вашу работу?", MessageBoxButton.YesNo) == MessageBoxResult.Yes) Save_file(null, null);
  274. (item.Controls[0] as FastColoredTextBox).IsChanged = false;
  275. }
  276. return false;
  277. }
  278. void CodeMapCB_Click(object sender, RoutedEventArgs e) => DataHelper.CodeMapCB_Click();// Показываем/скрываем карту кода
  279. void CommandCB_Click(object sender, RoutedEventArgs e) => DataHelper.CommandCB_Click();// Показываем/скрываем боковую панель
  280. void CommandTips_Click(object sender, RoutedEventArgs e) => DataHelper.CommandTips_Click();// Показываем/скрываем блок подсказок на боковой панеле
  281. void Create_Click(object sender, RoutedEventArgs e)
  282. {// Создание нового шаблона
  283. if (param.taskFoler.Length > 0) sfd.InitialDirectory = param.taskFoler;
  284. if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  285. {
  286. File.Create(sfd.FileName).Close();
  287. CreateTab(sfd.FileName);
  288. }
  289. }
  290. void Exit_Click(object sender, RoutedEventArgs e) { if (isNeedSave()) { e.Handled = true; return; } param.Save(); Close(); }
  291. void Field_AutoIndentNeeded(object sender, AutoIndentEventArgs e)
  292. {
  293. string trimedLineText = e.LineText.Trim();
  294. string[] str = trimedLineText.Split(new string[] { "]" }, System.StringSplitOptions.None);
  295. string clearedWord = str.Length > 1 ? str[0] + "]" : str[0];
  296. if ((param.indentBools[0] == '1' && clearedWord == "[IF]") || (param.indentBools[1] == '1' && trimedLineText == "[ELSE]"))
  297. {// Делаем отступ для следующей строки если текущая [IF] или [ELSE]
  298. e.ShiftNextLines = e.TabLength;
  299. }
  300. else if (trimedLineText == "[ENDIF]")
  301. {// Сдвигаем текущую и последующие строки влево, если текущая [ENDIF]
  302. e.Shift = -e.TabLength; e.ShiftNextLines = -e.TabLength;
  303. }
  304. }
  305. void Field_TextChanged(object sender, FastColoredTextBoxNS.TextChangedEventArgs e)
  306. {// Подсветка синтаксиса
  307. field.IsChanged = true;
  308. needSaveL.Visibility = Visibility.Visible;
  309. if (fileBeAded && param.isErrorList && startTimer && param.isErrorTimer) checkErrorTimer.IsEnabled = true;
  310. if (e != null)
  311. {
  312. e.ChangedRange.ClearFoldingMarkers();
  313. e.ChangedRange.SetFoldingMarkers(@"\[IF\].*", @".*\[ENDIF\]");
  314. if (fileBeAded && param.isSyntaxHighlighting) DataHelper.SetColors(e.ChangedRange);
  315. }
  316. if (codeMap != null && codeMapCB.IsChecked) codeMap.Refresh();
  317. }
  318. void fieldCopySelectedText(object sender, System.EventArgs e) => field.Copy();// Копирование текста
  319. void fieldCutSelectedText(object sender, System.EventArgs e) => field.Cut();// Вырезание текста
  320. void FieldFormatter_Click(object sender, RoutedEventArgs e) => DataHelper.FieldFormatter();// Выравнивание кода
  321. void fieldPasteText(object sender, System.EventArgs e) => field.Paste();// Вставка текста
  322. void getToolTip(object sender, ToolTipNeededEventArgs e) => ToolTips.getToolTip(ref sender, ref e);
  323. void InsertWord(object sender, RoutedEventArgs e) => DataHelper.InsertWord(ref sender);// Вставка функции без параметров
  324. void InsertOneBracketsWord(object sender, RoutedEventArgs e) => DataHelper.InsertOneBracketsWord(ref sender);// Вставка функции с 1-м параметром
  325. void InsertTwoBracketsWord(object sender, RoutedEventArgs e) => DataHelper.InsertTwoBracketsWord(ref sender);// Вставка функции с 2-я параметрами
  326. void InsertThreeBracketsWord(object sender, RoutedEventArgs e) => DataHelper.InsertThreeBracketsWord(ref sender);// Вставка функции с 3-я параметрами
  327. void Item_Click(object sender, RoutedEventArgs e)
  328. {
  329. if (oldTasks.Items.Count > 10) oldTasks.Items.RemoveAt(oldTasks.Items.Count - 1);//Изменение положения файла в списке
  330. string header = (sender as System.Windows.Controls.MenuItem).Header.ToString();
  331. if (File.Exists(header))
  332. {
  333. foreach (System.Windows.Controls.MenuItem item in oldTasks.Items) if (item.Header.ToString() == header) { oldTasks.Items.Remove(item); break; }
  334. System.Windows.Controls.MenuItem mi = new System.Windows.Controls.MenuItem() { Header = header };
  335. mi.Click += Item_Click; oldTasks.Items.Insert(0, mi);
  336. if (!taskListLines.Contains(header) && !taskListLines.Contains("[" + header + "]")) taskListLines.Add(header);
  337. CreateTab(header);
  338. }
  339. else { System.Windows.MessageBox.Show("Выбраный файл не существует!"); oldTasks.Items.RemoveAt(oldTasks.Items.IndexOf(sender)); }
  340. Save_taskList();
  341. }
  342. void LineNumbersCB_Click(object sender, RoutedEventArgs e) { DataHelper.ShowLineNumbers(param.isLineNumeric = lineNumbersCB.IsChecked); param.Save(); }
  343. void Open_Click(object sender, RoutedEventArgs e)
  344. {// Открытие шаблона
  345. if (param.taskFoler.Length > 0) ofd.InitialDirectory = param.taskFoler;
  346. if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  347. CreateTab(ofd.FileName);
  348. }
  349. void Save_file(object sender, RoutedEventArgs e)
  350. {
  351. FATabStripItem tab = Tabs.SelectedItem;
  352. if (tab == null) return;
  353. FastColoredTextBox tb = tab.Controls[0] as FastColoredTextBox;
  354. if (tab.Tag == null)
  355. {
  356. if (sfd.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
  357. tab.Title = Path.GetFileName(sfd.FileName);
  358. tab.Tag = sfd.FileName;
  359. }
  360. string filePath = (string)tab.Tag;
  361. addFileToTaskList();
  362. if (filePath.Length > 0)
  363. {
  364. File.WriteAllText(filePath, tb.Text, System.Text.Encoding.Default);
  365. needSaveL.Visibility = Visibility.Hidden;
  366. field.Range.ClearStyle(StyleIndex.Style10);
  367. field.IsChanged = false;
  368. if (param.isErrorList) ErrorChecker.needCheckErrors(ref errorCount);
  369. }
  370. else
  371. {
  372. Save_as_Click(null, null);
  373. }
  374. }
  375. void Save_taskList()
  376. {// Сохранаяем список ранее открытых файлов
  377. string[] lines = new string[taskListLines.Count];
  378. if (taskListLines.Count > 0)
  379. {
  380. lines = new string[taskListLines.Count];
  381. for (int i = 0; i < lines.Length; i++) lines[i] = taskListLines[i]/*(oldTasks.Items[i] as System.Windows.Controls.MenuItem).Header.ToString()*/;
  382. }
  383. File.WriteAllLines(taskList, lines);
  384. }
  385. void ShowCurrlineColorCB_Click(object sender, RoutedEventArgs e)
  386. {
  387. param.isFieldCurrLineColored = showCurrlineColorCB.IsChecked;
  388. DataHelper.MakeCurrendLineColored(param.isFieldCurrLineColored);
  389. }
  390. void FindWindow_Click(object sender, RoutedEventArgs e) { fw = new findWindow() { Owner = this }; fw.Show(); }// Окно поиска
  391. void ReplaceWindow_Click(object sender, RoutedEventArgs e) { rw = new replaceWindow() { Owner = this }; rw.Show(); }// Окно замены
  392. void Field_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) DataHelper.Field_MouseDoubleClick(e.Location); }
  393. void ShowErrorsCB_Click(object sender, RoutedEventArgs e)
  394. {// Вкл/выкл анализатор ошибок
  395. field.ClearHints();
  396. if ((param.isErrorList = showErrorsCB.IsChecked) && startTimer) ErrorChecker.needCheckErrors(ref errorCount);
  397. else { checkErrorTimer.Stop(); }; param.Save();
  398. }
  399. void StateLineCB_Click(object sender, RoutedEventArgs e) => DataHelper.StateLineCB_Click();// Показываем/скрываем строку состояния
  400. void TextCommenting(object sender, System.EventArgs e)
  401. {// Комментирование кода
  402. Place beginLine = field.Selection.Start, endLine = field.Selection.End;
  403. if (beginLine > endLine) { Place swap = beginLine; beginLine = endLine; endLine = swap; }//Если выделен весь текст
  404. field.BeginUpdate();
  405. string output = field.Selection.Text;
  406. if (output.Length == 0)
  407. {
  408. Range currLine = field.GetLine(beginLine.iLine);
  409. output += "{{ " + currLine.Text + " }}";
  410. field.Selection.Start = new Place(0, beginLine.iLine); field.Selection.End = new Place(field.GetLineLength(endLine.iLine), endLine.iLine);
  411. field.InsertText(output);
  412. }
  413. else
  414. {
  415. if (beginLine.iLine == endLine.iLine)//Однострочное
  416. field.InsertText("{{ " + output + " }}");
  417. else
  418. {//Многострочное
  419. output = "{{ " + new Range(field, beginLine.iChar, beginLine.iLine, field.GetLineLength(beginLine.iLine), beginLine.iLine).Text + " }}\n";
  420. for (int i = beginLine.iLine + 1; i < endLine.iLine; i++)
  421. output += "{{ " + field.GetLine(i).Text + " }}\n";
  422. output += "{{ " + new Range(field, 0, endLine.iLine, endLine.iChar, endLine.iLine).Text + " }}";
  423. field.InsertText(output);
  424. }
  425. }
  426. field.EndUpdate();
  427. }
  428. void DellTextCommenting(object sender, System.EventArgs e)
  429. {// Раскомментирование кода
  430. Place beginLine = field.Selection.Start, endLine = field.Selection.End;
  431. if (beginLine > endLine) { Place swap = beginLine; beginLine = endLine; endLine = swap; }
  432. string output = "";
  433. for (int i = beginLine.iLine; i <= endLine.iLine; i++)
  434. {
  435. Range currLine = field.GetLine(i);
  436. if (DataHelper.brakets.Match(currLine.Text).Length > 0)
  437. if (currLine.CharBeforeStart == '\n')
  438. {
  439. output += currLine.Text.Remove(0, DataHelper.brakets_begin.Match(currLine.Text).Length);
  440. int end = DataHelper.brakets_end.Match(output).Length;
  441. output = output.Remove(output.Length - end, end) + '\n';
  442. }
  443. else output += currLine.Text;
  444. else output += currLine.Text + '\n';
  445. }
  446. output = output.Remove(output.Length - 1);//Удаляем лишний \n
  447. field.BeginUpdate(); field.Selection.Start = new Place(0, beginLine.iLine); field.Selection.End = new Place(field.GetLineLength(endLine.iLine), endLine.iLine); field.InsertText(output); field.EndUpdate();
  448. }
  449. void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
  450. {
  451. if (System.Windows.MessageBox.Show("Закрыть miniPosterEditor?", "Закрытие окна", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
  452. {
  453. if (isNeedSave()) { e.Cancel = true; return; };
  454. if (param.isSaveWindowSize) { param.lastWindowSize = new System.Drawing.Size((int)Width, (int)Height); param.Save(); }
  455. DataHelper.SaveSettings();//serverThread.Abort(); DataHelper.DisposeService(); pipeServer.Dispose();
  456. Save_taskList();
  457. if (settings != null) settings = null;
  458. if (colors != null) colors = null;
  459. if (errorSettings != null) errorSettings = null;
  460. }
  461. else e.Cancel = true;
  462. }
  463. void CookiesTransform_Click(object sender, RoutedEventArgs e) => DataHelper.CookiesTransform();
  464. void ChooseFileToBinaryTransform_Click(object sender, RoutedEventArgs e) { if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) inputFileName.Text = ofd.FileName; }
  465. void MakeBinaryTransform_Click(object sender, RoutedEventArgs e) => DataHelper.MakeBinaryTransform(inputFileName.Text);
  466. void Save_as_Click(object sender, RoutedEventArgs e)
  467. {
  468. if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  469. {
  470. Tabs.SelectedItem.Tag = sfd.FileName;
  471. Tabs.SelectedItem.Title = sfd.FileName.Split(new char[] { '\\' }).Last();
  472. File.Create(sfd.FileName).Close();
  473. File.WriteAllText(sfd.FileName, field.Text);
  474. Title = "Edit - " + sfd.FileName;
  475. if (param.isErrorList) ErrorChecker.needCheckErrors(ref errorCount);
  476. }
  477. }
  478. void Window_Drop(object sender, System.Windows.DragEventArgs e)
  479. {// Загружаем файлы полученные при собитии Drop
  480. string[] files = (string[])e.Data.GetData(System.Windows.DataFormats.FileDrop);
  481. if (files != null) foreach (string file in files) CreateTab(file);
  482. }
  483. void Reload_file_Click(object sender, RoutedEventArgs e)
  484. {// Перезагружаем текущий файл
  485. if (field.IsChanged)
  486. {
  487. if (System.Windows.MessageBox.Show("В текущем файле есть изменения, сохранить?", "Сохранить вашу работу?", MessageBoxButton.YesNo) == MessageBoxResult.Yes) Save_file(null, null);
  488. field.IsChanged = false;
  489. }
  490. string header = Tabs.SelectedItem.Tag as string;
  491. if (File.Exists(header))
  492. {
  493. field.Text = File.ReadAllText(header, System.Text.Encoding.Default);
  494. needSaveL.Visibility = errorCount.Visibility = Visibility.Hidden;
  495. field.IsChanged = false;
  496. }
  497. else MessageBox.Show("Файл не существует!");
  498. }
  499. void DuplicateText_Click(object sender, RoutedEventArgs e)
  500. {// Дублировать выделенный текст/строку
  501. Place beginLine = field.Selection.Start, endLine = field.Selection.End;
  502. if (beginLine > endLine) { Place swap = beginLine; beginLine = endLine; endLine = swap; }
  503. string text = field.Selection.Text;
  504. if (text.Length == 0)
  505. {
  506. text = field.GetLine(field.Selection.Start.iLine).Text;
  507. field.Selection.Start = new Place(field.GetLineLength(endLine.iLine), endLine.iLine); field.Selection.End = new Place(field.GetLineLength(endLine.iLine), endLine.iLine);
  508. }
  509. else field.Selection.Start = new Place(endLine.iChar, endLine.iLine); field.Selection.End = new Place(endLine.iChar, endLine.iLine);
  510. field.BeginUpdate(); field.InsertText("\n" + text); field.EndUpdate();
  511. }
  512. void MakeBracketsSpecularly_Click(object sender, RoutedEventArgs e)
  513. {
  514. if (field.Selection.Text.Length > 0) field.InsertText(field.Selection.Text.Replace("[", "\\[").Replace("]", "\\]"));
  515. else System.Windows.Clipboard.SetText(System.Windows.Clipboard.GetText().Replace("[", "\\[").Replace("]", "\\]"));
  516. }
  517. void changeSelectedTab()
  518. {// Изменить выбранную вкладку
  519. if (Tabs.SelectedItem != null)
  520. {
  521. int index = Tabs.Items.IndexOf(Tabs.SelectedItem);
  522. if (index + 1 < Tabs.Items.Count) Tabs.SelectedItem = Tabs.Items[index + 1];
  523. else Tabs.SelectedItem = Tabs.Items[0];
  524. }
  525. }
  526. void Window_KeyDown(object sender, KeyEventArgs e)
  527. {// Обработка нажатия горячих клавиш
  528. if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
  529. {
  530. if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
  531. {
  532. if (e.Key == Key.Z) field.Redo();//Возврат изменений
  533. else if (e.Key == Key.E) { e.Handled = true; DellTextCommenting(null, null); }//Раскомментирование текста
  534. else if (e.Key == Key.F) { e.Handled = true; if (rw == null) { rw = new replaceWindow() { Owner = this }; rw.Closed += Rw_Closed; } if (field.Selection.Length > 0) rw.setTextInFindTB(field.Selection.Text); rw.Show(); rw.Focus(); }//Replace
  535. else if (e.Key == Key.S) { e.Handled = true; Save_as_Click(null, null); }//Save As
  536. else if (e.Key == Key.R) { e.Handled = true; Reload_file_Click(null, null); }//Переоткрыть текущий файл
  537. else if (e.Key == Key.Tab) { e.Handled = true; System.Diagnostics.Process.Start("explorer.exe", DataHelper.workDir); }//Открытие папку со служебными файлами
  538. }
  539. else if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
  540. {
  541. if (e.Key == Key.Q) { e.Handled = true; close_file_Click(null, null); }//CloseTab
  542. }
  543. else if (e.Key >= Key.D1 && e.Key <= Key.D9 || e.Key >= Key.NumPad1 && e.Key <= Key.NumPad9) DataHelper.gotoHint(e.Key.ToString());//Переключение на ошибку
  544. else if (e.Key == Key.E) { e.Handled = true; TextCommenting(null, null); }//Комментирование текста
  545. else if (e.Key == Key.Q) { e.Handled = true; FieldFormatter_Click(null, null); }//Выравнивание скрипта
  546. else if (e.Key == Key.S) { e.Handled = true; Save_file(null, null); }//Сохраняем изменения в файле
  547. else if (e.Key == Key.D) { e.Handled = true; DuplicateText_Click(null, null); }//Дублировать выделенный текст
  548. else if (e.Key == Key.L) { e.Handled = true; codeMapCB.IsChecked = !codeMapCB.IsChecked; CodeMapCB_Click(null, null); }//CodeMap
  549. else if (e.Key == Key.J) { e.Handled = true; commandCB.IsChecked = !commandCB.IsChecked; CommandCB_Click(null, null); }//CommandControl
  550. else if (e.Key == Key.M) { e.Handled = true; param.isSyntaxHighlighting = !param.isSyntaxHighlighting; param.Save(); syntaxHighlighting_Click(null, null); }//SyntaxHighlighting
  551. else if (e.Key == Key.Tab) { e.Handled = true; changeSelectedTab(); }//NextTab
  552. else if (e.Key == Key.K) { e.Handled = true; showErrorsCB.IsChecked = !showErrorsCB.IsChecked; ShowErrorsCB_Click(null, null); }//ErrorList
  553. else if (e.Key == Key.W) { e.Handled = true; MakeBracketsSpecularly_Click(null, null); }
  554. else if (e.Key == Key.F) { e.Handled = true; if (fw == null) { fw = new findWindow() { Owner = this }; fw.Closed += Fw_Closed; } if (field.Selection.Length > 0) fw.setTextInFindTB(field.Selection.Text); fw.Show(); fw.Focus(); }//Find
  555. else if (e.Key == Key.O) { e.Handled = true; Open_Click(null, null); }//OpenFile
  556. else if (e.Key == Key.N) { e.Handled = true; Create_Click(null, null); }//CreateFile
  557. else if (e.Key == Key.T) { e.Handled = true; Headers_to_Template_Click(null, null); }//Заголовки в шаблонный вид
  558. else if (e.Key == Key.P) { e.Handled = true; lineNumbersCB.IsChecked = !lineNumbersCB.IsChecked; LineNumbersCB_Click(null, null); }//LineNumbers
  559. else if (e.Key == Key.OemPlus) { e.Handled = true; ZoomIn_Click(null, null); }//ZoomIn
  560. else if (e.Key == Key.OemMinus) { e.Handled = true; ZoomOut_Click(null, null); }//ZoomOut
  561. }
  562. else if (e.Key == Key.F5) { e.Handled = true; Settings_Click(null, null); }//Settings
  563. else if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift && e.Key == Key.Delete) { e.Handled = true; if (field.TextLength == 0) return; field.ClearCurrentLine(); int iLine = field.Selection.Start.iLine; if (iLine + 1 < field.LinesCount) field.Selection.Start = new Place(0, iLine + 1); }//Удаляет текущую строку
  564. else if (e.Key == Key.OemTilde) { e.Handled = true; Colors_Click(null, null); }//Настройки цвета
  565. }
  566. void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) => DragMove();
  567. void Button_ToolTipOpening(object sender, ToolTipEventArgs e)
  568. {// Вывод подсказки при навередении на кнопку
  569. Button b = (sender as Button);
  570. if (b.ToolTip.ToString().Length == 0)
  571. b.ToolTip = ToolTips.getToolTipForItem(b.Content.ToString());
  572. }
  573. void ZoomIn_Click(object sender, RoutedEventArgs e) { field.ChangeFontSize(2); param.fieldFont = field.Font; DataHelper.SetFontForAllTabs(); param.Save(); }
  574. void ZoomOut_Click(object sender, RoutedEventArgs e) { field.ChangeFontSize(-2); param.fieldFont = field.Font; DataHelper.SetFontForAllTabs(); param.Save(); }
  575. void Field_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) { strField.Content = field.Selection.Start.iLine + 1; colField.Content = field.Selection.Start.iChar + 1; }
  576. void Field_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { p = e.Location; strField.Content = field.Selection.Start.iLine + 1; colField.Content = field.Selection.Start.iChar + 1; }
  577. void Headers_to_Template_Click(object sender, RoutedEventArgs e)
  578. {
  579. string result = DataHelper.Headers_to_Template(field.Selection.Length > 0 ? field.Selection.Text : "");
  580. if (result.Length > 0)
  581. {
  582. if (field.Selection.Length > 0) field.InsertText(result);
  583. else Clipboard.SetText(result);
  584. }
  585. }
  586. void Settings_Click(object sender, RoutedEventArgs e)// Открытие окна настроек
  587. { if (settings == null) { settings = new Settings(ref grid, field) { Owner = this, Left = Left, Top = Top }; settings.Closed += Settings_Closed; }; settings.Show(); }
  588. Colors colors;
  589. void Colors_Click(object sender, RoutedEventArgs e)
  590. { if (colors == null) { colors = new Colors(Field_TextChanged) { Owner = this, Left = Left, Top = Top }; colors.Closed += Colors_Closed; }; colors.Show(); }
  591. void Colors_Closed(object sender, System.EventArgs e) { colors = null; Focus(); }
  592. void Settings_Closed(object sender, System.EventArgs e) { settings = null; Focus(); }
  593. IndentSettings indentSettings;
  594. void IndentSettings_Click(object sender, RoutedEventArgs e)
  595. { if (indentSettings == null) { indentSettings = new IndentSettings() { Owner = this, Left = Left, Top = Top }; indentSettings.Closed += IndentSettings_Closed; ; }; indentSettings.Show(); }
  596. void IndentSettings_Closed(object sender, System.EventArgs e) { indentSettings = null; Focus(); }
  597. void specInsert(object sender, System.EventArgs e)
  598. { if (si == null) { si = new SpecInput(field) { Owner = this, Left = Left, Top = Top }; si.Closed += SpecInput_Closed; }; si.Show(); }
  599. void SpecInput_Closed(object sender, System.EventArgs e) { si = null; Focus(); }
  600. ErrorSettings errorSettings;
  601. void ErrorsSettings_Click(object sender, RoutedEventArgs e)
  602. { if (errorSettings == null) { errorSettings = new ErrorSettings() { Owner = this, Left = Left, Top = Top }; errorSettings.Closed += ErrorSettings_Closed; ; }; errorSettings.Show(); }
  603. void ErrorSettings_Closed(object sender, System.EventArgs e) { errorSettings = null; Focus(); }
  604. void close_file_Click(object sender, RoutedEventArgs e)
  605. {
  606. if (Tabs.Items.Count == 1) Tabs_TabStripItemClosing(new TabStripItemClosingEventArgs(Tabs.SelectedItem));
  607. else { removeTabFromTaskListLines(Tabs.SelectedItem.Tag); Tabs.RemoveTab(Tabs.SelectedItem); }
  608. }
  609. void syntaxHighlighting_Click(object sender, RoutedEventArgs e) => DataHelper.syntaxHighlighting_Click();// Включение/выключение подсветки синтаксиса
  610. void Fw_Closed(object sender, System.EventArgs e) { fw = null; Focus(); }
  611. void Rw_Closed(object sender, System.EventArgs e) { rw = null; Focus(); }
  612. }
  613. }