From 36ea7e8b3e964a2def2417e4ad5a0ac7584e4e9f Mon Sep 17 00:00:00 2001 From: Don Ho Date: Tue, 29 Jun 2021 03:55:09 +0200 Subject: [PATCH] Make column headers of ASCII panel & doc switcher apply to dark mode Close #10082 --- .../WinControls/AnsiCharPanel/ListView.cpp | 32 +++++++++++++- .../AnsiCharPanel/ansiCharPanel.cpp | 34 +++++++++++++++ .../VerticalFileSwitcher.cpp | 33 +++++++++++++++ .../VerticalFileSwitcherListView.cpp | 42 +++++++++++++++---- 4 files changed, 132 insertions(+), 9 deletions(-) diff --git a/PowerEditor/src/WinControls/AnsiCharPanel/ListView.cpp b/PowerEditor/src/WinControls/AnsiCharPanel/ListView.cpp index 042170359..be54f60fa 100644 --- a/PowerEditor/src/WinControls/AnsiCharPanel/ListView.cpp +++ b/PowerEditor/src/WinControls/AnsiCharPanel/ListView.cpp @@ -66,14 +66,15 @@ void ListView::init(HINSTANCE hInst, HWND parent) if (_columnInfos.size()) { LVCOLUMN lvColumn; - lvColumn.mask = LVCF_TEXT | LVCF_WIDTH; + lvColumn.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT; + lvColumn.fmt = HDF_OWNERDRAW; short i = 0; for (auto it = _columnInfos.begin(); it != _columnInfos.end(); ++it) { lvColumn.cx = static_cast(it->_width); lvColumn.pszText = const_cast(it->_label.c_str()); - ListView_InsertColumn(_hSelf, ++i, &lvColumn); + ListView_InsertColumn(_hSelf, ++i, &lvColumn); // index is not 0 based but 1 based } } } @@ -168,6 +169,33 @@ std::vector ListView::getCheckedIndexes() const LRESULT ListView::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + switch (Message) + { + case WM_DRAWITEM: + { + DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam; + + + HDITEM hdi; + TCHAR lpBuffer[256]; + + hdi.mask = HDI_TEXT; + hdi.pszText = lpBuffer; + hdi.cchTextMax = 256; + + Header_GetItem(pdis->hwndItem, pdis->itemID, &hdi); + + COLORREF textColor = RGB(0, 0, 0); + if (NppDarkMode::isEnabled()) + textColor = NppDarkMode::getDarkerTextColor(); + + SetTextColor(pdis->hDC, textColor); + SetBkMode(pdis->hDC, TRANSPARENT); + + ::DrawText(pdis->hDC, lpBuffer, lstrlen(lpBuffer), &(pdis->rcItem), DT_SINGLELINE | DT_VCENTER | DT_CENTER); + } + return TRUE; + } return ::CallWindowProc(_defaultProc, hwnd, Message, wParam, lParam); } diff --git a/PowerEditor/src/WinControls/AnsiCharPanel/ansiCharPanel.cpp b/PowerEditor/src/WinControls/AnsiCharPanel/ansiCharPanel.cpp index fe6bd9697..7dc265f5d 100644 --- a/PowerEditor/src/WinControls/AnsiCharPanel/ansiCharPanel.cpp +++ b/PowerEditor/src/WinControls/AnsiCharPanel/ansiCharPanel.cpp @@ -119,6 +119,40 @@ INT_PTR CALLBACK AnsiCharPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM } break; + case NM_CUSTOMDRAW: + { + static bool becomeDarkMode = false; + static bool becomeLightMode = false; + HWND hHeader = ListView_GetHeader(_listView.getHSelf()); + if (NppDarkMode::isEnabled()) + { + if (!becomeDarkMode) + { + NppDarkMode::setExplorerTheme(hHeader, false); + becomeDarkMode = true; + } + becomeLightMode = false; + + auto nmtbcd = reinterpret_cast((LPNMHDR)lParam); + SetBkMode(nmtbcd->nmcd.hdc, TRANSPARENT); + FillRect(nmtbcd->nmcd.hdc, &nmtbcd->nmcd.rc, NppDarkMode::getBackgroundBrush()); + nmtbcd->clrText = RGB(255, 255, 255); + SetTextColor(nmtbcd->nmcd.hdc, RGB(255, 255, 255)); + SetWindowLongPtr(_hSelf, DWLP_MSGRESULT, CDRF_NOTIFYSUBITEMDRAW); + } + else + { + if (!becomeLightMode) + { + NppDarkMode::setExplorerTheme(hHeader, true); + becomeLightMode = true; + } + becomeDarkMode = false; + SetWindowLongPtr(_hSelf, DWLP_MSGRESULT, CDRF_DODEFAULT); + } + } + break; + default: break; } diff --git a/PowerEditor/src/WinControls/VerticalFileSwitcher/VerticalFileSwitcher.cpp b/PowerEditor/src/WinControls/VerticalFileSwitcher/VerticalFileSwitcher.cpp index bcf6babe1..14801175a 100644 --- a/PowerEditor/src/WinControls/VerticalFileSwitcher/VerticalFileSwitcher.cpp +++ b/PowerEditor/src/WinControls/VerticalFileSwitcher/VerticalFileSwitcher.cpp @@ -82,6 +82,39 @@ INT_PTR CALLBACK VerticalFileSwitcher::run_dlgProc(UINT message, WPARAM wParam, { switch (((LPNMHDR)lParam)->code) { + case NM_CUSTOMDRAW: + { + static bool becomeDarkMode = false; + static bool becomeLightMode = false; + HWND hHeader = ListView_GetHeader(_fileListView.getHSelf()); + if (NppDarkMode::isEnabled()) + { + if (!becomeDarkMode) + { + NppDarkMode::setExplorerTheme(hHeader, false); + becomeDarkMode = true; + } + becomeLightMode = false; + + auto nmtbcd = reinterpret_cast((LPNMHDR)lParam); + SetBkMode(nmtbcd->nmcd.hdc, TRANSPARENT); + FillRect(nmtbcd->nmcd.hdc, &nmtbcd->nmcd.rc, NppDarkMode::getBackgroundBrush()); + nmtbcd->clrText = RGB(255, 255, 255); + SetTextColor(nmtbcd->nmcd.hdc, RGB(255, 255, 255)); + SetWindowLongPtr(_hSelf, DWLP_MSGRESULT, CDRF_NOTIFYSUBITEMDRAW); + } + else + { + if (!becomeLightMode) + { + NppDarkMode::setExplorerTheme(hHeader, true); + becomeLightMode = true; + } + becomeDarkMode = false; + SetWindowLongPtr(_hSelf, DWLP_MSGRESULT, CDRF_DODEFAULT); + } + } + break; case NM_DBLCLK: { LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE) lParam; diff --git a/PowerEditor/src/WinControls/VerticalFileSwitcher/VerticalFileSwitcherListView.cpp b/PowerEditor/src/WinControls/VerticalFileSwitcher/VerticalFileSwitcherListView.cpp index d30c4a3ac..9d9f9226a 100644 --- a/PowerEditor/src/WinControls/VerticalFileSwitcher/VerticalFileSwitcherListView.cpp +++ b/PowerEditor/src/WinControls/VerticalFileSwitcher/VerticalFileSwitcherListView.cpp @@ -84,6 +84,32 @@ void VerticalFileSwitcherListView::destroy() LRESULT VerticalFileSwitcherListView::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + switch (Message) + { + case WM_DRAWITEM: + { + DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam; + + HDITEM hdi; + TCHAR lpBuffer[256]; + + hdi.mask = HDI_TEXT; + hdi.pszText = lpBuffer; + hdi.cchTextMax = 256; + + Header_GetItem(pdis->hwndItem, pdis->itemID, &hdi); + + COLORREF textColor = RGB(0, 0, 0); + if (NppDarkMode::isEnabled()) + textColor = NppDarkMode::getDarkerTextColor(); + + SetTextColor(pdis->hDC, textColor); + SetBkMode(pdis->hDC, TRANSPARENT); + + ::DrawText(pdis->hDC, lpBuffer, lstrlen(lpBuffer), &(pdis->rcItem), DT_SINGLELINE | DT_VCENTER | DT_LEFT); + } + return TRUE; + } return ::CallWindowProc(_defaultProc, hwnd, Message, wParam, lParam); } @@ -103,11 +129,12 @@ void VerticalFileSwitcherListView::initList() RECT rc; ::GetClientRect(_hParent, &rc); int totalWidth = rc.right - rc.left; - + const int extColWidth =80; + if (columnCount == 0) { generic_string nameStr = pNativeSpeaker->getAttrNameStr(TEXT("Name"), FS_ROOTNODE, FS_CLMNNAME); - insertColumn(nameStr.c_str(), (isExtColumn ? totalWidth - 50 : totalWidth), 0); + insertColumn(nameStr.c_str(), (isExtColumn ? totalWidth - extColWidth : totalWidth), 1); } if (isExtColumn) @@ -117,14 +144,14 @@ void VerticalFileSwitcherListView::initList() lvc.mask = LVCF_WIDTH; SendMessage(_hSelf, LVM_GETCOLUMN, 0, reinterpret_cast(&lvc)); - if (lvc.cx + 50 > totalWidth) + if (lvc.cx + extColWidth > totalWidth) { - lvc.cx = totalWidth - 50; + lvc.cx = totalWidth - extColWidth; SendMessage(_hSelf, LVM_SETCOLUMN, 0, reinterpret_cast(&lvc)); } generic_string extStr = pNativeSpeaker->getAttrNameStr(TEXT("Ext."), FS_ROOTNODE, FS_CLMNEXT); - insertColumn(extStr.c_str(), 50, 1); + insertColumn(extStr.c_str(), extColWidth, 2); } } @@ -353,10 +380,11 @@ void VerticalFileSwitcherListView::insertColumn(const TCHAR *name, int width, in { LVCOLUMN lvColumn; - lvColumn.mask = LVCF_TEXT | LVCF_WIDTH; + lvColumn.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT; lvColumn.cx = width; lvColumn.pszText = (TCHAR *)name; - ListView_InsertColumn(_hSelf, index, &lvColumn); + lvColumn.fmt = HDF_OWNERDRAW; + ListView_InsertColumn(_hSelf, index, &lvColumn); // index is not 0 based but 1 based } void VerticalFileSwitcherListView::resizeColumns(int totalWidth)