summaryrefslogtreecommitdiffstats
path: root/ui/gfx/native_theme_win.cc
diff options
context:
space:
mode:
authorrogerta@chromium.org <rogerta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-27 20:56:50 +0000
committerrogerta@chromium.org <rogerta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-27 20:56:50 +0000
commitcf7d03ddffba3982b2e724291650a48912a3532e (patch)
treee45f93115dec1d09d0ce0e34c729d50e00c36a69 /ui/gfx/native_theme_win.cc
parent77fd0ef209269683ccaed9ff80330df3f55ec267 (diff)
downloadchromium_src-cf7d03ddffba3982b2e724291650a48912a3532e.zip
chromium_src-cf7d03ddffba3982b2e724291650a48912a3532e.tar.gz
chromium_src-cf7d03ddffba3982b2e724291650a48912a3532e.tar.bz2
Fix checkbox in windows uninstaller.
BUG=84791 TEST=Test the checkbox in the uninstaller as mentioned in the bug, but also all checkboxes in chrome too. Review URL: http://codereview.chromium.org/7196002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90640 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/gfx/native_theme_win.cc')
-rw-r--r--ui/gfx/native_theme_win.cc68
1 files changed, 60 insertions, 8 deletions
diff --git a/ui/gfx/native_theme_win.cc b/ui/gfx/native_theme_win.cc
index b0f8a47..29e1faf 100644
--- a/ui/gfx/native_theme_win.cc
+++ b/ui/gfx/native_theme_win.cc
@@ -126,7 +126,26 @@ gfx::Size NativeThemeWin::GetPartSize(Part part,
NULL, TS_TRUE, &size);
ReleaseDC(NULL, hdc);
- return SUCCEEDED(hr) ? Size(size.cx, size.cy) : Size();
+ if (FAILED(hr)) {
+ // TODO(rogerta): For now, we need to support radio buttons and checkboxes
+ // when theming is not enabled. Support for other parts can be added
+ // if/when needed.
+ switch (part) {
+ case kCheckbox:
+ case kRadio:
+ // TODO(rogerta): I was not able to find any API to get the default
+ // size of these controls, so determined these values empirically.
+ size.cx = 13;
+ size.cy = 13;
+ break;
+ default:
+ size.cx = 0;
+ size.cy = 0;
+ break;
+ }
+ }
+
+ return Size(size.cx, size.cy);
}
void NativeThemeWin::PaintToNonPlatformCanvas(SkCanvas* canvas,
@@ -497,8 +516,7 @@ HRESULT NativeThemeWin::PaintPushButton(HDC hdc,
}
RECT rect_win = rect.ToRECT();
- return PaintButton(hdc, BP_PUSHBUTTON, state_id, extra.classic_state,
- &rect_win);
+ return PaintButton(hdc, state, extra, BP_PUSHBUTTON, state_id, &rect_win);
}
HRESULT NativeThemeWin::PaintRadioButton(HDC hdc,
@@ -526,8 +544,7 @@ HRESULT NativeThemeWin::PaintRadioButton(HDC hdc,
}
RECT rect_win = rect.ToRECT();
- return PaintButton(hdc, BP_RADIOBUTTON, state_id, extra.classic_state,
- &rect_win);
+ return PaintButton(hdc, state, extra, BP_RADIOBUTTON, state_id, &rect_win);
}
HRESULT NativeThemeWin::PaintCheckbox(HDC hdc,
@@ -563,19 +580,54 @@ HRESULT NativeThemeWin::PaintCheckbox(HDC hdc,
}
RECT rect_win = rect.ToRECT();
- return PaintButton(hdc, BP_CHECKBOX, state_id, extra.classic_state,
- &rect_win);
+ return PaintButton(hdc, state, extra, BP_CHECKBOX, state_id, &rect_win);
}
HRESULT NativeThemeWin::PaintButton(HDC hdc,
+ State state,
+ const ButtonExtraParams& extra,
int part_id,
int state_id,
- int classic_state,
RECT* rect) const {
HANDLE handle = GetThemeHandle(BUTTON);
if (handle && draw_theme_)
return draw_theme_(handle, hdc, part_id, state_id, rect, NULL);
+ // Adjust classic_state based on part, state, and extras.
+ int classic_state = extra.classic_state;
+ switch(part_id) {
+ case BP_CHECKBOX:
+ classic_state |= DFCS_BUTTONCHECK;
+ break;
+ case BP_RADIOBUTTON:
+ classic_state |= DFCS_BUTTONRADIO;
+ break;
+ case BP_PUSHBUTTON:
+ classic_state |= DFCS_BUTTONPUSH;
+ break;
+ default:
+ NOTREACHED() << "Unknown part_id: " << part_id;
+ break;
+ }
+
+ switch(state) {
+ case kDisabled:
+ classic_state |= DFCS_INACTIVE;
+ break;
+ case kPressed:
+ classic_state |= DFCS_PUSHED;
+ break;
+ case kNormal:
+ case kHovered:
+ break;
+ default:
+ NOTREACHED() << "Unknown state: " << state;
+ break;
+ }
+
+ if (extra.checked)
+ classic_state |= DFCS_CHECKED;
+
// Draw it manually.
// All pressed states have both low bits set, and no other states do.
const bool focused = ((state_id & ETS_FOCUSED) == ETS_FOCUSED);