Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/engine/UpdateInstallDialog.cpp

Issue 11304082: Download updates automatically, ask to install from a modeless dialog (Closed)
Patch Set: Created July 31, 2013, 7:16 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 #include <sstream>
2 #include <string>
3 #include <Windows.h>
4
5 #include "../shared/Dictionary.h"
6 #include "../shared/Utils.h"
7 #include "UpdateInstallDialog.h"
8
9 namespace
10 {
11 LRESULT CALLBACK ProcessWindowMessage(HWND window, UINT message,
12 WPARAM wParam, LPARAM lParam)
13 {
14 switch (message)
15 {
16 case WM_CLOSE:
17 PostQuitMessage(0);
18 return 0;
19 case WM_COMMAND:
20 switch (LOWORD(wParam))
21 {
22 case IDYES:
23 PostQuitMessage(1);
24 return 0;
25 case IDNO:
26 PostQuitMessage(0);
27 return 0;
28 }
29 break;
30 }
31 return DefWindowProc(window, message, wParam, lParam);
32 }
33 }
34
35 UpdateInstallDialog::UpdateInstallDialog()
36 {
37 const std::wstring windowClassName = L"UPDATE_INSTALL_DIALOG";
38 WNDCLASSEX windowClass = {};
Wladimir Palant 2013/08/01 09:58:24 We should use WNDCLASSEXW explicitly.
39 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.
40 windowClass.lpfnWndProc = ProcessWindowMessage;
41 windowClass.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_MENU + 1);
42 windowClass.lpszClassName = windowClassName.c_str();
Oleksandr 2013/08/01 07:05:12 Maybe use hIcon here with ABP logo? A default wind
43 if (!RegisterClassEx(&windowClass))
44 {
45 std::stringstream stream;
46 stream << "Failed to register window class "
47 << ToUtf8String(windowClassName) << ": " << GetLastError();
48 throw std::runtime_error(stream.str());
49 }
50
51 Dictionary* dictionary = Dictionary::GetInstance();
52 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
53
54 RECT workArea;
55 SystemParametersInfo(SPI_GETWORKAREA, 0, &workArea, 0);
56
57 const int width = 300;
58 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.
59 const int margin = 10;
60
61 window = CreateWindowExW(WS_EX_TOOLWINDOW | WS_EX_TOPMOST,
62 windowClassName.c_str(), title.c_str(), WS_SYSMENU,
63 workArea.right - width - margin,
64 workArea.bottom - height - margin,
65 width, height, 0, 0, 0, 0);
Oleksandr 2013/08/01 07:05:12 Should we do something like: SetForegroundWindow(
66 CreateText();
67 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
68 }
69
70 UpdateInstallDialog::~UpdateInstallDialog()
71 {
72 DestroyWindow(window);
73 }
74
75 bool UpdateInstallDialog::Show()
76 {
77 ShowWindow(window, SW_SHOW);
78 MSG message;
79 while(GetMessage(&message, 0, 0, 0) > 0)
80 {
81 TranslateMessage(&message);
82 DispatchMessage(&message);
83 }
84 ShowWindow(window, SW_HIDE);
85 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
86 }
87
88 void UpdateInstallDialog::CreateText()
89 {
90 Dictionary* dictionary = Dictionary::GetInstance();
91 std::wstring text = dictionary->Lookup("updater", "install-question-text");
92
93 RECT clientRect;
94 GetClientRect(window, &clientRect);
95
96 const int margin = 10;
97 const int width = clientRect.right - margin * 2;
98 const int height = 60;
99
100 CreateWindowW(L"STATIC", text.c_str(), WS_CHILD | WS_VISIBLE| SS_LEFT,
101 margin, margin, width, height, window, 0, 0, 0);
102 }
103
104 void UpdateInstallDialog::CreateButtons()
105 {
106 Dictionary* dictionary = Dictionary::GetInstance();
107 const std::wstring yesLabel = dictionary->Lookup("general", "button-yes");
108 const std::wstring noLabel = dictionary->Lookup("general", "button-no");
109
110 const DWORD buttonFlags = WS_CHILD | WS_VISIBLE;
111
112 RECT clientRect;
113 GetClientRect(window, &clientRect);
114
115 const int buttonWidth = 100;
116 const int buttonHeight = 30;
Felix Dahlke 2013/08/02 10:48:01 Done.
117 const int margin = 10;
118 const int combinedWidth = buttonWidth * 2 + margin;
119 const int yesButtonX = clientRect.right - combinedWidth - margin;
120 const int noButtonX = yesButtonX + buttonWidth + margin;
121 const int buttonY = clientRect.bottom - buttonHeight - margin;
122
123 CreateWindowW(L"BUTTON", yesLabel.c_str(), buttonFlags,
124 yesButtonX, buttonY, buttonWidth, buttonHeight,
125 window, reinterpret_cast<HMENU>(IDYES), 0, 0);
126 CreateWindowW(L"BUTTON", noLabel.c_str(), buttonFlags,
127 noButtonX, buttonY, buttonWidth, buttonHeight,
128 window, reinterpret_cast<HMENU>(IDNO), 0, 0);
129 }
OLDNEW

Powered by Google App Engine
This is Rietveld