📄 beereaderview.cpp
字号:
// BeeReaderView.cpp : implementation of the CBeeReaderView class
//
#include "stdafx.h"
#include "BeeReader.h"
#include "MainFrm.h"
#include "BeeReaderDoc.h"
#include "BeeReaderView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBeeReaderView
IMPLEMENT_DYNCREATE(CBeeReaderView, CListViewEx)
BEGIN_MESSAGE_MAP(CBeeReaderView, CListViewEx)
//{{AFX_MSG_MAP(CBeeReaderView)
ON_WM_CREATE()
ON_NOTIFY_REFLECT(NM_CLICK,OnClick)
ON_WM_TIMER()
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDbClick)
ON_WM_RBUTTONDOWN()
ON_COMMAND(IDM_LIST_BROWSE, OnListBrowse)
ON_COMMAND(IDM_LIST_VIEW, OnListView)
ON_COMMAND(IDM_LIST_FLAGREAD, OnListFlagread)
ON_COMMAND(IDM_LIST_FLAGRED, OnListFlagred)
ON_COMMAND_RANGE(IDM_LIST_FLAGS_01,IDM_LIST_FLAGS_04,OnMarkAllItem)
ON_COMMAND_RANGE(IDM_LIST_DELETE_01,IDM_LIST_DELETE_06,OnRemoveItem)
ON_COMMAND_RANGE(IDM_LIST_FILTER_01,IDM_LIST_FILTER_10,OnFilterItem)
ON_COMMAND_RANGE(IDM_LIST_SORTS_01,IDM_LIST_SORTS_04,OnSortItem)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CListViewEx::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CListViewEx::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CListViewEx::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBeeReaderView construction/destruction
CBeeReaderView::CBeeReaderView()
{
// TODO: add construction code here
m_nSortedCol = 1;
m_bAscending = false;
m_iFilter = 0;
m_uTimer = NULL;
m_TrackItem = NULL;
m_htTrack = -1;
nIndex = -1;
}
CBeeReaderView::~CBeeReaderView()
{
}
BOOL CBeeReaderView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CListViewEx::PreCreateWindow(cs))
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CBeeReaderView drawing
void CBeeReaderView::OnDraw(CDC* pDC)
{
CBeeReaderDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CBeeReaderView::OnInitialUpdate()
{
CListViewEx::OnInitialUpdate();
// TODO: You may populate your ListView with items by directly accessing
// its list control through a call to GetListCtrl().
GetListCtrl().SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT );
InsertColumn(0, _T("标 题"), LVCFMT_LEFT, 400 );
InsertColumn(1,_T("取回时间"),LVCFMT_CENTER,150);
InsertColumn(2,_T("出版时间"),LVCFMT_CENTER,150);
InsertColumn(3,_T("作 者"),LVCFMT_CENTER,100);
}
/////////////////////////////////////////////////////////////////////////////
// CBeeReaderView printing
BOOL CBeeReaderView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CBeeReaderView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CBeeReaderView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CBeeReaderView diagnostics
#ifdef _DEBUG
void CBeeReaderView::AssertValid() const
{
CListViewEx::AssertValid();
}
void CBeeReaderView::Dump(CDumpContext& dc) const
{
CListViewEx::Dump(dc);
}
CBeeReaderDoc* CBeeReaderView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBeeReaderDoc)));
return (CBeeReaderDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CBeeReaderView message handlers
int CBeeReaderView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListViewEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
// Create the image list used by the tree control.
SetWindowLong( GetListCtrl().m_hWnd, GWL_STYLE, WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_SHOWSELALWAYS | LVS_REPORT|LVS_OWNERDRAWFIXED );
if ( !m_imageList.Create( 16, 15, ILC_COLOR24 | ILC_MASK, 1, 1 ) )
{
TRACE0("Failed to create image list.\n");
return -1;
}
// load the tree images bitmap and add it to the image list.
m_bitmap.LoadBitmap( IDB_LIST_VIEW );
m_imageList.Add( &m_bitmap, RGB( 0xff,0x00,0xff ) );
GetListCtrl().SetImageList( &m_imageList, LVSIL_SMALL );
EnableSortIcon ();
ColorSortColumn();
m_coolMenu.HookWindow(m_hWnd);
return 0;
}
void CBeeReaderView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CListViewEx::OnColumnclick(pNMHDR,pResult);
*pResult = 0;
}
BOOL CBeeReaderView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
HD_NOTIFY *pHDNotify = (HD_NOTIFY*)lParam;
switch( pHDNotify->hdr.code )
{
case HDN_ITEMCLICKA:
case HDN_ITEMCLICKW:
{
// left mouse button.
if (pHDNotify->iButton == 0)
{
if (pHDNotify->iItem == m_nSortedCol) {
m_bAscending = !m_bAscending;
}
else {
m_bAscending = true;
}
}
// right mouse button.
else if (pHDNotify->iButton == 1) {
m_bAscending = m_flatHeader.GetAscending();
}
else {
break;
}
// set sort image for header.
m_nSortedCol = pHDNotify->iItem;
// TODO: Add your sorting code here.
CXTSortClass csc (&GetListCtrl(), m_nSortedCol);
csc.Sort (m_bAscending ? true : false, DT_STRING);
}
}
return CListViewEx::OnNotify(wParam, lParam, pResult);
}
void CBeeReaderView::OnDbClick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
ASSERT(pMainWnd);
POSITION pos = GetListCtrl().GetFirstSelectedItemPosition();
CRSSItem* pItem;
int nIndex;
if ( pos != NULL )
{
nIndex = GetListCtrl().GetNextSelectedItem(pos);
pItem = (CRSSItem*)GetItemData(nIndex);
ASSERT(pItem);
if( m_TrackItem != pItem && m_uTimer != NULL )
KillTimer(2);
if( !pItem->GetReadStatus() )
{
m_TrackItem = pItem;
m_htTrack = nIndex;
m_uTimer = SetTimer(2,3000,0);
}
pMainWnd->GetHtmlFrame()->Browse( pItem );
}
*pResult = 0;
}
void CBeeReaderView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if( nIDEvent == 2 )
{
CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
ASSERT(pMainWnd);
if( !m_TrackItem->GetReadStatus() )
{
m_TrackItem->SetReadStatus(TRUE);
SetBoldItem( m_htTrack,FALSE);
if( pMainWnd->GetWorkingChannel() )
{
pMainWnd->GetWorkingChannel()->SetSaveTag(TRUE);
pMainWnd->GetNewsTree()->SendMessage(WM_UPDATE_ITEMCOUNT,0,(LPARAM)m_TrackItem->GetParentChannel());
}
else //搜索中立即保存修改。
{
CRSSChannel* pParent = m_TrackItem->GetParentChannel();
pParent->SetSaveTag(TRUE);
pMainWnd->GetRSSManager()->GetWriter()->Save( pParent,pParent->GetCacheGUID() );
pMainWnd->GetNewsTree()->SendMessage(WM_UPDATE_ITEMCOUNT,0,(LPARAM)pParent);
}
LV_ITEM lvitem;
lvitem.mask=LVIF_IMAGE;
lvitem.iItem=m_htTrack;
lvitem.iSubItem=0;
lvitem.iImage= 2;
GetListCtrl().SetItem(&lvitem);
GetListCtrl().RedrawItems(m_htTrack,m_htTrack);
}
m_TrackItem = NULL;
KillTimer(2);
m_uTimer = NULL;
}
CListViewEx::OnTimer(nIDEvent);
}
BOOL CBeeReaderView::FilterItem(CRSSItem* pItem)
{
if( !pItem ) return FALSE;
CTime today = CTime::GetCurrentTime();
CTime take = pItem->GetRetakeDate()->GetDateTime();
CTimeSpan span = today - take;
switch( m_iFilter )
{
case 0: return TRUE; //所有取回的项。
case 1: //今天取回的项。
{
if( span.GetDays() == 0 ) return TRUE;
else return FALSE;
}
case 2: //昨天取回的项。
{
if( span.GetDays() == 1 ) return TRUE;
else return FALSE;
}
case 3: //前三天取回的项。
{
if( span.GetDays() < 3 ) return TRUE;
else return FALSE;
}
case 4: //星期内取回的项。
{
if( span.GetDays() < 7 ) return TRUE;
else return FALSE;
}
case 5: //月内取回的项。
{
if( today.GetYear()==take.GetYear() && today.GetMonth()==take.GetMonth() )
return TRUE;
else return FALSE;
}
case 6: //所有已读的项。
{
return pItem->GetReadStatus();
}
case 7: //所有未读的项。
{
return !pItem->GetReadStatus();
}
case 8: //所有重要的项.
{
return pItem->GetRedFlag();
}
case 9: //所有非重要的项。
{
return !pItem->GetRedFlag();
}
default:break;
}
return FALSE;
}
void CBeeReaderView::DisplayItem(CRSSChannel *pChannel)
{
GetListCtrl().LockWindowUpdate();
GetListCtrl().DeleteAllItems();
if( !pChannel )
{
GetListCtrl().UnlockWindowUpdate();
return;
}
CRSSItem* pItem = pChannel->GetItem(TRUE);
int iIndex = 0;
GetListCtrl().LockWindowUpdate();
GetListCtrl().DeleteAllItems();
LV_ITEM lvitem;
while( pItem )
{
if( FilterItem(pItem) )
{
lvitem.mask=LVIF_IMAGE|LVIF_TEXT;
lvitem.iItem=iIndex;
lvitem.iSubItem=0;
lvitem.pszText = (LPTSTR)(LPCTSTR)pItem->GetTitle();
if( !pItem->GetReadStatus() )
lvitem.iImage= 1;
else
lvitem.iImage= 2;
CListViewEx::InsertItem(&lvitem);
GetListCtrl().SetItemText(iIndex,1,pItem->GetRetakeDate()->GetTimeString() );
if( pItem->GetPubDate() )
GetListCtrl().SetItemText(iIndex,2,pItem->GetPubDate()->GetTimeString() );
else
GetListCtrl().SetItemText(iIndex,2,"");
GetListCtrl().SetItemText(iIndex,3,pItem->GetAuthor() );
if( pItem->GetReadStatus() )
SetBoldItem( iIndex,FALSE);
if( pItem->GetRedFlag() )
SetRedFlagItem(iIndex,TRUE);
SetItemData( iIndex,(DWORD)pItem );
iIndex++;
}
pItem = pChannel->GetItem(FALSE);
}
CXTSortClass csc (&GetListCtrl(), m_nSortedCol);
csc.Sort (m_bAscending ? true : false, DT_STRING);
GetListCtrl().UnlockWindowUpdate();
}
int CBeeReaderView::InsertItem( const LVITEM* pItem )
{
int iRet;
GetListCtrl().LockWindowUpdate();
iRet = CListViewEx::InsertItem(pItem);
CXTSortClass csc (&GetListCtrl(), m_nSortedCol);
csc.Sort (m_bAscending ? true : false, DT_STRING);
GetListCtrl().UnlockWindowUpdate();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -