Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: chrome_frame/turndown_prompt/turndown_prompt_window.cc

Issue 18769007: Make the dismiss button on the CF infobar be an image button. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Greg feedback, fix link layout problem. Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome_frame/turndown_prompt/turndown_prompt_window.h" 5 #include "chrome_frame/turndown_prompt/turndown_prompt_window.h"
6 6
7 #include <atlctrls.h> 7 #include <atlctrls.h>
8 #include <commctrl.h> 8 #include <commctrl.h>
9 #include <shellapi.h> 9 #include <shellapi.h>
10 10
11 #include "base/compiler_specific.h" 11 #include "base/compiler_specific.h"
12 #include "chrome_frame/ready_mode/internal/url_launcher.h" 12 #include "chrome_frame/ready_mode/internal/url_launcher.h"
13 #include "chrome_frame/simple_resource_loader.h" 13 #include "chrome_frame/simple_resource_loader.h"
14 #include "chrome_frame/utils.h" 14 #include "chrome_frame/utils.h"
15 #include "grit/chrome_frame_dialogs.h" 15 #include "grit/chrome_frame_dialogs.h"
16 #include "grit/chrome_frame_resources.h"
16 #include "grit/chromium_strings.h" 17 #include "grit/chromium_strings.h"
17 18
18 // atlctrlx.h requires 'min' and 'max' macros, the definition of which conflicts 19 // atlctrlx.h requires 'min' and 'max' macros, the definition of which conflicts
19 // with STL headers. Hence we include them out of the order defined by style 20 // with STL headers. Hence we include them out of the order defined by style
20 // guidelines. As a result you may not refer to std::min or std::max in this 21 // guidelines. As a result you may not refer to std::min or std::max in this
21 // file. 22 // file.
22 #include <minmax.h> // NOLINT 23 #include <minmax.h> // NOLINT
23 #include <atlctrlx.h> // NOLINT 24 #include <atlctrlx.h> // NOLINT
24 25
26 namespace {
27 const uint32 kBitmapImageSize = 18;
28 } // namespace
29
30 // WTL's CBitmapButton's drawing code is horribly broken when using transparent
31 // images (specifically, it doesn't clear the background between redraws).
32 // Fix it here.
33 class CFBitmapButton: public CBitmapButtonImpl<CFBitmapButton>
34 {
35 public:
36 DECLARE_WND_SUPERCLASS(_T("WTL_BitmapButton"), GetWndClassName())
37
38 CFBitmapButton()
39 : CBitmapButtonImpl<CFBitmapButton>(BMPBTN_AUTOSIZE | BMPBTN_HOVER,
40 NULL) {}
41
42 // "Overridden" from CBitmapButtonImpl via template hackery. See
43 // CBitmapButtonImpl::OnPaint() in atlctrlx.h for details.
44 void DoPaint(CDCHandle dc) {
45 RECT rc;
46 GetClientRect(&rc);
47 dc.FillRect(&rc, reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1));
48
49 // Call original implementation.
50 CBitmapButtonImpl<CFBitmapButton>::DoPaint(dc);
51 }
52 };
53
54 // static
25 base::WeakPtr<TurndownPromptWindow> TurndownPromptWindow::CreateInstance( 55 base::WeakPtr<TurndownPromptWindow> TurndownPromptWindow::CreateInstance(
26 InfobarContent::Frame* frame, 56 InfobarContent::Frame* frame,
27 UrlLauncher* url_launcher, 57 UrlLauncher* url_launcher,
28 const base::Closure& uninstall_callback) { 58 const base::Closure& uninstall_callback) {
29 DCHECK(frame != NULL); 59 DCHECK(frame != NULL);
30 DCHECK(url_launcher != NULL); 60 DCHECK(url_launcher != NULL);
31 61
32 base::WeakPtr<TurndownPromptWindow> instance( 62 base::WeakPtr<TurndownPromptWindow> instance(
33 (new TurndownPromptWindow(frame, url_launcher, uninstall_callback)) 63 (new TurndownPromptWindow(frame, url_launcher, uninstall_callback))
34 ->weak_ptr_factory_.GetWeakPtr()); 64 ->weak_ptr_factory_.GetWeakPtr());
35 65
36 DCHECK(!instance->IsWindow()); 66 DCHECK(!instance->IsWindow());
37 67
38 if (instance->Create(frame->GetFrameWindow()) == NULL) { 68 if (instance->Create(frame->GetFrameWindow()) == NULL) {
39 DPLOG(ERROR) << "Failed to create HWND for TurndownPromptWindow."; 69 DPLOG(ERROR) << "Failed to create HWND for TurndownPromptWindow.";
40 return base::WeakPtr<TurndownPromptWindow>(); 70 return base::WeakPtr<TurndownPromptWindow>();
41 } 71 }
42 72
43 // Subclass the "Learn more." text to make it behave like a link. Clicks are 73 // Subclass the "Learn more." text to make it behave like a link. Clicks are
44 // routed to OnLearnMore(). 74 // routed to OnLearnMore().
45 CWindow rte = instance->GetDlgItem(IDC_TD_PROMPT_LINK); 75 CWindow rte = instance->GetDlgItem(IDC_TD_PROMPT_LINK);
46 instance->link_.reset(new CHyperLink()); 76 instance->link_.reset(new CHyperLink());
47 instance->link_->SubclassWindow(rte); 77 instance->link_->SubclassWindow(rte);
48 instance->link_->SetHyperLinkExtendedStyle(HLINK_NOTIFYBUTTON, 78 instance->link_->SetHyperLinkExtendedStyle(HLINK_NOTIFYBUTTON,
49 HLINK_NOTIFYBUTTON); 79 HLINK_NOTIFYBUTTON);
50 80
81 SetupBitmapButton(instance.get());
82
51 // Substitute the proper text given the current IE version. 83 // Substitute the proper text given the current IE version.
52 CWindow text = instance->GetDlgItem(IDC_TD_PROMPT_MESSAGE); 84 CWindow text = instance->GetDlgItem(IDC_TD_PROMPT_MESSAGE);
53 string16 prompt_text(GetPromptText()); 85 string16 prompt_text(GetPromptText());
54 if (!prompt_text.empty()) 86 if (!prompt_text.empty())
55 text.SetWindowText(prompt_text.c_str()); 87 text.SetWindowText(prompt_text.c_str());
56 88
57 return instance; 89 return instance;
58 } 90 }
59 91
92 // static
93 void TurndownPromptWindow::SetupBitmapButton(TurndownPromptWindow* instance) {
grt (UTC plus 2) 2013/07/23 01:38:33 oops. i forgot to mention in my previous review th
robertshield 2013/07/23 03:09:57 Done.
94 DCHECK(instance);
95 CWindow close_window = instance->GetDlgItem(IDDISMISS);
96 instance->close_button_.reset(new CFBitmapButton());
97
98 // Set the resource instance to the current dll which contains the bitmap.
99 HINSTANCE old_res_module = _AtlBaseModule.GetResourceInstance();
100 HINSTANCE this_module = _AtlBaseModule.GetModuleInstance();
101 _AtlBaseModule.SetResourceInstance(this_module);
102
103 HBITMAP close_bitmap = static_cast<HBITMAP>(
104 LoadImage(this_module, MAKEINTRESOURCE(IDB_TURNDOWN_PROMPT_CLOSE_BUTTON),
105 IMAGE_BITMAP, 0, 0, 0));
106
107 // Restore the module's resource instance.
108 _AtlBaseModule.SetResourceInstance(old_res_module);
109
110 // Create the image list with the appropriate size and colour mask.
111 instance->close_button_->m_ImageList.Create(kBitmapImageSize,
112 kBitmapImageSize,
113 ILC_COLOR8 | ILC_MASK, 4, 0);
114 instance->close_button_->m_ImageList.Add(close_bitmap, RGB(255, 0, 255));
115 instance->close_button_->m_ImageList.SetBkColor(CLR_NONE);
116
117 // Configure the button states and initialize the button.
118 instance->close_button_->SetImages(0, 1, 2, 3);
119 instance->close_button_->SubclassWindow(close_window);
120
121 // The CDialogResize() implementation incorrectly captures the size
122 // of the bitmap image button. Reset it here to ensure that resizing works
123 // as desired.
124
125 // Find the resize data. The parameters here must match the resize map in
126 // turndown_prompt_window.h.
127 _AtlDlgResizeData resize_params = { IDDISMISS, DLSZ_CENTER_Y | DLSZ_MOVE_X };
128 int resize_index = instance->m_arrData.Find(resize_params);
129 DCHECK(resize_index > -1 && resize_index < instance->m_arrData.GetSize());
130
131 // Fiddle CDialogResize's internal data to fix up the size for the image
132 // control.
133 _AtlDlgResizeData& resize_data = instance->m_arrData[resize_index];
134 resize_data.m_rect.right = resize_data.m_rect.left + kBitmapImageSize;
135 resize_data.m_rect.top = 0;
136 resize_data.m_rect.bottom = kBitmapImageSize;
137 }
138
60 TurndownPromptWindow::TurndownPromptWindow( 139 TurndownPromptWindow::TurndownPromptWindow(
61 InfobarContent::Frame* frame, 140 InfobarContent::Frame* frame,
62 UrlLauncher* url_launcher, 141 UrlLauncher* url_launcher,
63 const base::Closure& uninstall_closure) 142 const base::Closure& uninstall_closure)
64 : frame_(frame), 143 : frame_(frame),
65 url_launcher_(url_launcher), 144 url_launcher_(url_launcher),
66 uninstall_closure_(uninstall_closure), 145 uninstall_closure_(uninstall_closure),
67 weak_ptr_factory_(this) { 146 weak_ptr_factory_(this) {
68 } 147 }
69 148
70 TurndownPromptWindow::~TurndownPromptWindow() {} 149 TurndownPromptWindow::~TurndownPromptWindow() {}
71 150
72 void TurndownPromptWindow::OnFinalMessage(HWND) { 151 void TurndownPromptWindow::OnFinalMessage(HWND) {
73 delete this; 152 delete this;
74 } 153 }
75 154
76 void TurndownPromptWindow::OnDestroy() { 155 void TurndownPromptWindow::OnDestroy() {
156 close_button_->m_ImageList.Destroy();
77 frame_ = NULL; 157 frame_ = NULL;
78 } 158 }
79 159
80 BOOL TurndownPromptWindow::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) { 160 BOOL TurndownPromptWindow::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) {
81 DlgResize_Init(false); // false => 'no gripper' 161 DlgResize_Init(false); // false => 'no gripper'
82 return TRUE; 162 return TRUE;
83 } 163 }
84 164
85 LRESULT TurndownPromptWindow::OnLearnMore(WORD /*wParam*/, 165 LRESULT TurndownPromptWindow::OnLearnMore(WORD /*wParam*/,
86 LPNMHDR /*lParam*/, 166 LPNMHDR /*lParam*/,
(...skipping 22 matching lines...) Expand all
109 } 189 }
110 190
111 // static 191 // static
112 string16 TurndownPromptWindow::GetPromptText() { 192 string16 TurndownPromptWindow::GetPromptText() {
113 IEVersion ie_version = GetIEVersion(); 193 IEVersion ie_version = GetIEVersion();
114 int message_id = IDS_CHROME_FRAME_TURNDOWN_TEXT_IE_NEWER; 194 int message_id = IDS_CHROME_FRAME_TURNDOWN_TEXT_IE_NEWER;
115 if (ie_version == IE_6 || ie_version == IE_7 || ie_version == IE_8) 195 if (ie_version == IE_6 || ie_version == IE_7 || ie_version == IE_8)
116 message_id = IDS_CHROME_FRAME_TURNDOWN_TEXT_IE_OLDER; 196 message_id = IDS_CHROME_FRAME_TURNDOWN_TEXT_IE_OLDER;
117 return SimpleResourceLoader::GetInstance()->Get(message_id); 197 return SimpleResourceLoader::GetInstance()->Get(message_id);
118 } 198 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698