PolycodeWinIDEView.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. #include "PolycodeWinIDEView.h"
  2. #include "PolyWinCore.h"
  3. #include "PolyCoreServices.h"
  4. #include "PolyCoreInput.h"
  5. #include "PolyRenderer.h"
  6. #include <io.h>
  7. #include <fcntl.h>
  8. #include <ios>
  9. #include "resource.h"
  10. #include "PolycodeIDEApp.h"
  11. using namespace Polycode;
  12. Win32Core *core = NULL;
  13. PolycodeIDEApp *globalApp = NULL;
  14. static void OpenConsole()
  15. {
  16. int outHandle, errHandle, inHandle;
  17. FILE *outFile, *errFile, *inFile;
  18. AllocConsole();
  19. CONSOLE_SCREEN_BUFFER_INFO coninfo;
  20. GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
  21. coninfo.dwSize.Y = 9999;
  22. SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
  23. outHandle = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
  24. errHandle = _open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE),_O_TEXT);
  25. inHandle = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE),_O_TEXT );
  26. outFile = _fdopen(outHandle, "w" );
  27. errFile = _fdopen(errHandle, "w");
  28. inFile = _fdopen(inHandle, "r");
  29. *stdout = *outFile;
  30. *stderr = *errFile;
  31. *stdin = *inFile;
  32. setvbuf( stdout, NULL, _IONBF, 0 );
  33. setvbuf( stderr, NULL, _IONBF, 0 );
  34. setvbuf( stdin, NULL, _IONBF, 0 );
  35. std::ios::sync_with_stdio();
  36. }
  37. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  38. {
  39. int nWidth, nHeight;
  40. bool useDefault = false;
  41. if(!core)
  42. return DefWindowProc(hWnd, message, wParam, lParam);
  43. switch (message)
  44. {
  45. case WM_COMMAND:
  46. switch (LOWORD(wParam))
  47. {
  48. case ID_FILE_NEW_FILE:
  49. globalApp->newFile();
  50. break;
  51. case ID_FILE_NEW_PROJECT:
  52. globalApp->newProject();
  53. break;
  54. case ID_FILE_NEW_FOLDER:
  55. globalApp->newGroup();
  56. break;
  57. case ID_FILE_OPEN_PROJECT:
  58. globalApp->openProject();
  59. break;
  60. case ID_FILE_CLOSE_FILE:
  61. globalApp->closeFile();
  62. break;
  63. case ID_FILE_CLOSE_PROJECT:
  64. globalApp->closeProject();
  65. break;
  66. case ID_FILE_REMOVE_FILE:
  67. globalApp->removeFile();
  68. break;
  69. case ID_FILE_REFRESH_PROJECT:
  70. globalApp->refreshProject();
  71. break;
  72. case ID_FILE_SAVE_FILE:
  73. globalApp->saveFile();
  74. break;
  75. case ID_FILE_BROWSE_EXAMPLES:
  76. globalApp->browseExamples();
  77. break;
  78. case ID_FILE_EXIT:
  79. {
  80. globalApp->saveConfigFile();
  81. bool retVal = globalApp->quitApp();
  82. if (retVal) {
  83. core->Shutdown();
  84. useDefault = true;
  85. }
  86. }
  87. break;
  88. case ID_EDIT_UNDO:
  89. core->dispatchEvent(new Event(), Core::EVENT_UNDO);
  90. break;
  91. case ID_EDIT_REDO:
  92. core->dispatchEvent(new Event(), Core::EVENT_REDO);
  93. break;
  94. case ID_EDIT_CUT:
  95. core->dispatchEvent(new Event(), Core::EVENT_CUT);
  96. break;
  97. case ID_EDIT_COPY:
  98. core->dispatchEvent(new Event(), Core::EVENT_COPY);
  99. break;
  100. case ID_EDIT_PASTE:
  101. core->dispatchEvent(new Event(), Core::EVENT_PASTE);
  102. break;
  103. case ID_EDIT_SELECT_ALL:
  104. core->dispatchEvent(new Event(), Core::EVENT_SELECT_ALL);
  105. break;
  106. case ID_EDIT_FIND:
  107. globalApp->findText();
  108. break;
  109. case ID_EDIT_PREFERENCES:
  110. globalApp->showSettings();
  111. break;
  112. case ID_VIEW_CREATE_TAB:
  113. globalApp->createNewTab();
  114. break;
  115. case ID_VIEW_SELECT_NEXT_TAB:
  116. globalApp->showNextTab();
  117. break;
  118. case ID_VIEW_SELECT_PREV_TAB:
  119. globalApp->showPreviousTab();
  120. break;
  121. case ID_VIEW_CLOSE_TAB:
  122. globalApp->closeTab();
  123. break;
  124. case ID_VIEW_TOGGLE_CONSOLE:
  125. globalApp->toggleConsole();
  126. break;
  127. case ID_PROJECT_RUN:
  128. globalApp->runProject();
  129. break;
  130. case ID_PROJECT_EXPORT:
  131. globalApp->exportProject();
  132. break;
  133. case ID_HELP_ABOUT:
  134. globalApp->showAbout();
  135. break;
  136. case ID_HELP_REFERENCE:
  137. globalApp->openDocs();
  138. break;
  139. }
  140. break;
  141. case WM_COPYDATA:
  142. {
  143. COPYDATASTRUCT *cp = (COPYDATASTRUCT*)lParam;
  144. wchar_t *stringData = (wchar_t*)cp->lpData;
  145. core->copyDataString = String(stringData);
  146. core->hasCopyDataString = true;
  147. }
  148. break;
  149. case WM_SIZE:
  150. nWidth = LOWORD(lParam);
  151. nHeight = HIWORD(lParam);
  152. if(core) {
  153. core->handleViewResize(nWidth, nHeight);
  154. }
  155. break;
  156. case WM_MOUSEMOVE:
  157. if(core)
  158. core->handleMouseMove(lParam,wParam);
  159. break;
  160. case WM_MOUSEWHEEL:
  161. if(core)
  162. core->handleMouseWheel(lParam,wParam);
  163. break;
  164. case WM_LBUTTONDOWN:
  165. if(core)
  166. core->handleMouseDown(CoreInput::MOUSE_BUTTON1, lParam,wParam);
  167. break;
  168. case WM_LBUTTONUP:
  169. if(core)
  170. core->handleMouseUp(CoreInput::MOUSE_BUTTON1, lParam,wParam);
  171. break;
  172. case WM_RBUTTONDOWN:
  173. if(core)
  174. core->handleMouseDown(CoreInput::MOUSE_BUTTON2, lParam,wParam);
  175. break;
  176. case WM_RBUTTONUP:
  177. if(core)
  178. core->handleMouseUp(CoreInput::MOUSE_BUTTON2, lParam,wParam);
  179. break;
  180. #ifndef NO_TOUCH_API
  181. case WM_TOUCH:
  182. if(core) {
  183. if(core->isMultiTouchEnabled()) {
  184. core->handleTouchEvent(lParam, wParam);
  185. }
  186. }
  187. break;
  188. #endif
  189. case WM_MBUTTONDOWN:
  190. if(core)
  191. core->handleMouseDown(CoreInput::MOUSE_BUTTON3, lParam,wParam);
  192. break;
  193. case WM_MBUTTONUP:
  194. if(core)
  195. core->handleMouseUp(CoreInput::MOUSE_BUTTON3, lParam,wParam);
  196. break;
  197. case WM_KEYDOWN:
  198. case WM_SYSKEYDOWN:
  199. if(core) {
  200. wchar_t unicodeChar = 0;
  201. MSG m;
  202. m.hwnd = hWnd;
  203. m.message = message;
  204. m.wParam = wParam;
  205. m.lParam = lParam;
  206. m.time = 0;
  207. if ( PeekMessage(&m, hWnd, 0, WM_USER, PM_NOREMOVE) && (m.message == WM_CHAR) ) {
  208. GetMessage(&m, hWnd, 0, WM_USER);
  209. unicodeChar = (wchar_t)m.wParam;
  210. }
  211. core->handleKeyDown(lParam,wParam, unicodeChar);
  212. }
  213. break;
  214. case WM_KEYUP:
  215. case WM_SYSKEYUP:
  216. if(core)
  217. core->handleKeyUp(lParam,wParam);
  218. break;
  219. case WM_CLOSE:
  220. {
  221. globalApp->saveConfigFile();
  222. bool retVal = globalApp->quitApp();
  223. if (retVal) {
  224. core->Shutdown();
  225. useDefault = true;
  226. }
  227. }
  228. break;
  229. case WM_DESTROY:
  230. PostQuitMessage(0);
  231. break;
  232. default:
  233. useDefault = true;
  234. break;
  235. }
  236. if (useDefault)
  237. return DefWindowProc(hWnd, message, wParam, lParam);
  238. else
  239. return 0;
  240. }
  241. PolycodeWinIDEView::PolycodeWinIDEView(HINSTANCE hInstance, int nCmdShow, LPCTSTR windowTitle, bool resizable, bool showDebugConsole) : PolycodeViewBase() {
  242. /*
  243. typedef BOOL(WINAPI *SetProcessDPIAwarePtr)(VOID);
  244. SetProcessDPIAwarePtr set_process_dpi_aware_func = GetProcAddress(GetModuleHandleA("user32.dll"), "SetProcessDPIAware");
  245. if (set_process_dpi_aware_func) {
  246. set_process_dpi_aware_func();
  247. }
  248. */
  249. WNDCLASSEX wcex;
  250. wcex.cbSize = sizeof(WNDCLASSEX);
  251. wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
  252. wcex.lpfnWndProc = WndProc;
  253. wcex.cbClsExtra = 0;
  254. wcex.cbWndExtra = 0;
  255. wcex.hInstance = hInstance;
  256. wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
  257. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  258. wcex.hbrBackground = NULL;
  259. wcex.lpszMenuName = MAKEINTRESOURCE(IDR_POLYCODEMENU);
  260. wcex.lpszClassName = L"POLYCODEAPPLICATION";
  261. wcex.hIconSm = LoadIcon(hInstance, IDI_APPLICATION);
  262. RegisterClassEx(&wcex);
  263. if(resizable) {
  264. hwnd = CreateWindowEx(WS_EX_APPWINDOW, L"POLYCODEAPPLICATION", windowTitle, WS_OVERLAPPEDWINDOW|WS_SYSMENU, 0, 0, 640, 480, NULL, NULL, hInstance, NULL);
  265. } else {
  266. hwnd = CreateWindowEx(WS_EX_APPWINDOW, L"POLYCODEAPPLICATION", windowTitle, WS_OVERLAPPED|WS_SYSMENU, 0, 0, 640, 480, NULL, NULL, hInstance, NULL);
  267. }
  268. windowData = (void*)&hwnd;
  269. ShowWindow(hwnd, nCmdShow);
  270. UpdateWindow(hwnd);
  271. haccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(POLYCODE_ACCELERATORS));
  272. if(showDebugConsole) {
  273. OpenConsole();
  274. }
  275. }
  276. PolycodeWinIDEView::~PolycodeWinIDEView() {
  277. }