ScriptEditor.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. // ScriptEditor.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CP_Main.h"
  5. #include "ScriptEditor.h"
  6. #include "afxdialogex.h"
  7. #include "ChaiScriptOnCopy.h"
  8. #include "Shared\TextConvert.h"
  9. #include "DittoChaiScript.h"
  10. // CScriptEditor dialog
  11. IMPLEMENT_DYNAMIC(CScriptEditor, CDialogEx)
  12. CScriptEditor::CScriptEditor(CWnd* pParent /*=NULL*/)
  13. : CDialogEx(IDD_SCRIPT_EDITOR, pParent)
  14. {
  15. }
  16. CScriptEditor::~CScriptEditor()
  17. {
  18. }
  19. void CScriptEditor::DoDataExchange(CDataExchange* pDX)
  20. {
  21. CDialogEx::DoDataExchange(pDX);
  22. DDX_Control(pDX, IDC_LIST_SCRIPTS, m_scriptsList);
  23. DDX_Control(pDX, IDC_RICHEDIT21, m_rich);
  24. }
  25. BEGIN_MESSAGE_MAP(CScriptEditor, CDialogEx)
  26. ON_LBN_SELCHANGE(IDC_LIST_SCRIPTS, &CScriptEditor::OnLbnSelchangeListScripts)
  27. ON_BN_CLICKED(IDC_BUTTON_ADD_SCRIPT, &CScriptEditor::OnBnClickedButtonAddScript)
  28. ON_EN_KILLFOCUS(IDC_EDIT_NAME, &CScriptEditor::OnEnKillfocusEditName)
  29. ON_EN_KILLFOCUS(IDC_EDIT_DESC, &CScriptEditor::OnEnKillfocusEditDesc)
  30. ON_EN_KILLFOCUS(IDC_RICHEDIT21, &CScriptEditor::OnEnKillfocusEditScript)
  31. ON_BN_CLICKED(IDC_CHECK_ACTIVE, &CScriptEditor::OnBnClickedCheckActive)
  32. ON_WM_SIZE()
  33. ON_BN_CLICKED(IDC_BUTTON_DELETE_SCRIPT, &CScriptEditor::OnBnClickedButtonDeleteScript)
  34. ON_BN_CLICKED(IDC_BUTTON_RUN, &CScriptEditor::OnBnClickedButtonRun)
  35. END_MESSAGE_MAP()
  36. // CScriptEditor message handlers
  37. BOOL CScriptEditor::OnInitDialog()
  38. {
  39. CDialogEx::OnInitDialog();
  40. SetWindowText(m_title);
  41. int index = 0;
  42. for (auto & listItem : m_xml.m_list)
  43. {
  44. int row = m_scriptsList.AddString(listItem.m_name);
  45. m_scriptsList.SetItemData(row, index);
  46. index++;
  47. }
  48. if (index > 0)
  49. {
  50. m_scriptsList.SetSel(0);
  51. m_scriptsList.SetCurSel(0);
  52. m_scriptsList.SetCaretIndex(0);
  53. m_scriptsList.SetAnchorIndex(0);
  54. OnLbnSelchangeListScripts();
  55. }
  56. else
  57. {
  58. EnableDisable(FALSE);
  59. }
  60. m_resize.SetParent(m_hWnd);
  61. m_resize.AddControl(IDOK, DR_MoveTop | DR_MoveLeft);
  62. m_resize.AddControl(IDCANCEL, DR_MoveTop | DR_MoveLeft);
  63. m_resize.AddControl(IDC_LIST_SCRIPTS, DR_SizeHeight);
  64. m_resize.AddControl(IDC_EDIT_DESC, DR_SizeWidth);
  65. m_resize.AddControl(IDC_EDIT_NAME, DR_SizeWidth);
  66. m_resize.AddControl(IDC_RICHEDIT21, DR_SizeWidth | DR_SizeHeight);
  67. m_resize.AddControl(IDC_STATIC_RETURN_DESC, DR_MoveTop | DR_SizeWidth);
  68. m_resize.AddControl(IDC_STATIC_INPUT, DR_MoveTop);
  69. m_resize.AddControl(IDD_SCRIPT_EDITOR, DR_MoveTop | DR_SizeWidth);
  70. m_resize.AddControl(IDC_EDIT_OUTPUT, DR_MoveTop | DR_SizeWidth);
  71. m_resize.AddControl(IDC_STATIC_OUTPUT, DR_MoveTop);
  72. m_resize.AddControl(IDC_EDIT_INPUT, DR_MoveTop | DR_SizeWidth);
  73. m_resize.AddControl(IDC_BUTTON_RUN, DR_MoveTop | DR_MoveLeft);
  74. m_resize.AddControl(IDC_EDIT_ACTIVE_APP, DR_MoveTop | DR_MoveLeft);
  75. m_resize.AddControl(IDC_EDIT_ACTIVE_APP_TITLE, DR_MoveTop | DR_MoveLeft);
  76. m_resize.AddControl(IDC_BUTTON_DELETE_SCRIPT, DR_MoveTop);
  77. m_resize.AddControl(IDC_BUTTON_ADD_SCRIPT, DR_MoveTop);
  78. SetDlgItemText(IDC_EDIT_ACTIVE_APP, _T("App name"));
  79. SetDlgItemText(IDC_EDIT_ACTIVE_APP_TITLE, _T("App Title"));
  80. return FALSE;
  81. }
  82. void CScriptEditor::OnLbnSelchangeListScripts()
  83. {
  84. int listIndex = m_scriptsList.GetCurSel();
  85. if (listIndex >= 0 && listIndex < m_xml.m_list.size())
  86. {
  87. this->SetDlgItemText(IDC_EDIT_NAME, m_xml.m_list[listIndex].m_name);
  88. this->SetDlgItemText(IDC_EDIT_DESC, m_xml.m_list[listIndex].m_description);
  89. if (m_xml.m_list[listIndex].m_active)
  90. {
  91. this->CheckDlgButton(IDC_CHECK_ACTIVE, BST_CHECKED);
  92. }
  93. else
  94. {
  95. this->CheckDlgButton(IDC_CHECK_ACTIVE, BST_UNCHECKED);
  96. }
  97. this->SetDlgItemText(IDC_RICHEDIT21, m_xml.m_list[listIndex].m_script);
  98. this->GetDlgItem(IDC_EDIT_NAME)->SetFocus();
  99. }
  100. }
  101. void CScriptEditor::OnBnClickedButtonAddScript()
  102. {
  103. CDittoChaiScriptXmlItem newItem;
  104. newItem.m_name = _T("New Script");
  105. newItem.m_active = true;
  106. newItem.m_guid = NewGuidString();
  107. m_xml.m_list.push_back(newItem);
  108. int index = m_scriptsList.AddString(newItem.m_name);
  109. m_scriptsList.SetSel(index);
  110. m_scriptsList.SetCurSel(index);
  111. m_scriptsList.SetCaretIndex(index);
  112. m_scriptsList.SetAnchorIndex(index);
  113. this->SetDlgItemText(IDC_EDIT_NAME, newItem.m_name);
  114. this->SetDlgItemText(IDC_EDIT_DESC, _T(""));
  115. this->SetDlgItemText(IDC_RICHEDIT21, _T(""));
  116. this->CheckDlgButton(IDC_CHECK_ACTIVE, BST_CHECKED);
  117. this->GetDlgItem(IDC_EDIT_NAME)->SetFocus();
  118. EnableDisable(TRUE);
  119. }
  120. void CScriptEditor::OnEnKillfocusEditName()
  121. {
  122. int listIndex = m_scriptsList.GetCurSel();
  123. if (listIndex >= 0 && listIndex < m_xml.m_list.size())
  124. {
  125. CString name;
  126. this->GetDlgItemText(IDC_EDIT_NAME, name);
  127. if (m_xml.m_list[listIndex].m_name != name)
  128. {
  129. m_xml.m_list[listIndex].m_name = name;
  130. m_scriptsList.SetRedraw(FALSE);
  131. m_scriptsList.DeleteString(listIndex);
  132. m_scriptsList.InsertString(listIndex, name);
  133. m_scriptsList.SetSel(listIndex);
  134. m_scriptsList.SetCurSel(listIndex);
  135. m_scriptsList.SetCaretIndex(listIndex);
  136. m_scriptsList.SetAnchorIndex(listIndex);
  137. m_scriptsList.SetRedraw(TRUE);
  138. m_scriptsList.UpdateWindow();
  139. }
  140. }
  141. }
  142. void CScriptEditor::OnEnKillfocusEditDesc()
  143. {
  144. int listIndex = m_scriptsList.GetCurSel();
  145. if (listIndex >= 0 && listIndex < m_xml.m_list.size())
  146. {
  147. CString desc;
  148. this->GetDlgItemText(IDC_EDIT_DESC, desc);
  149. m_xml.m_list[listIndex].m_description = desc;
  150. }
  151. }
  152. void CScriptEditor::OnEnKillfocusEditScript()
  153. {
  154. int listIndex = m_scriptsList.GetCurSel();
  155. if (listIndex >= 0 && listIndex < m_xml.m_list.size())
  156. {
  157. CString script;
  158. this->GetDlgItemText(IDC_RICHEDIT21, script);
  159. m_xml.m_list[listIndex].m_script = script;
  160. }
  161. }
  162. void CScriptEditor::OnBnClickedCheckActive()
  163. {
  164. int listIndex = m_scriptsList.GetCurSel();
  165. if (listIndex >= 0 && listIndex < m_xml.m_list.size())
  166. {
  167. if (this->IsDlgButtonChecked(IDC_CHECK_ACTIVE) == BST_CHECKED)
  168. {
  169. m_xml.m_list[listIndex].m_active = true;
  170. }
  171. else
  172. {
  173. m_xml.m_list[listIndex].m_active = false;
  174. }
  175. }
  176. }
  177. void CScriptEditor::OnSize(UINT nType, int cx, int cy)
  178. {
  179. CDialogEx::OnSize(nType, cx, cy);
  180. m_resize.MoveControls(CSize(cx, cy));
  181. }
  182. void CScriptEditor::OnBnClickedButtonDeleteScript()
  183. {
  184. int listIndex = m_scriptsList.GetCurSel();
  185. if (listIndex >= 0 && listIndex < m_xml.m_list.size())
  186. {
  187. m_xml.m_list.erase(m_xml.m_list.begin() + listIndex);
  188. m_scriptsList.DeleteString(listIndex);
  189. if (m_scriptsList.GetCount() <= listIndex)
  190. {
  191. listIndex--;
  192. }
  193. if (listIndex >= 0)
  194. {
  195. m_scriptsList.SetSel(listIndex);
  196. m_scriptsList.SetCurSel(listIndex);
  197. m_scriptsList.SetCaretIndex(listIndex);
  198. m_scriptsList.SetAnchorIndex(listIndex);
  199. OnLbnSelchangeListScripts();
  200. }
  201. else
  202. {
  203. EnableDisable(FALSE);
  204. }
  205. }
  206. }
  207. void CScriptEditor::EnableDisable(BOOL enable)
  208. {
  209. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_NAME), enable);
  210. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_DESC), enable);
  211. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_RICHEDIT21), enable);
  212. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_INPUT), enable);
  213. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_EDIT_OUTPUT), enable);
  214. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_BUTTON_RUN), enable);
  215. ::EnableWindow(::GetDlgItem(m_hWnd, IDC_CHECK_ACTIVE), enable);
  216. }
  217. void CScriptEditor::OnBnClickedButtonRun()
  218. {
  219. CWaitCursor wait;
  220. CString input;
  221. GetDlgItemText(IDC_EDIT_INPUT, input);
  222. CString script;
  223. GetDlgItemText(IDC_RICHEDIT21, script);
  224. CString app;
  225. GetDlgItemText(IDC_EDIT_ACTIVE_APP, app);
  226. CString appTitle;
  227. GetDlgItemText(IDC_EDIT_ACTIVE_APP_TITLE, appTitle);
  228. CClip clip;
  229. ChaiScriptOnCopy test;
  230. CDittoChaiScript clipData(&clip, (LPCSTR)CTextConvert::UnicodeStringToMultiByte(app), (LPCSTR)CTextConvert::UnicodeStringToMultiByte(appTitle));
  231. clipData.SetAsciiString((LPCSTR)CTextConvert::UnicodeStringToMultiByte(input));
  232. test.ProcessScript(clipData, (LPCSTR)CTextConvert::UnicodeStringToMultiByte(script));
  233. if (test.m_lastError == _T(""))
  234. {
  235. SetDlgItemText(IDC_EDIT_OUTPUT, _T("returned false\r\n") + CTextConvert::MultiByteToUnicodeString(clipData.GetAsciiString().c_str()));
  236. }
  237. else
  238. {
  239. SetDlgItemText(IDC_EDIT_OUTPUT, test.m_lastError);
  240. }
  241. }
  242. BOOL CScriptEditor::PreTranslateMessage(MSG* pMsg)
  243. {
  244. // TODO: Add your specialized code here and/or call the base class
  245. if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_TAB) && (pMsg->hwnd == m_rich.GetSafeHwnd()))
  246. {
  247. long lStart, lEnd;
  248. m_rich.GetSel(lStart, lEnd);
  249. // select zero chars
  250. m_rich.SetSel(lStart, lStart);
  251. // then replace that selection with a TAB
  252. m_rich.ReplaceSel(_T("\t"), TRUE);
  253. // no need to do a msg translation, so quit.
  254. // that way no further processing gets done
  255. return TRUE;
  256. }
  257. return CDialogEx::PreTranslateMessage(pMsg);
  258. }