windows-nt/Source/XPSP1/NT/ds/adsi/oledsvw/adsqview.cpp
2020-09-26 16:20:57 +08:00

399 lines
9.8 KiB
C++

// 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);
}