📄 itemlist.cpp
字号:
//PK 2006/11/24 - 2007/02/22
//PK CItemList
#include "ItemList.h"
#include "utility.h"
#include "configurations.h"
#include <WindowsX.h>
#include "Item.h"
#include "Book.h"
void CItemList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{ //PK 2006/11/24 - 12/14
CDCHandle dc = lpDrawItemStruct->hDC;
dc.SaveDC();
CRect rect = lpDrawItemStruct->rcItem;
int id = lpDrawItemStruct->itemID;
CItem * item = get_item(id);
if (item == NULL) return ;
int priority = item->priority();
COLORREF color;
switch(priority)
{
case -1:
g_config.color(string("low_priority"), color);
break;
case 0:
g_config.color(string("mid_priority"), color);
break;
case 1:
g_config.color(string("high_priority"), color);
break;
default:
break;
}
dc.FillSolidRect(rect,color);
if(lpDrawItemStruct->itemState & ODS_SELECTED) {
dc.SelectStockBrush(DC_BRUSH);
dc.SetDCBrushColor(color);
dc.SelectStockPen(DC_PEN);
COLORREF frame_color;
g_config.color(string("select_frame"), frame_color);
dc.SetDCPenColor(frame_color);
dc.RoundRect(rect, CPoint(10,10));
}
unsigned long cr = RGB(0xff, 0, 0);
int cols = GetHeader().GetItemCount();
for (int i = 0; i < cols; ++i) {
CString text;
GetItemText(id, i, text);
CRect cell_rect;
GetCellRect(i, rect, cell_rect);
DRAWTEXTPARAMS fm;
fm.cbSize = sizeof(DRAWTEXTPARAMS);
fm.iLeftMargin = 3;
fm.iRightMargin = 3;
dc.DrawTextEx(text.LockBuffer(), -1, cell_rect, DT_NOPREFIX | DT_VCENTER | DT_LEFT | DT_END_ELLIPSIS | DT_SINGLELINE, &fm);
}
dc.RestoreDC(-1);
}
void CItemList::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{ //PK 2006/11/28 - 12/02
HDC hdc = ::GetWindowDC(m_hWnd);
SelectFont(hdc, GetFont());
TEXTMETRIC tm;
::GetTextMetrics(hdc, &tm);
lpMeasureItemStruct->itemHeight = tm.tmHeight + 2;
::ReleaseDC(m_hWnd, hdc);
}
bool CItemList::init()
{ //PK 2006/11/28 - 2007/02/13
//PK prepare the list header
int index = 0;
InsertColumn(index++, "Priority", LVCFMT_LEFT, 45);
InsertColumn(index++, "Book", LVCFMT_LEFT, 250);
InsertColumn(index++, "Name", LVCFMT_LEFT, 300);
InsertColumn(index++, "Next day", LVCFMT_LEFT, 100);
InsertColumn(index++, "Times", LVCFMT_RIGHT, 80);
t_book::iterator itr = _books.begin(), itr_end = _books.end();
for (; itr != itr_end; ++itr) {
CBook * book = *itr;
int amount = book->size();
for (int i = 0; i < amount; ++i) {
CItem * item = book->get_item(i);
add_an_item(item);
}
}
sort_list();
return true;
}
CItem * CItemList::get_item(int index)
{ //PK 2006/11/28 - 2007/02/04
return (CItem *)GetItemData(index);
}
CItem * CItemList::get_current_item()
{ //PK 2006/10/15 - 11/28
int index = GetSelectedIndex();
if (-1 == index) return NULL;
return get_item(index);
}
void CItemList::add_an_item(CItem * item, bool tail)
{ //PK 2006/10/15 - 28
int index = -1;
if (tail) index = InsertItem(GetItemCount(), "");
else index = InsertItem(0, "");
update_an_item(index, item);
}
void CItemList::update_an_item(int index, CItem * item)
{ //PK 2006/10/15 - 2007/02/13
int sub_idx = 0;
char * pri;
switch(item->priority()) {
case -1: pri = "L"; break;
case 0: pri = "N"; break;
case 1: pri = "H"; break;
default: assert(false); break;
}
SetItemText(index, sub_idx++, pri);
SetItemText(index, sub_idx++, item->book()->book_name().c_str());
SetItemText(index, sub_idx++, item->title().c_str());
if (item->access_date().is_not_a_date()) SetItemText(index, sub_idx++, "No study");
else SetItemText(index, sub_idx++, to_simple_string(item->next_day()).c_str());
SetItemText(index, sub_idx, ulong2c(item->access_times()).c_str());
SetItemData(index, (DWORD_PTR)item);
}
void CItemList::sort_list()
{
SortItems(_ListCompareFunc, (LPARAM)this);
}
int CItemList::_ListCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{ //PK 2006/10/17 - 2007/02/22
CItem * item1 = (CItem *)lParam1;
CItem * item2 = (CItem *)lParam2;
return item1->compare(item2);
}
void CItemList::update_book_name(CBook * book)
{ //PK 2007/03/07
assert(book != NULL);
int amount = GetItemCount();
for (int i = 0; i < amount; ++i) {
CItem * item = (CItem *)GetItemData(i);
if (item->book() == book) SetItemText(i, 1, book->book_name().c_str());
}
}
void CItemList::delete_book(CBook * book)
{ //PK 2007/03/07
assert(book != NULL);
t_book::iterator itr = find(_books.begin(), _books.end(), book);
if (itr == _books.end()) return;
_books.erase(itr);
for (int i = 0; i < GetItemCount();) {
CItem * item = (CItem *)GetItemData(i);
if (item->book() == book) CListViewCtrl::DeleteItem(i);
else ++i;
}
}
void CItemList::add_book(CBook * book)
{ //PK 2007/03/07
assert(book != NULL);
t_book::iterator itr = find(_books.begin(), _books.end(), book);
if (itr != _books.end()) return;
_books.push_back(book);
int amount = book->size();
for (int i = 0; i < amount; ++i) {
CItem * item = book->get_item(i);
add_an_item(item);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -