Index: src/engine/UpdateInstallDialog.cpp |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/src/engine/UpdateInstallDialog.cpp |
@@ -0,0 +1,129 @@ |
+#include <sstream> |
+#include <string> |
+#include <Windows.h> |
+ |
+#include "../shared/Dictionary.h" |
+#include "../shared/Utils.h" |
+#include "UpdateInstallDialog.h" |
+ |
+namespace |
+{ |
+ LRESULT CALLBACK ProcessWindowMessage(HWND window, UINT message, |
+ WPARAM wParam, LPARAM lParam) |
+ { |
+ switch (message) |
+ { |
+ case WM_CLOSE: |
+ PostQuitMessage(0); |
+ return 0; |
+ case WM_COMMAND: |
+ switch (LOWORD(wParam)) |
+ { |
+ case IDYES: |
+ PostQuitMessage(1); |
+ return 0; |
+ case IDNO: |
+ PostQuitMessage(0); |
+ return 0; |
+ } |
+ break; |
+ } |
+ return DefWindowProc(window, message, wParam, lParam); |
+ } |
+} |
+ |
+UpdateInstallDialog::UpdateInstallDialog() |
+{ |
+ const std::wstring windowClassName = L"UPDATE_INSTALL_DIALOG"; |
+ WNDCLASSEX windowClass = {}; |
Wladimir Palant
2013/08/01 09:58:24
We should use WNDCLASSEXW explicitly.
|
+ windowClass.cbSize = sizeof(WNDCLASSEX); |
Wladimir Palant
2013/08/01 09:58:24
sizeof(windowClass) to avoid repeating the type na
Felix Dahlke
2013/08/02 10:48:01
Done.
|
+ windowClass.lpfnWndProc = ProcessWindowMessage; |
+ windowClass.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_MENU + 1); |
+ windowClass.lpszClassName = windowClassName.c_str(); |
Oleksandr
2013/08/01 07:05:12
Maybe use hIcon here with ABP logo? A default wind
|
+ if (!RegisterClassEx(&windowClass)) |
+ { |
+ std::stringstream stream; |
+ stream << "Failed to register window class " |
+ << ToUtf8String(windowClassName) << ": " << GetLastError(); |
+ throw std::runtime_error(stream.str()); |
+ } |
+ |
+ Dictionary* dictionary = Dictionary::GetInstance(); |
+ std::wstring title = dictionary->Lookup("updater", "install-question-title"); |
Oleksandr
2013/07/31 22:16:59
This is fine only for when download is ready. How
Felix Dahlke
2013/08/01 07:21:17
Like I said earlier, I think it's better to focus
|
+ |
+ RECT workArea; |
+ SystemParametersInfo(SPI_GETWORKAREA, 0, &workArea, 0); |
+ |
+ const int width = 300; |
+ const int height = 150; |
Wladimir Palant
2013/08/01 09:58:24
Where do these numbers come from? What will happen
Felix Dahlke
2013/08/02 10:48:01
Done.
|
+ const int margin = 10; |
+ |
+ window = CreateWindowExW(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, |
+ windowClassName.c_str(), title.c_str(), WS_SYSMENU, |
+ workArea.right - width - margin, |
+ workArea.bottom - height - margin, |
+ width, height, 0, 0, 0, 0); |
Oleksandr
2013/08/01 07:05:12
Should we do something like:
SetForegroundWindow(
|
+ CreateText(); |
+ CreateButtons(); |
Oleksandr
2013/07/31 22:16:59
No CreateButtons() in the overridden constructor I
Felix Dahlke
2013/08/01 07:21:17
As I said above, let's make this more generic when
|
+} |
+ |
+UpdateInstallDialog::~UpdateInstallDialog() |
+{ |
+ DestroyWindow(window); |
+} |
+ |
+bool UpdateInstallDialog::Show() |
+{ |
+ ShowWindow(window, SW_SHOW); |
+ MSG message; |
+ while(GetMessage(&message, 0, 0, 0) > 0) |
+ { |
+ TranslateMessage(&message); |
+ DispatchMessage(&message); |
+ } |
+ ShowWindow(window, SW_HIDE); |
+ return message.wParam; |
Wladimir Palant
2013/08/01 09:58:24
Doesn't this cause a warning? I would rather cast
Felix Dahlke
2013/08/02 10:48:01
Done. Opted for message.wParam == 0 in case of yes
|
+} |
+ |
+void UpdateInstallDialog::CreateText() |
+{ |
+ Dictionary* dictionary = Dictionary::GetInstance(); |
+ std::wstring text = dictionary->Lookup("updater", "install-question-text"); |
+ |
+ RECT clientRect; |
+ GetClientRect(window, &clientRect); |
+ |
+ const int margin = 10; |
+ const int width = clientRect.right - margin * 2; |
+ const int height = 60; |
+ |
+ CreateWindowW(L"STATIC", text.c_str(), WS_CHILD | WS_VISIBLE| SS_LEFT, |
+ margin, margin, width, height, window, 0, 0, 0); |
+} |
+ |
+void UpdateInstallDialog::CreateButtons() |
+{ |
+ Dictionary* dictionary = Dictionary::GetInstance(); |
+ const std::wstring yesLabel = dictionary->Lookup("general", "button-yes"); |
+ const std::wstring noLabel = dictionary->Lookup("general", "button-no"); |
+ |
+ const DWORD buttonFlags = WS_CHILD | WS_VISIBLE; |
+ |
+ RECT clientRect; |
+ GetClientRect(window, &clientRect); |
+ |
+ const int buttonWidth = 100; |
+ const int buttonHeight = 30; |
Felix Dahlke
2013/08/02 10:48:01
Done.
|
+ const int margin = 10; |
+ const int combinedWidth = buttonWidth * 2 + margin; |
+ const int yesButtonX = clientRect.right - combinedWidth - margin; |
+ const int noButtonX = yesButtonX + buttonWidth + margin; |
+ const int buttonY = clientRect.bottom - buttonHeight - margin; |
+ |
+ CreateWindowW(L"BUTTON", yesLabel.c_str(), buttonFlags, |
+ yesButtonX, buttonY, buttonWidth, buttonHeight, |
+ window, reinterpret_cast<HMENU>(IDYES), 0, 0); |
+ CreateWindowW(L"BUTTON", noLabel.c_str(), buttonFlags, |
+ noButtonX, buttonY, buttonWidth, buttonHeight, |
+ window, reinterpret_cast<HMENU>(IDNO), 0, 0); |
+} |