home *** CD-ROM | disk | FTP | other *** search
- // Cat3View.cpp : implementation of the CCatDBView class
- //
- // This is a part of the Microsoft Foundation Classes and
- // Templates (MFC&T).
- // Copyright (C) 1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // MFC&T Reference and related electronic documentation provided
- // with the library. See these sources for detailed information
- // regarding the MFC&T product.
- //
-
- #include "stdafx.h"
- #include "CatDB.h"
-
- #include "CatDBDoc.h"
- #include "CatDBVw.h"
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CCatDBView
-
- IMPLEMENT_DYNCREATE(CCatDBView, CListView)
-
- BEGIN_MESSAGE_MAP(CCatDBView, CListView)
- //{{AFX_MSG_MAP(CCatDBView)
- ON_UPDATE_COMMAND_UI(ID_VIEW_COLUMNINFO, OnUpdateViewColumnlevel)
- ON_UPDATE_COMMAND_UI(ID_VIEW_TABLES, OnUpdateViewTablelevel)
- ON_COMMAND(ID_VIEW_COLUMNINFO, OnViewColumnlevel)
- ON_COMMAND(ID_VIEW_TABLES, OnViewTablelevel)
- ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CCatDBView construction/destruction
-
- CCatDBView::CCatDBView()
- {
- }
-
- CCatDBView::~CCatDBView()
- {
- }
-
- BOOL CCatDBView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // set list view control to report, single selection
- cs.style &= ~(LVS_LIST | LVS_ICON | LVS_SMALLICON);
- cs.style |= LVS_REPORT;
- cs.style |= LVS_SINGLESEL;
-
- return CListView::PreCreateWindow(cs);
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CCatDBView drawing
-
- void CCatDBView::OnDraw(CDC* pDC)
- {
- CCatDBDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- // TODO: add draw code for native data here
- }
-
- void CCatDBView::OnInitialUpdate()
- {
- CListView::OnInitialUpdate();
-
- // TODO: You may populate your ListView with items by directly accessing
- // its list control through a call to GetListCtrl().
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CCatDBView diagnostics
-
- #ifdef _DEBUG
- void CCatDBView::AssertValid() const
- {
- CListView::AssertValid();
- }
-
- void CCatDBView::Dump(CDumpContext& dc) const
- {
- CListView::Dump(dc);
- }
-
- CCatDBDoc* CCatDBView::GetDocument() // non-debug version is inline
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCatDBDoc)));
- return (CCatDBDoc*)m_pDocument;
- }
- #endif //_DEBUG
-
- /////////////////////////////////////////////////////////////////////////////
- // CCatDBView message handlers
-
- void CCatDBView::OnUpdateViewColumnlevel(CCmdUI* pCmdUI)
- {
- CCatDBDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- if (pDoc->m_nLevel == CCatDBDoc::levelTable &&
- GetListCtrl().GetSelectedCount())
- {
- pCmdUI->Enable();
- }
- else
- pCmdUI->Enable(FALSE);
- }
-
- void CCatDBView::OnUpdateViewTablelevel(CCmdUI* pCmdUI)
- {
- CCatDBDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- if (pDoc->m_nLevel == CCatDBDoc::levelColumn)
- pCmdUI->Enable();
- else
- pCmdUI->Enable(FALSE);
- }
-
- BOOL CCatDBView::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult)
- {
- CCatDBDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- // handle double click if at table view level
- if (pDoc->m_nLevel == CCatDBDoc::levelTable)
- {
- if (message == WM_NOTIFY &&
- ((NMHDR*)lParam)->code == NM_DBLCLK)
- {
- OnViewColumnlevel();
- return 0;
- }
- }
-
- return CListView::OnChildNotify(message, wParam, lParam, pLResult);
- }
-
- void CCatDBView::OnViewColumnlevel()
- {
- CCatDBDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- // determine list control selection
- CListCtrl& control = GetListCtrl();
- int nCount = control.GetItemCount();
- for (int i = 0; i < nCount; i++)
- {
- if (control.GetItemState(i,LVIS_SELECTED))
- break;
- }
- if (i < nCount)
- {
- // pull table name to send to document
- pDoc->m_strTableName = control.GetItemText(i,0);
-
- #ifndef _UNICODE
- LPCSTR lpszName;
- lpszName = pDoc->m_strTableName;
- #else
- LPSTR lpszName;
- char rgchTableName[257];
- lpszName = rgchTableName;
- int nSize;
- nSize = ::WideCharToMultiByte(CP_ACP,0,pDoc->m_strTableName,
- -1, lpszName, 257, NULL, NULL);
- // Notify on failure
- ASSERT(nSize);
- #endif // _UNICODE
-
- pDoc->FetchColumnInfo(lpszName);
- pDoc->SetLevel(CCatDBDoc::levelColumn);
- }
- }
-
- void CCatDBView::OnViewTablelevel()
- {
- CCatDBDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- pDoc->m_strTableName.Empty();
- pDoc->FetchTableInfo();
- pDoc->SetLevel(CCatDBDoc::levelTable);
- }
-
- void CCatDBView::OnFileOpen()
- {
- CCatDBDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- if (pDoc->OnOpenDocument())
- pDoc->SetLevel(CCatDBDoc::levelTable);
- else
- pDoc->SetLevel(CCatDBDoc::levelNone);
- }
-
- void CCatDBView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
- {
- USES_CONVERSION;
- CCatDBDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- // delete all items and columns
- CListCtrl& control = GetListCtrl();
- control.DeleteAllItems();
- while (control.DeleteColumn(0));
-
- // set up view based on the document's level
- switch (pDoc->m_nLevel)
- {
- case CCatDBDoc::levelNone:
-
- // set the document title
- pDoc->SetTitle(pDoc->GetDSN());
- break;
-
- case CCatDBDoc::levelTable:
- {
- // set the document title
- CString strDataSource = pDoc->GetDSN();
- strDataSource += _T(" [Tables]");
- pDoc->SetTitle(strDataSource);
-
- // add columns to display
- control.InsertColumn(0,_T("Name"),LVCFMT_LEFT,100,-1);
- control.InsertColumn(1,_T("Type"),LVCFMT_LEFT,100,1);
- control.InsertColumn(2,_T("Catalog"),LVCFMT_LEFT,100,2);
- control.InsertColumn(3,_T("Schema"),LVCFMT_LEFT,100,3);
- control.InsertColumn(4,_T("Description"),LVCFMT_LEFT,100,4);
-
- // traverse the table recordset
- // displaying the table information
- int item = 0;
- while (pDoc->m_pTableset->MoveNext() == S_OK)
- {
- control.InsertItem(item,
- pDoc->m_pTableset->m_szName);
- control.SetItem(item,1,LVIF_TEXT,
- pDoc->m_pTableset->m_szType,0,0,0,0);
- control.SetItem(item,2,LVIF_TEXT,
- pDoc->m_pTableset->m_szCatalog,0,0,0,0);
- control.SetItem(item,3,LVIF_TEXT,
- pDoc->m_pTableset->m_szSchema,0,0,0,0);
- control.SetItem(item,4,LVIF_TEXT,
- pDoc->m_pTableset->m_szDescription,0,0,0,0);
- item++;
- }
-
- break;
- }
-
- case CCatDBDoc::levelColumn:
- {
- int column;
-
- // set the document title
- CString strDataSource = pDoc->GetDSN();
- strDataSource += _T(" - ");
- strDataSource += pDoc->m_strTableName;
- strDataSource += _T(" [Column Info]");
- pDoc->SetTitle(strDataSource);
-
- // add columns to display
- // respect the column info settings values
- column = 0;
- control.InsertColumn(column++,_T("Name"),LVCFMT_LEFT,100,-1);
- control.InsertColumn(column,_T("Type"),LVCFMT_LEFT,100,column++);
- if (pDoc->m_bLength)
- control.InsertColumn(column,_T("Length"),LVCFMT_LEFT,80,column++);
- if (pDoc->m_bPrecision)
- {
- control.InsertColumn(column,_T("Precision"),LVCFMT_LEFT,80,column++);
- control.InsertColumn(column,_T("Scale"),LVCFMT_LEFT,50,column++);
- }
- if (pDoc->m_bNullability)
- control.InsertColumn(column,_T("Nullable"),LVCFMT_LEFT,50,column++);
-
- // traverse the column info recordset
- // respect the column info settings values
- int item = 0;
-
- // If the column rowset couldn't be opened, don't attempt to fetch
- // any data.
- if (pDoc->m_pColumnset == NULL)
- break;
-
- while (pDoc->m_pColumnset->MoveNext() == S_OK)
- {
- CString strValue;
-
- // always insert the column name
- control.InsertItem(item, pDoc->m_pColumnset->m_szColumnName);
-
- // always insert the column type
- column = 1;
- CString strType;
- strType.Format("%d", pDoc->m_pColumnset->m_nDataType);
- control.SetItem(item,column++,LVIF_TEXT, strType,0,0,0,0);
-
- // only show type if requested
- if (pDoc->m_bLength)
- {
- strValue.Format(_T("%ld"),pDoc->m_pColumnset->m_nMaxLength);
- control.SetItem(item,column++,LVIF_TEXT,strValue,0,0,0,0);
- }
-
- // only show precision,scale,radix if requested
- if (pDoc->m_bPrecision)
- {
- // precision
- strValue.Format(_T("%d"),pDoc->m_pColumnset->m_nNumericPrecision);
- control.SetItem(item,column++,LVIF_TEXT,strValue,0,0,0,0);
-
- // scale
- int nOrdinal = pDoc->m_pColumnset->m_nOrdinalPosition;
- strValue.Format(_T("%d"),pDoc->m_pColumnset->m_nNumericScale);
- control.SetItem(item,column++,LVIF_TEXT,strValue,0,0,0,0);
- }
-
- // only show nullability if requested
- if (pDoc->m_bNullability)
- {
- if (pDoc->m_pColumnset->m_bIsNullable == FALSE)
- control.SetItem(item,column++,LVIF_TEXT,_T("No"),0,0,0,0);
- else
- control.SetItem(item,column++,LVIF_TEXT,_T("Yes"),0,0,0,0);
- }
-
- item++;
- }
- break;
- }
- }
- }
-