⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 beereaderview.cpp

📁 beereader source code
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -