| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "views/controls/table/native_table_win.h" | 5 #include "views/controls/table/native_table_win.h" |
| 6 | 6 |
| 7 #include <commctrl.h> | 7 #include <commctrl.h> |
| 8 #include <windowsx.h> | 8 #include <windowsx.h> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 | 385 |
| 386 if (table_->model()) | 386 if (table_->model()) |
| 387 UpdateListViewCache(0, table_->model()->RowCount(), true); | 387 UpdateListViewCache(0, table_->model()->RowCount(), true); |
| 388 | 388 |
| 389 if (table_->type() == ICON_AND_TEXT) { | 389 if (table_->type() == ICON_AND_TEXT) { |
| 390 HIMAGELIST image_list = | 390 HIMAGELIST image_list = |
| 391 ImageList_Create(kImageSize, kImageSize, ILC_COLOR32, 2, 2); | 391 ImageList_Create(kImageSize, kImageSize, ILC_COLOR32, 2, 2); |
| 392 // We create 2 phony images because we are going to switch images at every | 392 // We create 2 phony images because we are going to switch images at every |
| 393 // refresh in order to force a refresh of the icon area (somehow the clip | 393 // refresh in order to force a refresh of the icon area (somehow the clip |
| 394 // rect does not include the icon). | 394 // rect does not include the icon). |
| 395 gfx::CanvasSkia canvas(kImageSize, kImageSize, false); | 395 gfx::CanvasSkia canvas; |
| 396 canvas.Init(kImageSize, kImageSize, false); |
| 396 // Make the background completely transparent. | 397 // Make the background completely transparent. |
| 397 canvas.drawColor(SK_ColorBLACK, SkXfermode::kClear_Mode); | 398 canvas.skia_canvas()->drawColor(SK_ColorBLACK, SkXfermode::kClear_Mode); |
| 398 HICON empty_icon = | 399 HICON empty_icon = |
| 399 IconUtil::CreateHICONFromSkBitmap(canvas.ExtractBitmap()); | 400 IconUtil::CreateHICONFromSkBitmap(canvas.ExtractBitmap()); |
| 400 ImageList_AddIcon(image_list, empty_icon); | 401 ImageList_AddIcon(image_list, empty_icon); |
| 401 ImageList_AddIcon(image_list, empty_icon); | 402 ImageList_AddIcon(image_list, empty_icon); |
| 402 DeleteObject(empty_icon); | 403 DeleteObject(empty_icon); |
| 403 ListView_SetImageList(native_view(), image_list, LVSIL_SMALL); | 404 ListView_SetImageList(native_view(), image_list, LVSIL_SMALL); |
| 404 } | 405 } |
| 405 | 406 |
| 406 if (!table_->resizable_columns()) { | 407 if (!table_->resizable_columns()) { |
| 407 // To disable the resizing of columns we'll filter the events happening on | 408 // To disable the resizing of columns we'll filter the events happening on |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 RECT icon_rect, client_rect; | 505 RECT icon_rect, client_rect; |
| 505 if (ListView_GetItemRect(native_view(), view_index, &icon_rect, | 506 if (ListView_GetItemRect(native_view(), view_index, &icon_rect, |
| 506 LVIR_ICON) && | 507 LVIR_ICON) && |
| 507 GetClientRect(native_view(), &client_rect)) { | 508 GetClientRect(native_view(), &client_rect)) { |
| 508 RECT intersection; | 509 RECT intersection; |
| 509 // Client rect includes the header but we need to make sure we don't | 510 // Client rect includes the header but we need to make sure we don't |
| 510 // paint into it. | 511 // paint into it. |
| 511 client_rect.top += content_offset_; | 512 client_rect.top += content_offset_; |
| 512 // Make sure the region need to paint is visible. | 513 // Make sure the region need to paint is visible. |
| 513 if (IntersectRect(&intersection, &icon_rect, &client_rect)) { | 514 if (IntersectRect(&intersection, &icon_rect, &client_rect)) { |
| 514 gfx::CanvasSkia canvas(icon_rect.right - icon_rect.left, | 515 gfx::CanvasSkia canvas; |
| 515 icon_rect.bottom - icon_rect.top, false); | 516 canvas.Init(icon_rect.right - icon_rect.left, |
| 517 icon_rect.bottom - icon_rect.top, |
| 518 false); |
| 516 | 519 |
| 517 // It seems the state in nmcd.uItemState is not correct. | 520 // It seems the state in nmcd.uItemState is not correct. |
| 518 // We'll retrieve it explicitly. | 521 // We'll retrieve it explicitly. |
| 519 int selected = ListView_GetItemState( | 522 int selected = ListView_GetItemState( |
| 520 native_view(), view_index, LVIS_SELECTED | LVIS_DROPHILITED); | 523 native_view(), view_index, LVIS_SELECTED | LVIS_DROPHILITED); |
| 521 bool drop_highlight = ((selected & LVIS_DROPHILITED) != 0); | 524 bool drop_highlight = ((selected & LVIS_DROPHILITED) != 0); |
| 522 int bg_color_index; | 525 int bg_color_index; |
| 523 if (!IsEnabled()) | 526 if (!IsEnabled()) |
| 524 bg_color_index = COLOR_3DFACE; | 527 bg_color_index = COLOR_3DFACE; |
| 525 else if (drop_highlight) | 528 else if (drop_highlight) |
| 526 bg_color_index = COLOR_HIGHLIGHT; | 529 bg_color_index = COLOR_HIGHLIGHT; |
| 527 else if (selected) | 530 else if (selected) |
| 528 bg_color_index = HasFocus() ? COLOR_HIGHLIGHT : COLOR_3DFACE; | 531 bg_color_index = HasFocus() ? COLOR_HIGHLIGHT : COLOR_3DFACE; |
| 529 else | 532 else |
| 530 bg_color_index = COLOR_WINDOW; | 533 bg_color_index = COLOR_WINDOW; |
| 531 // NOTE: This may be invoked without the ListView filling in the | 534 // NOTE: This may be invoked without the ListView filling in the |
| 532 // background (or rather windows paints background, then invokes | 535 // background (or rather windows paints background, then invokes |
| 533 // this twice). As such, we always fill in the background. | 536 // this twice). As such, we always fill in the background. |
| 534 canvas.drawColor( | 537 canvas.skia_canvas()->drawColor( |
| 535 skia::COLORREFToSkColor(GetSysColor(bg_color_index)), | 538 skia::COLORREFToSkColor(GetSysColor(bg_color_index)), |
| 536 SkXfermode::kSrc_Mode); | 539 SkXfermode::kSrc_Mode); |
| 537 // + 1 for padding (we declared the image as 18x18 in the list- | 540 // + 1 for padding (we declared the image as 18x18 in the list- |
| 538 // view when they are 16x16 so we get an extra pixel of padding). | 541 // view when they are 16x16 so we get an extra pixel of padding). |
| 539 canvas.DrawBitmapInt(image, 0, 0, | 542 canvas.DrawBitmapInt(image, 0, 0, |
| 540 image.width(), image.height(), | 543 image.width(), image.height(), |
| 541 1, 1, kFaviconSize, kFaviconSize, true); | 544 1, 1, kFaviconSize, kFaviconSize, true); |
| 542 | 545 |
| 543 // Only paint the visible region of the icon. | 546 // Only paint the visible region of the icon. |
| 544 RECT to_draw = { intersection.left - icon_rect.left, | 547 RECT to_draw = { intersection.left - icon_rect.left, |
| 545 intersection.top - icon_rect.top, | 548 intersection.top - icon_rect.top, |
| 546 0, 0 }; | 549 0, 0 }; |
| 547 to_draw.right = to_draw.left + | 550 to_draw.right = to_draw.left + |
| 548 (intersection.right - intersection.left); | 551 (intersection.right - intersection.left); |
| 549 to_draw.bottom = to_draw.top + | 552 to_draw.bottom = to_draw.top + |
| 550 (intersection.bottom - intersection.top); | 553 (intersection.bottom - intersection.top); |
| 551 canvas.getTopPlatformDevice().drawToHDC(draw_info->nmcd.hdc, | 554 canvas.BlitToNativeContext( |
| 552 intersection.left, | 555 gfx::Rect(to_draw), |
| 553 intersection.top, | 556 gfx::Point(intersection.left, intersection.top), |
| 554 &to_draw); | 557 draw_info->nmcd.hdc); |
| 555 r = CDRF_SKIPDEFAULT; | 558 r = CDRF_SKIPDEFAULT; |
| 556 } | 559 } |
| 557 } | 560 } |
| 558 } | 561 } |
| 559 } | 562 } |
| 560 return r; | 563 return r; |
| 561 } | 564 } |
| 562 default: | 565 default: |
| 563 return CDRF_DODEFAULT; | 566 return CDRF_DODEFAULT; |
| 564 } | 567 } |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 903 | 906 |
| 904 //////////////////////////////////////////////////////////////////////////////// | 907 //////////////////////////////////////////////////////////////////////////////// |
| 905 // NativeButtonWrapper, public: | 908 // NativeButtonWrapper, public: |
| 906 | 909 |
| 907 // static | 910 // static |
| 908 NativeTableWrapper* NativeTableWrapper::CreateNativeWrapper(TableView2* table) { | 911 NativeTableWrapper* NativeTableWrapper::CreateNativeWrapper(TableView2* table) { |
| 909 return new NativeTableWin(table); | 912 return new NativeTableWin(table); |
| 910 } | 913 } |
| 911 | 914 |
| 912 } // namespace views | 915 } // namespace views |
| OLD | NEW |