/*************************************************
 * Windows callback
 *************************************************/
static LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
	// salvapantallas
	if( uMsg==WM_SYSCOMMAND && (wParam==SC_SCREENSAVE || wParam==SC_MONITORPOWER) )
		return( 0 );

	// boton x o pulsacion de escape
	//if( uMsg==WM_CLOSE || uMsg==WM_DESTROY || (uMsg==WM_KEYDOWN && wParam==VK_ESCAPE) )
	if( uMsg==WM_CLOSE || uMsg==WM_DESTROY )
		{
		PostQuitMessage(0);
        return( 0 );
		}

	// Reaction to command keys
    if( uMsg==WM_KEYDOWN )
    {
		switch (wParam)
		{
#if 0
		case VK_ESCAPE:
			PostQuitMessage(0);
			return 0;
#endif

		case VK_LEFT:
		case VK_RIGHT:
		case VK_UP:
		case VK_DOWN:
		case VK_PRIOR:
		case VK_NEXT:
		case VK_END:
		case VK_HOME:
			editor.moveCursor(wParam);
			break;

		case VK_RETURN:
		case VK_DELETE:
		case VK_BACK:
			editor.controlCharacter(wParam);
			break;

		case 'k':
		case 'K':
			if (GetAsyncKeyState(VK_CONTROL) < 0)
			{
				editor.deleteLine();
			}
			break;

		case 'z':
		case 'Z':
			if (GetAsyncKeyState(VK_CONTROL) < 0)
			{
				editor.undo();
				char errorText[MAX_ERROR_LENGTH];
				char *shaderText;
				shaderText = editor.getText();
				if (shaderManager.updateShader(usedShader[usedIndex], shaderText, errorText))
				{
					editor.setErrorText(errorText);
				}
				else editor.unshowError();
				editor.showText();
			}
			break;

		case 'y':
		case 'Y':
			if (GetAsyncKeyState(VK_CONTROL) < 0)
			{
				editor.redo();
				char errorText[MAX_ERROR_LENGTH];
				char *shaderText;
				shaderText = editor.getText();
				if (shaderManager.updateShader(usedShader[usedIndex], shaderText, errorText))
				{
					editor.setErrorText(errorText);
				}
				else editor.unshowError();
				editor.showText();
			}
			break;

		case 'm':
		case 'M':
			if (GetAsyncKeyState(VK_CONTROL) < 0)
			{
				// TODO: Minimization again.
				SetWindowLong(hWnd, GWL_STYLE, WS_POPUP|WS_VISIBLE);
				ShowWindow(hWnd, SW_MAXIMIZE);
				GetClientRect(hWnd, &windowRect);
				glViewport(0, 0, windowRect.right-windowRect.left, abs(windowRect.bottom - windowRect.top)); //NEW
				aspectRatio = (float)(windowRect.right-windowRect.left) / (float)(abs(windowRect.bottom - windowRect.top));
				ShowCursor(false);
			}
			break;

		case 's':
		case 'S':
			// We want a new shader
			if (GetAsyncKeyState(VK_CONTROL) < 0)
			{
				char errorText[MAX_ERROR_LENGTH];
				char *shaderText;
				shaderText = editor.getText();
				if (shaderManager.updateShader(usedShader[usedIndex], shaderText, errorText))
				{
					//MessageBox(wininfo.hWnd, errorText, "Shader change", MB_OK);
					editor.setErrorText(errorText);
				}
				else
				{
					// It worked, so save the shader
					shaderManager.saveProgress(usedShader[usedIndex], errorText, &editor);
					editor.unshowError();
					editor.unshowText();
				}

                // Save sprites to file
                textureManager.CreatePicture("TODO.tga");
            }
			break;

		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
			if (GetAsyncKeyState(VK_CONTROL) < 0)
			{
				// I use the ordering of keys to be able to get to the shader...
				usedIndex = wParam - '1';
				if (usedIndex >= NUM_USED_PROGRAMS) usedIndex = NUM_USED_PROGRAMS - 1;

				char errorText[MAX_ERROR_LENGTH+1];
				char filename[SM_MAX_FILENAME_LENGTH+1];
				sprintf_s(filename, SM_MAX_FILENAME_LENGTH, "shaders/%s", usedShader[usedIndex]);
				if (editor.loadText(filename, errorText))
				{
					MessageBox(wininfo.hWnd, errorText, "Editor init", MB_OK);
					return -1;
				}
			}
			break;

		default:
			break;
		}
    }

	// Text entering
	if (uMsg==WM_CHAR && GetAsyncKeyState(VK_CONTROL) >= 0)
	{
		editor.putCharacter(wParam);
	}

    return( DefWindowProc(hWnd,uMsg,wParam,lParam) );
}