summaryrefslogtreecommitdiffstats
path: root/chrome_frame
diff options
context:
space:
mode:
authorrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-24 21:48:13 +0000
committerrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-24 21:48:13 +0000
commit6a22bc6ce59ed72fadb21b3d447a07c9e25d9c62 (patch)
tree549b3f4760faeda8dce6b797bd46009df85157e5 /chrome_frame
parenta64b213edc764e95cd6aa4bd6b3af2c6bd112573 (diff)
downloadchromium_src-6a22bc6ce59ed72fadb21b3d447a07c9e25d9c62.zip
chromium_src-6a22bc6ce59ed72fadb21b3d447a07c9e25d9c62.tar.gz
chromium_src-6a22bc6ce59ed72fadb21b3d447a07c9e25d9c62.tar.bz2
Make the dismiss button on the CF infobar be an image button.
Uses WTL's CBitmapButton class, but applies a bug fix and a workaround to get CBitmapButton to both correctly erase the background and resize correctly when hosted in a dialog managed by CDialogResize. Also uses a correctly formatted BMP to store the button state list, if editing that BMP in the future, make sure that the EXACT RGBA format and bitness are preserved or things will break. Lastly, fxies a layout issue with the "more info" link vanishing during resizing. BUG=263809 TEST=NONE Review URL: https://chromiumcodereview.appspot.com/18769007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@213521 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame')
-rw-r--r--chrome_frame/resource.h2
-rw-r--r--chrome_frame/resources/chrome_frame_resources.grd5
-rw-r--r--chrome_frame/turndown_prompt/turndown_prompt_window.cc83
-rw-r--r--chrome_frame/turndown_prompt/turndown_prompt_window.h9
4 files changed, 95 insertions, 4 deletions
diff --git a/chrome_frame/resource.h b/chrome_frame/resource.h
index 53f51a5..8b4d686 100644
--- a/chrome_frame/resource.h
+++ b/chrome_frame/resource.h
@@ -8,7 +8,7 @@
// Used by resources/tlb_resource.rc
// Default values for new objects
-//
+//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 204
diff --git a/chrome_frame/resources/chrome_frame_resources.grd b/chrome_frame/resources/chrome_frame_resources.grd
index e9e1bc4..8bc5584 100644
--- a/chrome_frame/resources/chrome_frame_resources.grd
+++ b/chrome_frame/resources/chrome_frame_resources.grd
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
+<!--
Copyright (c) 2010 The Chromium Authors. All rights reserved. Use of this
source code is governed by a BSD-style license that can be found in the LICENSE
file.
-->
<!--
-Embeded strings, branding resource, etc. See chrome_frame_strings.grd
+Embeded strings, branding resource, etc. See chrome_frame_strings.grd
for localizable strings
-->
@@ -39,6 +39,7 @@ for localizable strings
<if expr="not pp_ifdef('_google_chrome')">
<include name="IDI_CHROME_FRAME_ICON" file="../../chrome/app/theme/chromium/chromium.ico" type="ICON" />
</if>
+ <include name="IDB_TURNDOWN_PROMPT_CLOSE_BUTTON" file="../../chrome/app/theme/default_100_percent/common/cf_close_strip.bmp" type="BITMAP" />
</includes>
</release>
</grit>
diff --git a/chrome_frame/turndown_prompt/turndown_prompt_window.cc b/chrome_frame/turndown_prompt/turndown_prompt_window.cc
index 851f1c0..17321e0 100644
--- a/chrome_frame/turndown_prompt/turndown_prompt_window.cc
+++ b/chrome_frame/turndown_prompt/turndown_prompt_window.cc
@@ -13,6 +13,7 @@
#include "chrome_frame/simple_resource_loader.h"
#include "chrome_frame/utils.h"
#include "grit/chrome_frame_dialogs.h"
+#include "grit/chrome_frame_resources.h"
#include "grit/chromium_strings.h"
// atlctrlx.h requires 'min' and 'max' macros, the definition of which conflicts
@@ -22,6 +23,35 @@
#include <minmax.h> // NOLINT
#include <atlctrlx.h> // NOLINT
+namespace {
+const uint32 kBitmapImageSize = 18;
+} // namespace
+
+// WTL's CBitmapButton's drawing code is horribly broken when using transparent
+// images (specifically, it doesn't clear the background between redraws).
+// Fix it here.
+class CFBitmapButton: public CBitmapButtonImpl<CFBitmapButton>
+{
+ public:
+ DECLARE_WND_SUPERCLASS(_T("WTL_BitmapButton"), GetWndClassName())
+
+ CFBitmapButton()
+ : CBitmapButtonImpl<CFBitmapButton>(BMPBTN_AUTOSIZE | BMPBTN_HOVER,
+ NULL) {}
+
+ // "Overridden" from CBitmapButtonImpl via template hackery. See
+ // CBitmapButtonImpl::OnPaint() in atlctrlx.h for details.
+ void DoPaint(CDCHandle dc) {
+ RECT rc = {0};
+ GetClientRect(&rc);
+ dc.FillRect(&rc, reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1));
+
+ // Call original implementation.
+ CBitmapButtonImpl<CFBitmapButton>::DoPaint(dc);
+ }
+};
+
+// static
base::WeakPtr<TurndownPromptWindow> TurndownPromptWindow::CreateInstance(
InfobarContent::Frame* frame,
UrlLauncher* url_launcher,
@@ -48,6 +78,8 @@ base::WeakPtr<TurndownPromptWindow> TurndownPromptWindow::CreateInstance(
instance->link_->SetHyperLinkExtendedStyle(HLINK_NOTIFYBUTTON,
HLINK_NOTIFYBUTTON);
+ SetupBitmapButton(instance.get());
+
// Substitute the proper text given the current IE version.
CWindow text = instance->GetDlgItem(IDC_TD_PROMPT_MESSAGE);
string16 prompt_text(GetPromptText());
@@ -69,11 +101,62 @@ TurndownPromptWindow::TurndownPromptWindow(
TurndownPromptWindow::~TurndownPromptWindow() {}
+// static
+void TurndownPromptWindow::SetupBitmapButton(TurndownPromptWindow* instance) {
+ DCHECK(instance);
+ CWindow close_window = instance->GetDlgItem(IDDISMISS);
+ instance->close_button_.reset(new CFBitmapButton());
+
+ // Set the resource instance to the current dll which contains the bitmap.
+ HINSTANCE old_res_module = _AtlBaseModule.GetResourceInstance();
+ HINSTANCE this_module = _AtlBaseModule.GetModuleInstance();
+ _AtlBaseModule.SetResourceInstance(this_module);
+
+ HBITMAP close_bitmap = static_cast<HBITMAP>(
+ LoadImage(this_module, MAKEINTRESOURCE(IDB_TURNDOWN_PROMPT_CLOSE_BUTTON),
+ IMAGE_BITMAP, 0, 0, 0));
+
+ // Restore the module's resource instance.
+ _AtlBaseModule.SetResourceInstance(old_res_module);
+
+ // Create the image list with the appropriate size and colour mask.
+ instance->close_button_->m_ImageList.Create(kBitmapImageSize,
+ kBitmapImageSize,
+ ILC_COLOR8 | ILC_MASK, 4, 0);
+ instance->close_button_->m_ImageList.Add(close_bitmap, RGB(255, 0, 255));
+ instance->close_button_->m_ImageList.SetBkColor(CLR_NONE);
+
+ // Free up the original bitmap.
+ DeleteObject(close_bitmap);
+
+ // Configure the button states and initialize the button.
+ instance->close_button_->SetImages(0, 1, 2, 3);
+ instance->close_button_->SubclassWindow(close_window);
+
+ // The CDialogResize() implementation incorrectly captures the size
+ // of the bitmap image button. Reset it here to ensure that resizing works
+ // as desired.
+
+ // Find the resize data. The parameters here must match the resize map in
+ // turndown_prompt_window.h.
+ _AtlDlgResizeData resize_params = { IDDISMISS, DLSZ_CENTER_Y | DLSZ_MOVE_X };
+ int resize_index = instance->m_arrData.Find(resize_params);
+ DCHECK(resize_index > -1 && resize_index < instance->m_arrData.GetSize());
+
+ // Fiddle CDialogResize's internal data to fix up the size for the image
+ // control.
+ _AtlDlgResizeData& resize_data = instance->m_arrData[resize_index];
+ resize_data.m_rect.right = resize_data.m_rect.left + kBitmapImageSize;
+ resize_data.m_rect.top = 0;
+ resize_data.m_rect.bottom = kBitmapImageSize;
+}
+
void TurndownPromptWindow::OnFinalMessage(HWND) {
delete this;
}
void TurndownPromptWindow::OnDestroy() {
+ close_button_->m_ImageList.Destroy();
frame_ = NULL;
}
diff --git a/chrome_frame/turndown_prompt/turndown_prompt_window.h b/chrome_frame/turndown_prompt/turndown_prompt_window.h
index 626fca6..342e38a 100644
--- a/chrome_frame/turndown_prompt/turndown_prompt_window.h
+++ b/chrome_frame/turndown_prompt/turndown_prompt_window.h
@@ -28,8 +28,11 @@ class UrlLauncher;
namespace WTL {
class CHyperLink;
+class CBitmapButton;
} // namespace WTL
+class CFBitmapButton;
+
// Implements a dialog with text and buttons notifying the user that Chrome
// Frame is being turned down, offering them a link to learn more about moving
// to a modern browser.
@@ -68,8 +71,8 @@ class TurndownPromptWindow
BEGIN_DLGRESIZE_MAP(InfobarWindow)
DLGRESIZE_CONTROL(IDDISMISS, DLSZ_CENTER_Y | DLSZ_MOVE_X)
DLGRESIZE_CONTROL(IDUNINSTALL, DLSZ_CENTER_Y | DLSZ_MOVE_X)
- DLGRESIZE_CONTROL(IDC_TD_PROMPT_MESSAGE, DLSZ_SIZE_Y | DLSZ_SIZE_X)
DLGRESIZE_CONTROL(IDC_TD_PROMPT_LINK, DLSZ_CENTER_Y | DLSZ_MOVE_X)
+ DLGRESIZE_CONTROL(IDC_TD_PROMPT_MESSAGE, DLSZ_SIZE_Y | DLSZ_SIZE_X)
END_DLGRESIZE_MAP()
virtual void OnFinalMessage(HWND);
@@ -83,6 +86,9 @@ class TurndownPromptWindow
// The TurndownPromptWindow manages its own destruction.
virtual ~TurndownPromptWindow();
+ // Performs the necessary configuration to initialize a bitmap button.
+ static void SetupBitmapButton(TurndownPromptWindow* window);
+
// Event handlers.
void OnDestroy();
BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam);
@@ -101,6 +107,7 @@ class TurndownPromptWindow
InfobarContent::Frame* frame_; // Not owned by this instance
scoped_ptr<WTL::CHyperLink> link_;
+ scoped_ptr<CFBitmapButton> close_button_;
scoped_ptr<UrlLauncher> url_launcher_;
base::Closure uninstall_closure_;