// adsqryView.cpp : implementation of the CAdsqryView class // #include "stdafx.h" #include "viewex.h" #include "adsqDoc.h" #include "adsqView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAdsqryView IMPLEMENT_DYNCREATE(CAdsqryView, CListView ) BEGIN_MESSAGE_MAP(CAdsqryView, CListView ) //{{AFX_MSG_MAP(CAdsqryView) ON_WM_VSCROLL() //}}AFX_MSG_MAP // Standard printing commands END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAdsqryView construction/destruction extern CViewExApp NEAR theApp; extern TCHAR szOpen[ MAX_PATH ]; /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ CAdsqryView::CAdsqryView() { // TODO: add construction code here m_nLastInsertedRow = -1; m_nColumnsCount = 0; } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ CAdsqryView::~CAdsqryView() { } /*********************************************************** Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BOOL CAdsqryView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style |= LVS_REPORT; return CListView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CAdsqryView diagnostics #ifdef _DEBUG void CAdsqryView::AssertValid() const { CListView::AssertValid(); } void CAdsqryView::Dump(CDumpContext& dc) const { CListView::Dump(dc); } CAdsqryDoc* CAdsqryView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAdsqryDoc))); return (CAdsqryDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CAdsqryView message handlers /*********************************************************** Function: CAdsqryView::OnInitialUpdate Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CAdsqryView::OnInitialUpdate() { CListView ::OnInitialUpdate(); CreateColumns( ); AddRows( ); } /*********************************************************** Function: CAdsqryView::AddColumns Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CAdsqryView::AddColumns( int nRow ) { int nColumnCount, nIdx, nColumn; CString strColumn; LV_COLUMN lvColumn; CADsDataSource* pDataSource; CAdsqryDoc* pDoc; pDoc = GetDocument( ); pDataSource = pDoc->GetADsDataSource( ); nColumnCount = pDataSource->GetColumnsCount( nRow ); for( nIdx = 0; nIdx < nColumnCount ; nIdx++ ) { pDataSource->GetColumnText( nRow, nIdx, strColumn ); for( nColumn = 0; nColumn < m_nColumnsCount ; nColumn++ ) { if( m_strColumns[ nColumn ] == strColumn ) break; } if( nColumn == m_nColumnsCount ) { m_strColumns.Add( strColumn ); m_nColumnsCount++; lvColumn.iSubItem = m_nColumnsCount - 1; lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvColumn.fmt = LVCFMT_LEFT; lvColumn.pszText = strColumn.GetBuffer( 256 ); lvColumn.cx = GetListCtrl( ).GetStringWidth( _T("WWWWWWWWWW") ) + 15; GetListCtrl( ).InsertColumn( m_nColumnsCount - 1, &lvColumn ); TRACE( _T("Found new Column %s\n"), (LPCTSTR)strColumn ); } } } /*********************************************************** Function: CAdsqryView::CreateColumns Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CAdsqryView::CreateColumns( void ) { /* int nCol; LV_COLUMN lvColumn; CADsDataSource* pDataSource; CAdsqryDoc* pDoc; CString strColumn; pDoc = GetDocument( ); pDataSource = pDoc->GetADsDataSource( ); m_nColumnsCount = pDataSource->GetColumnsCount( ); for( nCol = 0 ; nCol < m_nColumnsCount ; nCol++ ) { pDataSource->GetColumnText( nCol, strColumn ); lvColumn.iSubItem = nCol; lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvColumn.fmt = LVCFMT_LEFT; lvColumn.pszText = strColumn.GetBuffer( 256 ); lvColumn.cx = GetListCtrl( ).GetStringWidth( _T("WWWWWWWWWW") ) + 15; GetListCtrl( ).InsertColumn( nCol, &lvColumn ); }*/ } /*********************************************************** Function: CAdsqryView::ClearContent Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CAdsqryView::ClearContent( void ) { GetListCtrl( ).DeleteAllItems( ); m_nLastInsertedRow = -1; } /*********************************************************** Function: CAdsqryView::AddRows Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CAdsqryView::AddRows( void ) { int nCol; int nTopIndex, nPageItems; int nRowIndex; CADsDataSource* pDataSource; CAdsqryDoc* pDoc; pDoc = GetDocument( ); pDataSource = pDoc->GetADsDataSource( ); nTopIndex = GetListCtrl( ).GetTopIndex( ); nPageItems = GetListCtrl( ).GetCountPerPage( ); if( m_nLastInsertedRow < nTopIndex + 2 * nPageItems ) { HCURSOR aCursor, oldCursor; aCursor = LoadCursor( NULL, IDC_WAIT ); oldCursor = SetCursor( aCursor ); // we must add extra items in the list view for( nRowIndex = m_nLastInsertedRow + 1 ; nRowIndex < nTopIndex + 2 * nPageItems ; nRowIndex++ ) { CString strValue; BOOL bWork = FALSE; AddColumns( nRowIndex ); for( nCol = 0; nCol < m_nColumnsCount ; nCol++ ) { CString strColumnName; strColumnName = m_strColumns.GetAt( nCol ); if( pDataSource->GetValue( nRowIndex, nCol, strValue ) || pDataSource->GetValue( nRowIndex, strColumnName, strValue ) ) { LV_ITEM lvItem; TCHAR* pszText; pszText = (TCHAR*) malloc( strValue.GetLength( ) + 10 ); if(NULL != pszText) { _tcscpy( pszText, _T("") ); if( !nCol ) { _itot( nRowIndex + 1, pszText, 10 ); _tcscat( pszText, _T(") ") ); } _tcscat( pszText, strValue.GetBuffer( strValue.GetLength( ) + 1 ) ); bWork = TRUE; memset( &lvItem, 0, sizeof(lvItem) ); lvItem.mask = LVIF_TEXT | LVIF_STATE; lvItem.state = 0; lvItem.stateMask = 0; lvItem.iItem = nRowIndex; lvItem.iSubItem = nCol; lvItem.pszText = pszText; lvItem.cchTextMax = _tcslen( pszText ); if( nCol == 0) { GetListCtrl( ).InsertItem(&lvItem); } else { GetListCtrl( ).SetItem(&lvItem); } free( pszText ); } } } if( bWork ) { m_nLastInsertedRow++; } } SetCursor( oldCursor ); } } /*********************************************************** Function: CAdsqryView::OnVScroll Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void CAdsqryView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default CListView ::OnVScroll(nSBCode, nPos, pScrollBar); //if( nSBCode == SB_LINEDOWN || nSBCode == SB_PAGEDOWN ) { AddRows( ); } } /*********************************************************** Function: CAdsqryView::OnChildNotify Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BOOL CAdsqryView::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult) { // TODO: Add your specialized code here and/or call the base class NMHDR* pHeader; int nSel; CADsDataSource* pDataSource; CAdsqryDoc* pDoc; CString strADsPath; while( TRUE ) { if( message != WM_NOTIFY ) break; pHeader = (NMHDR*)lParam; if( pHeader->code != NM_DBLCLK ) break; if( !GetListCtrl( ).GetSelectedCount( ) ) break; nSel = GetListCtrl( ).GetNextItem( -1, LVNI_SELECTED );; if( -1 == nSel ) break; pDoc = GetDocument( ); pDataSource = pDoc->GetADsDataSource( ); pDataSource->GetADsPath( nSel, strADsPath ); _tcscpy( szOpen, strADsPath.GetBuffer( MAX_PATH ) ); theApp.OpenDocumentFile( strADsPath.GetBuffer( MAX_PATH ) ); return TRUE; } return CListView::OnChildNotify(message, wParam, lParam, pLResult); }