Files
BeneficialCode-WinArk/WinArk/ColumnManager.cpp
T

120 lines
3.2 KiB
C++

#include "stdafx.h"
#include "ColumnManager.h"
#include <atlctrls.h>
#include "ListCtrlHelper.h"
ColumnManager::~ColumnManager() = default;
bool ColumnManager::CopyTo(ColumnManager & other) const {
if (other.GetCount() != GetCount())
return false;
int i = 0;
for (const auto& column : m_Columns) {
other.SetColumn(i, column);
i++;
}
return true;
}
void ColumnManager::AddFromControl(HWND hWnd) {
CHeaderCtrl header(hWnd == nullptr ? m_ListView.GetHeader() : CListViewCtrl(hWnd).GetHeader());
ATLASSERT(header);
auto count = header.GetItemCount();
HDITEM item;
WCHAR text[64];
item.pszText = text;
item.cchTextMax = _countof(text);
item.mask = HDI_FORMAT | HDI_WIDTH | HDI_TEXT;
for (int i = 0; i < count; i++) {
ATLVERIFY(header.GetItem(i, &item));
ColumnInfo info;
info.DefaultWidth = item.cxy;
info.Flags = (info.DefaultWidth <= 1 && ((item.fmt & HDF_FIXEDWIDTH) > 0) ? ColumnFlags::Visible :
ColumnFlags::None);
info.Name = item.pszText;
m_Columns.push_back(info);
}
}
void ColumnManager::SetVisible(int column, bool visible) {
m_Columns[column].SetVisible(visible);
}
bool ColumnManager::IsVisible(int column) const {
ATLASSERT(column >= 0 && column < GetCount());
return (m_Columns[column].Flags & ColumnFlags::Modified) == ColumnFlags::Modified;
}
bool ColumnManager::IsModified(int column) const {
return (GetColumn(column).Flags & ColumnFlags::Modified) == ColumnFlags::Modified;
}
void ColumnManager::SetModified(int column, bool modified) {
auto& col = m_Columns[column];
if (modified)
col.Flags |= ColumnFlags::Modified;
else
col.Flags &= ~ColumnFlags::Modified;
}
bool ColumnManager::IsConst(int column) const {
return (m_Columns[column].Flags & ColumnFlags::Const) == ColumnFlags::Const;
}
void ColumnManager::Clear() {
m_Columns.clear();
if (m_ListView)
while (m_ListView.DeleteColumn(0))
;
}
void ColumnManager::UpdateColumns() {
auto header = m_ListView.GetHeader();
HDITEM hdi;
hdi.mask = HDI_LPARAM;
for (int i = 0; i < GetCount(); i++) {
if (IsModified(i)) {
if (IsVisible(i)) {
auto& info = GetColumn(i);
// make visible - add column
int c = m_ListView.InsertColumn(header.GetItemCount(), info.Name, info.Format,
info.DefaultWidth);
hdi.lParam = i;
header.SetItem(c, &hdi);
}
else {
int c = ListCtrlHelper::FindColumn(header, i);
ATLASSERT(c >= 0);
m_ListView.DeleteColumn(c);
}
SetModified(i, false);
}
}
}
const ColumnManager::ColumnInfo& ColumnManager::GetColumn(int index) const {
return m_Columns[index];
}
const std::vector<int>& ColumnManager::GetColumnByCategory(PCWSTR category) const {
return m_ColumnsByCategory.at(category);
}
const std::vector<CString>& ColumnManager::GetCategories() const {
return m_Categories;
}
void ColumnManager::SetColumn(int i, const ColumnInfo& info) {
ATLASSERT(i >= 0 && i < GetCount());
if ((info.Flags & ColumnFlags::Visible) != (m_Columns[i].Flags & ColumnFlags::Visible)) {
SetVisible(i, (info.Flags & ColumnFlags::Visible) == ColumnFlags::Visible);
}
}
int ColumnManager::GetRealColumn(int index) const {
HDITEM hdi;
hdi.mask = HDI_LPARAM;
m_ListView.GetHeader().GetItem(index, &hdi);
return static_cast<int>(hdi.lParam);
}