MarkRibbon.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. using Microsoft.Office.Core;
  2. using Microsoft.Office.Interop.Word;
  3. using Microsoft.Office.Tools.Ribbon;
  4. using Microsoft.Office.Tools.Word;
  5. using PdfSharp.Pdf;
  6. using PdfSharp;
  7. using System;
  8. using System.Collections;
  9. using System.Collections.Generic;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Net;
  13. using System.Net.Http;
  14. using System.Reflection;
  15. using System.Text;
  16. using System.Text.Json;
  17. using System.Text.RegularExpressions;
  18. using System.Threading.Tasks;
  19. using System.Windows.Forms;
  20. using static HTEXMark.QRCodeForm;
  21. using Task = System.Threading.Tasks.Task;
  22. using TheArtOfDev.HtmlRenderer.WinForms;
  23. using Xceed.Words.NET;
  24. namespace HTEXMark
  25. {
  26. public partial class MarkRibbon
  27. {
  28. public static MarkLanguage lang = null;
  29. public KnowledgeUserControl knowledgeUserControl;
  30. public System.Windows.Forms.ListBox knowledgeListBox;
  31. private HttpClient httpClient;
  32. public Microsoft.Office.Tools.CustomTaskPane customTaskPane;
  33. public static List<IdCodeNameCount> periodSubjects = new List<IdCodeNameCount>();
  34. public static string domain;
  35. private void MarkRibbon_Load(object sender, RibbonUIEventArgs e)
  36. {
  37. // 获取 Office 应用程序的语言设置
  38. LanguageSettings languageSettings = Globals.ThisAddIn.Application.LanguageSettings;
  39. // 获取主语言 ID
  40. int languageId = languageSettings.get_LanguageID(MsoAppLanguageID.msoLanguageIDUI);
  41. // 判断语言版本
  42. System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LangResource));
  43. var data = LangResource.lang;
  44. string str = System.Text.Encoding.UTF8.GetString(data);
  45. var json = JsonSerializer.Deserialize<JsonElement>(str);
  46. switch (languageId)
  47. {
  48. case 2052:
  49. // 2052 是简体中文的语言 ID
  50. //System.Windows.Forms.MessageBox.Show("Office 语言版本:简体中文");
  51. {
  52. json.TryGetProperty("cn", out JsonElement cn);
  53. lang = JsonSerializer.Deserialize<MarkLanguage>(cn);
  54. SetLang(lang);
  55. break;
  56. }
  57. case 1028:
  58. // 1028 是繁体中文的语言 ID
  59. // System.Windows.Forms.MessageBox.Show("Office 语言版本:繁体中文");
  60. {
  61. json.TryGetProperty("tw", out JsonElement tw);
  62. lang = JsonSerializer.Deserialize<MarkLanguage>(tw);
  63. SetLang(lang);
  64. break;
  65. }
  66. case 1033:
  67. // 1033 是英语的语言 ID
  68. // System.Windows.Forms.MessageBox.Show("Office 语言版本:英语");
  69. {
  70. json.TryGetProperty("en", out JsonElement en);
  71. lang = JsonSerializer.Deserialize<MarkLanguage>(en);
  72. SetLang(lang);
  73. break;
  74. }
  75. default:
  76. // System.Windows.Forms.MessageBox.Show("未知的 Office 语言版本:" + languageId.ToString());
  77. {
  78. json.TryGetProperty("en", out JsonElement en);
  79. lang = JsonSerializer.Deserialize<MarkLanguage>(en);
  80. SetLang(lang);
  81. break;
  82. }
  83. }
  84. domain="www.teammodel.cn";
  85. var itemCN = this.Factory.CreateRibbonDropDownItem();
  86. itemCN.Label=lang.china;
  87. itemCN.Tag="www.teammodel.cn";
  88. dataCenter.Items.Add(itemCN);
  89. var itemNet = this.Factory.CreateRibbonDropDownItem();
  90. itemNet.Label=lang.global;
  91. itemNet.Tag="www.teammodel.net";
  92. dataCenter.Items.Add(itemNet);
  93. dataCenter.SelectionChanged+=DataCenterSelectionChanged;
  94. knowledgeUserControl =new KnowledgeUserControl();
  95. customTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(knowledgeUserControl, lang.paneTitle);
  96. customTaskPane.Visible = false;
  97. knowledgeListBox= new System.Windows.Forms.ListBox();
  98. knowledgeListBox.Dock = DockStyle.Fill;
  99. knowledgeUserControl.Controls.Add(knowledgeListBox);
  100. httpClient = HttpClientFactory.Create();
  101. }
  102. private void DataCenterSelectionChanged(object sender, RibbonControlEventArgs e)
  103. {
  104. var data = sender as RibbonDropDown;
  105. knowledgeListBox.Items.Clear();
  106. schoolDropDown.Items.Clear();
  107. subjectDropDown.Items.Clear();
  108. user.Visible = false;
  109. qrcode.Visible=true;
  110. schoolDropDown.Visible=false;
  111. subjectDropDown.Visible=false;
  112. customTaskPane.Visible=false;
  113. domain=data.SelectedItem.Tag.ToString();
  114. }
  115. public async void SchoolSelectionChanged(object sender, RibbonControlEventArgs e)
  116. {
  117. var data = sender as RibbonDropDown;
  118. knowledgeListBox.Items.Clear();
  119. await AppendSubjectDropDown(data.SelectedItem.Tag.ToString(), httpClient);
  120. }
  121. public async Task AppendSubjectDropDown(string school,HttpClient httpClient)
  122. {
  123. subjectDropDown.Items.Clear();
  124. subjectDropDown.SelectionChanged-=SubjectSelectionChanged;
  125. knowledgeListBox.SelectedValueChanged-= KnowledgeListBoxSelectedValueChanged;
  126. knowledgeListBox.Items.Clear();
  127. var response = await httpClient.GetAsync($"https://{domain}/hita/get-school-data?school={school}&id_token={UserSettings.Default.id_token}");
  128. if (response.IsSuccessStatusCode)
  129. {
  130. string content = await response.Content.ReadAsStringAsync();
  131. if (!string.IsNullOrWhiteSpace(content))
  132. {
  133. var json = JsonSerializer.Deserialize<JsonElement>(content);
  134. periodSubjects = JsonSerializer.Deserialize<List<IdCodeNameCount>>(json.GetProperty("periodSubjects"));
  135. string auth_token = $"{json.GetProperty("auth_token")}";
  136. if (!string.IsNullOrWhiteSpace(auth_token)) {
  137. UserSettings.Default.x_auth_token= auth_token;
  138. }
  139. if (periodSubjects!=null && periodSubjects.Count>0)
  140. {
  141. var data = periodSubjects.OrderByDescending(x => x.count);
  142. foreach (var subject in data)
  143. {
  144. var item = this.Factory.CreateRibbonDropDownItem();
  145. item.Label=$"{subject.name}({subject.count})";
  146. item.Tag=$"{school}:{subject.periodId}:{subject.subjectId}";
  147. subjectDropDown.Items.Add(item);
  148. }
  149. subjectDropDown.SelectionChanged+=SubjectSelectionChanged;
  150. var blocks= await AppendKnowledge(school, data.First().periodId, data.First().subjectId, httpClient);
  151. knowledgeUserControl.InitializeTreeView(knowledgeListBox, blocks);
  152. knowledgeListBox.SelectedValueChanged+= KnowledgeListBoxSelectedValueChanged;
  153. }
  154. else
  155. {
  156. var itemDefault = this.Factory.CreateRibbonDropDownItem();
  157. itemDefault.Label=$"--------------";
  158. subjectDropDown.Items.Add(itemDefault);
  159. }
  160. }
  161. }
  162. }
  163. private void KnowledgeListBoxSelectedValueChanged(object sender, EventArgs e)
  164. {
  165. var box = sender as System.Windows.Forms.ListBox;
  166. var point =$"{box.SelectedItem}";
  167. Microsoft.Office.Interop.Word.Selection selection = Globals.ThisAddIn.Application.Selection;
  168. // 获取当前选择的范围
  169. Range selectedRange = selection.Range;
  170. // 获取当前光标所在行的范围
  171. Range lineRange = selectedRange.Paragraphs[1].Range;
  172. if (!string.IsNullOrWhiteSpace(lineRange.Text) && lineRange.Text.Contains(lang.point))
  173. {
  174. string str = lineRange.Text.TrimEnd();
  175. string textBeforeCursor = str.Substring(str.Length-1, 1);
  176. if ("..、::,,;".Contains(textBeforeCursor))
  177. {
  178. selection.TypeText($"{point}");
  179. }
  180. else
  181. {
  182. if (textBeforeCursor.Equals("}"))
  183. {
  184. selection.TypeText($"{point}");
  185. }
  186. else
  187. {
  188. selection.TypeText($",{point}");
  189. }
  190. }
  191. }
  192. else
  193. {
  194. MessageBox.Show(lang.pointMsgShow);
  195. }
  196. }
  197. private async void SubjectSelectionChanged(object sender, RibbonControlEventArgs e)
  198. {
  199. List<Block> blocks = new List<Block>();
  200. var data = sender as RibbonDropDown;
  201. knowledgeListBox.Items.Clear();
  202. knowledgeListBox.SelectedValueChanged-= KnowledgeListBoxSelectedValueChanged;
  203. string tag = data.SelectedItem.Tag.ToString();
  204. string[] tags = tag.Split(':');
  205. if (tags.Length==3)
  206. {
  207. blocks= await AppendKnowledge(tags[0], tags[1], tags[2], httpClient);
  208. knowledgeUserControl.InitializeTreeView(knowledgeListBox, blocks);
  209. knowledgeListBox.SelectedValueChanged+= KnowledgeListBoxSelectedValueChanged;
  210. }
  211. }
  212. public async Task<List<Block>> AppendKnowledge(string school, string periodId, string subjectId, HttpClient httpClient)
  213. {
  214. var response = await httpClient.GetAsync($"https://{domain}/hita/get-school-knowledge?school={school}&id={subjectId}&code={periodId}");
  215. if (response.IsSuccessStatusCode)
  216. {
  217. string content = await response.Content.ReadAsStringAsync();
  218. if (!string.IsNullOrWhiteSpace(content))
  219. {
  220. List<Block> block = new List<Block>();
  221. var json = JsonSerializer.Deserialize<JsonElement>(content);
  222. if (json.TryGetProperty("code", out JsonElement _code)&& $"{_code}".Equals("200"))
  223. {
  224. var points = JsonSerializer.Deserialize<List<string>>(json.GetProperty("points"));
  225. if (points!=null && points.Count>0)
  226. {
  227. block.Add(new Block { name="未归类", points=points });
  228. }
  229. //var blocks = JsonSerializer.Deserialize<List<Block>>(json.GetProperty("blocks"));
  230. //if (blocks!=null && blocks.Count>0)
  231. //{
  232. // block.AddRange(blocks);
  233. //}
  234. }
  235. return block;
  236. }
  237. }
  238. return null;
  239. }
  240. private void SetLang(MarkLanguage language) {
  241. item_mark_tab.Label=language.item_mark_tab;
  242. item_type.Label=language.item_type;
  243. item_taxonomy.Label=language.item_taxonomy;
  244. item_tool.Label=language.item_tool;
  245. //item_user.Label=language.item_user;
  246. single.Label=$"{language.single}\n";
  247. multiple.Label=$"{language.multiple}\n";
  248. judge.Label=$"{language.judge}\n";
  249. subjective.Label=$"{language.subjective}\n";
  250. complete.Label=$"{language.complete}\n";
  251. correct.Label=$"{language.correct}\n";
  252. draw.Label=$"{language.draw}\n";
  253. connector.Label=$"{language.connector}\n";
  254. compose.Label=$"{language.compose}\n";
  255. sortmultiple.Label=$"{language.sortmultiple}\n";
  256. remember.Label=$"{language.remember}\n";
  257. understand.Label=$"{language.understand}\n";
  258. apply.Label=$"{language.apply}\n";
  259. analyze.Label=$"{language.analyze}\n";
  260. evaluate.Label=$"{language.evaluate}\n";
  261. create.Label=$"{language.create}\n";
  262. taxonomy.Label=$"{language.taxonomy}\n";
  263. answer.Label=$"{language.answer}\n";
  264. analysis.Label=$"{language.analysis}\n";
  265. score.Label=$"{language.score}\n";
  266. point.Label=$"{language.point}\n";
  267. itrue.Label=$"{language.itrue}\n";
  268. ifalse.Label=$"{language.ifalse}\n";
  269. ended.Label=$"{language.ended}\n";
  270. level.Label=$"{language.level}\n";
  271. count.Label=$"{language.count}\n";
  272. qrcode.Label=$"{language.qrcode}\n";
  273. user.Label=$"{language.user}\n";
  274. item_user.Label=$"{language.item_user}";
  275. qrcode.Label=$"{language.qrcode}\n";
  276. user.Label=$"{language.user}\n";
  277. schoolDropDown.Label=$"{language.schoolDropDown}";
  278. subjectDropDown.Label=$"{language.subjectDropDown}";
  279. dataCenter.Label=$"{language.dataCenter}";
  280. //
  281. single.Tag=language.single;
  282. multiple.Tag=language.multiple;
  283. judge.Tag=language.judge;
  284. subjective.Tag=language.subjective;
  285. complete.Tag=language.complete;
  286. correct.Tag=language.correct;
  287. draw.Tag=language.draw;
  288. connector.Tag=language.connector;
  289. compose.Tag=language.compose;
  290. sortmultiple.Tag=language.sortmultiple;
  291. remember.Tag=language.remember;
  292. understand.Tag=language.understand;
  293. apply.Tag=language.apply;
  294. analyze.Tag=language.analyze;
  295. evaluate.Tag=language.evaluate;
  296. create.Tag=language.create;
  297. taxonomy.Tag=language.taxonomy;
  298. answer.Tag=language.answer;
  299. analysis.Tag=language.analysis;
  300. score.Tag=language.score;
  301. point.Tag=language.point;
  302. itrue.Tag=language.itrue;
  303. ifalse.Tag=language.ifalse;
  304. ended.Tag=language.ended;
  305. level.Tag=language.level;
  306. count.Tag=language.count;
  307. }
  308. private void QRCode_Click(object sender, RibbonControlEventArgs e) {
  309. // 创建 Windows Forms 窗口
  310. var qrcode_button = sender as RibbonButton;
  311. QRCodeForm qrCodeForm = new QRCodeForm(AI, qrcode_button, user, schoolDropDown, subjectDropDown, lang, this, customTaskPane,domain);
  312. CenterFormOnScreen(qrCodeForm);
  313. qrCodeForm.ShowDialog();
  314. }
  315. public void CenterFormOnScreen(Control qrCodeForm)
  316. {
  317. // 获取屏幕的工作区域
  318. var workingArea = System.Windows.Forms.Screen.GetWorkingArea(qrCodeForm);
  319. // 计算窗体应该显示的位置
  320. int x = (workingArea.Width - qrCodeForm.Width) / 2 + workingArea.Left;
  321. int y = (workingArea.Height - qrCodeForm.Height) / 2 + workingArea.Top;
  322. // 设置窗体位置
  323. qrCodeForm.Location = new System.Drawing.Point(x, y);
  324. }
  325. private bool IsCursorAtLineStart(Selection selection)
  326. {
  327. // 获取当前选择的范围
  328. Range selectedRange = selection.Range;
  329. // 获取当前光标所在行的范围
  330. Range lineRange = selectedRange.Paragraphs[1].Range;
  331. // 判断光标是否在行的开始
  332. bool isAtLineStart = (selectedRange.Start == lineRange.Start);
  333. return isAtLineStart;
  334. }
  335. private void MarkTags_Click(object sender, RibbonControlEventArgs e)
  336. { // 在这里根据按钮的标识执行相应的操作
  337. var button = sender as RibbonButton;
  338. string buttonId = button.Id;
  339. string buttonTag = button.Tag.ToString();
  340. Microsoft.Office.Interop.Word.Selection selection = Globals.ThisAddIn.Application.Selection;
  341. string br = string.Empty;
  342. if (!IsCursorAtLineStart(selection))
  343. {
  344. br="\n";
  345. }
  346. if (buttonId.Equals("compose"))
  347. {
  348. // 获取 Office 应用程序的语言设置
  349. LanguageSettings languageSettings = Globals.ThisAddIn.Application.LanguageSettings;
  350. // 获取主语言 ID
  351. int languageId = languageSettings.get_LanguageID(MsoAppLanguageID.msoLanguageIDUI);
  352. // 判断语言版本
  353. switch (languageId)
  354. {
  355. case 2052:
  356. // 2052 是简体中文的语言 ID
  357. selection.TypeText(br+"{" + buttonTag + "}\n\n{综合题结束}\n"); break;
  358. case 1028:
  359. // 1028 是繁体中文的语言 ID
  360. selection.TypeText(br+"{" + buttonTag + "}\n\n{題組題結束}\n"); break;
  361. case 1033:
  362. // 1033 是英语的语言 ID
  363. selection.TypeText(br+"{" + buttonTag + "}\n\n{QuestionGroupEnded}\n"); break;
  364. default:
  365. // System.Windows.Forms.MessageBox.Show("未知的 Office 语言版本:" + languageId.ToString());
  366. selection.TypeText(br+"{" + buttonTag + "}");
  367. break;
  368. }
  369. }
  370. else if (buttonId.Equals("ended")) {
  371. // 获取 Office 应用程序的语言设置
  372. LanguageSettings languageSettings = Globals.ThisAddIn.Application.LanguageSettings;
  373. // 获取主语言 ID
  374. int languageId = languageSettings.get_LanguageID(MsoAppLanguageID.msoLanguageIDUI);
  375. // 判断语言版本
  376. switch (languageId)
  377. {
  378. case 2052:
  379. // 2052 是简体中文的语言 ID
  380. selection.TypeText(br+"{综合题结束}\n"); break;
  381. case 1028:
  382. // 1028 是繁体中文的语言 ID
  383. selection.TypeText(br+"{題組題結束}\n"); break;
  384. case 1033:
  385. // 1033 是英语的语言 ID
  386. selection.TypeText(br+"{QuestionGroupEnded}\n"); break;
  387. default:
  388. // System.Windows.Forms.MessageBox.Show("未知的 Office 语言版本:" + languageId.ToString());
  389. selection.TypeText(br+"{QuestionGroupEnded}\n");
  390. break;
  391. }
  392. }
  393. else
  394. {
  395. if (buttonId.Equals("remember")||buttonId.Equals("understand")||buttonId.Equals("apply")||buttonId.Equals("analyze")
  396. ||buttonId.Equals("evaluate")||buttonId.Equals("create"))
  397. {
  398. // 获取当前选择的范围
  399. Range selectedRange = selection.Range;
  400. // 获取当前光标所在行的范围
  401. Range lineRange = selectedRange.Paragraphs[1].Range;
  402. if (lineRange.Text.Contains(lang.taxonomy))
  403. {
  404. selection.TypeText( buttonTag+"\n");
  405. }
  406. else {
  407. selection.TypeText(br + "{" + buttonTag + "}\n");
  408. }
  409. }
  410. else if (buttonId.Equals("itrue")||buttonId.Equals("ifalse")) {
  411. selection.TypeText(br + "{" + buttonTag + "}\n");
  412. }
  413. else
  414. {
  415. selection.TypeText(br+"{" + buttonTag + "}");
  416. }
  417. }
  418. }
  419. private async void XKW_Click(object sender, RibbonControlEventArgs e)
  420. {
  421. Microsoft.Office.Interop.Word.Application wordApp = Globals.ThisAddIn.Application;
  422. // string html = await SparkAI("");
  423. //string processedHtml = ProcessRemoteImages(html);
  424. //InsertHtmlIntoWord(wordApp, processedHtml);
  425. // 在Word中粘贴HTML内容
  426. }
  427. private string ConvertHtmlToDocx(string htmlContent)
  428. {
  429. using (DocX document = DocX.Create(new MemoryStream()))
  430. {
  431. document.InsertParagraph(htmlContent);
  432. // Save DOCX content to string
  433. string docxContent = document.Xml.ToString();
  434. return docxContent;
  435. }
  436. }
  437. private void InsertHtmlIntoWord(Microsoft.Office.Interop.Word.Application wordApp, string htmlContent)
  438. {
  439. // 获取当前光标位置的 Range 对象
  440. Range range = wordApp.Selection.Range;
  441. // 将HTML文本放入剪贴板
  442. //Clipboard.SetText(htmlContent, TextDataFormat.Html);
  443. string rtfContent = "{\\rtf1\\ansi\\ansicpg1252\\uc1\\htmautsp\\deff2{\\fonttbl{\\f0\\fcharset0 Times New Roman;}{\\f2\\fcharset0 Microsoft YaHei UI;}}{\\colortbl\\red0\\green0\\blue0;\\red255\\green255\\blue255;}\\loch\\hich\\dbch\\pard\\plain\\ltrpar\\itap0{\\lang1033\\fs43\\f2\\cf0 \\cf0\\ql{\\f2 {\\ltrch Hello, World!}\\li0\\ri0\\sa0\\sb0\\fi0\\ql\\par}\r\n}\r\n}";
  444. // 使用 Clipboard 将 HTML 内容转换为 RTF 格式
  445. System.Windows.Forms.Clipboard.SetText(rtfContent, TextDataFormat.Rtf);
  446. // 检查剪贴板是否包含文本
  447. // Create a range at the end of the document
  448. // Paste HTML from clipboard into the range
  449. wordApp.ActiveDocument.Application.Selection.Range.PasteSpecial(DataType: WdPasteDataType.wdPasteRTF);
  450. // 清除 Clipboard 内容
  451. System.Windows.Forms.Clipboard.Clear();
  452. }
  453. private string ConvertPdfToRtf(string htmlContent)
  454. {
  455. using (RichTextBox richTextBox = new RichTextBox())
  456. {
  457. // Load HTML into RichTextBox
  458. richTextBox.Rtf = null;
  459. // Get RTF content
  460. string rtfContent = richTextBox.Rtf;
  461. return rtfContent;
  462. }
  463. }
  464. private string ProcessRemoteImages(string htmlContent)
  465. {
  466. // 匹配HTML中的img标签
  467. Regex imgRegex = new Regex("<img.*?src=['\"](.*?)['\"].*?>", RegexOptions.IgnoreCase);
  468. // 替换img标签中的远程图片链接
  469. string processedHtml = imgRegex.Replace(htmlContent, match =>
  470. {
  471. string imageUrl = match.Groups[1].Value;
  472. // 下载远程图片并转为Base64
  473. string base64Image = Task.Run(async () => await DownloadAndConvertToBase64(imageUrl)).Result;
  474. // 返回Base64编码的图片数据作为替换
  475. return $"<img src='data:image/jpeg;base64,{base64Image}' alt='Remote Image'>";
  476. });
  477. return processedHtml;
  478. }
  479. private async Task<string> DownloadAndConvertToBase64(string imageUrl)
  480. { // 设置支持 TLS 1.2
  481. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
  482. // 下载远程图片的字节数组
  483. byte[] imageBytes = await httpClient.GetByteArrayAsync(imageUrl);
  484. // 转为Base64编码
  485. string base64Image = Convert.ToBase64String(imageBytes);
  486. return base64Image;
  487. }
  488. private void AI_Click(object sender, RibbonControlEventArgs e)
  489. {
  490. var ai_button = sender as RibbonButton;
  491. AI_Form aiForm = new AI_Form(periodSubjects, ai_button, user, schoolDropDown, subjectDropDown, lang, this, customTaskPane, domain);
  492. CenterFormOnScreen(aiForm);
  493. aiForm.ShowDialog();
  494. }
  495. }
  496. }