home *** CD-ROM | disk | FTP | other *** search
- // TreeView.cpp : implementation of the CDaoTreeView class
- //
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
-
- #include "stdafx.h"
- #include "DaoView.h"
- #include "dragitem.h"
- #include "dlgsql.h"
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CDaoTreeView
-
- IMPLEMENT_DYNCREATE(CDaoTreeView, CTreeView)
-
- BEGIN_MESSAGE_MAP(CDaoTreeView, CTreeView)
- //{{AFX_MSG_MAP(CDaoTreeView)
- ON_WM_CREATE()
- ON_WM_SYSCOLORCHANGE()
- ON_COMMAND(ID_EDIT_NEWQUERY, OnNewQuery)
- ON_COMMAND(ID_QUERY_EDIT, OnQueryEdit)
- //}}AFX_MSG_MAP
- ON_COMMAND_RANGE(ID_TABLE_SCHEMA,ID_QUERY_RUN, OnPopupCommand)
- ON_NOTIFY_REFLECT(TVN_KEYDOWN,OnKeyDown)
- ON_NOTIFY_REFLECT(TVN_SELCHANGED,OnNodeSelect)
- ON_NOTIFY_REFLECT(TVN_BEGINDRAG,OnBeginDrag)
- ON_NOTIFY_REFLECT(NM_RCLICK,OnRightClick)
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CDaoTreeView construction/destruction
-
- CDaoTreeView::CDaoTreeView() : CTreeView()
- {
- m_nIDClipFormat = RegisterClipboardFormat(_T("DaoView"));
- m_pDB = NULL;
- m_bNoNotifications = FALSE;
- }
-
- CDaoTreeView::~CDaoTreeView()
- {
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CDaoTreeView diagnostics
-
- #ifdef _DEBUG
- void CDaoTreeView::AssertValid() const
- {
- CTreeView::AssertValid();
- }
-
- void CDaoTreeView::Dump(CDumpContext& dc) const
- {
- CTreeView::Dump(dc);
- }
-
- #endif //_DEBUG
- CDaoViewDoc* CDaoTreeView::GetDocument() // non-debug version is inline
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDaoViewDoc)));
- return (CDaoViewDoc*)m_pDocument;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CDaoTreeView message handlers
-
- int CDaoTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- lpCreateStruct->style |= TVS_HASLINES | TVS_HASBUTTONS;
- if (CTreeView::OnCreate(lpCreateStruct) == -1)
- return -1;
-
- GetDocument()->m_pTreeView = this;
-
- // Create the Image List
- m_ctlImage.Create(IDB_IMAGELIST3,16,0,RGB(255,0,255));
- m_ctlImage.SetBkColor(GetSysColor(COLOR_WINDOW));
-
- /// Attach image list to Tree
- CTreeCtrlEx& ctlTree = (CTreeCtrlEx&) GetTreeCtrl();
- ctlTree.SetImageList(&m_ctlImage);
-
- m_dropTarget.Register(this);
-
- return 0;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CDaoTreeView implementation functions
-
- void CDaoTreeView::PopulateTree()
- {
- CTreeCtrlEx& ctlTree = (CTreeCtrlEx&) GetTreeCtrl();
-
- m_bNoNotifications = TRUE;
-
- ctlTree.DeleteAllItems();
- UpdateWindow();
-
- ASSERT(m_pDB);
- ASSERT(m_pDB->IsOpen());
-
- // Insert root node by call to tree object this time
- tDatabase = ctlTree.GetRootItem().AddTail(m_pDB->GetName(),IID_DATABASE);
-
- // From now on call via iterators
- tTables = tDatabase.AddTail(_T("Tables"),IID_TABLES);
- tRelations = tDatabase.AddTail(_T("Relations"),IID_RELATIONS);
- tQueryDefs = tDatabase.AddTail(_T("QueryDefs"),IID_QUERYDEFS);
-
- BOOL bShowSystemObjects = ((CDaoViewApp *)AfxGetApp())->m_bShowSystemObjects;
-
- CDaoTableDefInfo tabInfo;
- CDaoFieldInfo fieldInfo;
- CDaoIndexInfo indexInfo;
- try
- {
- int nTableDefCount = m_pDB->GetTableDefCount();
- for (int i = 0; i < nTableDefCount; i++)
- {
- m_pDB->GetTableDefInfo(i,tabInfo);
- if (!bShowSystemObjects)
- if (tabInfo.m_lAttributes & dbSystemObject)
- continue;
- AddItem(IID_TABLE,tabInfo.m_strName);
- }
- }
- catch (CDaoException* e)
- {
- e->Delete();
- }
-
- try
- {
- CDaoQueryDefInfo queryInfo;
- int nQueryDefCount= m_pDB->GetQueryDefCount();
- for (int i = 0; i < nQueryDefCount; i++)
- {
- m_pDB->GetQueryDefInfo(i,queryInfo);
- if (!bShowSystemObjects)
- if (queryInfo.m_nType == 5)
- continue;
- tQueryDefs.AddTail(queryInfo.m_strName,IID_QUERYDEF);
- }
- }
- catch (CDaoException* e)
- {
- e->Delete();
- }
-
- try
- {
- CDaoRelationInfo relInfo;
- int nRelationCount = m_pDB->GetRelationCount();
- for (int i = 0;i < nRelationCount;i++)
- {
- m_pDB->GetRelationInfo(i,relInfo);
- if (!bShowSystemObjects)
- if (relInfo.m_lAttributes & dbSystemObject)
- continue;
- tRelations.AddTail(relInfo.m_strName,IID_RELATION);
- }
- }
- catch (CDaoException* e)
- {
- e->Delete();
- }
-
- tDatabase.Expand();
- m_bNoNotifications = FALSE;
- UpdateWindow();
- }
-
- void CDaoTreeView::AddItem(WORD nItemType, LPCTSTR lpszName)
- {
- switch (nItemType)
- {
- case IID_TABLE:
- {
- tTable = tTables.AddTail(lpszName,IID_TABLE);
- tFields = tTable.AddTail(_T("Fields"),IID_FIELDS);
- tIndexes = tTable.AddTail(_T("Indexes"),IID_INDEXES);
- CDaoTableDef td(m_pDB);
- try
- {
- td.Open(lpszName);
- CDaoFieldInfo fieldInfo;
- int nFieldCount = td.GetFieldCount();
- for (int j=0; j < nFieldCount; j++)
- {
- td.GetFieldInfo(j,fieldInfo);
- tFields.AddTail(fieldInfo.m_strName,IID_FIELD);
- }
- CDaoIndexInfo indexInfo;
- int nIndexCount = td.GetIndexCount();
- for(j=0;j < nIndexCount;j++)
- {
- td.GetIndexInfo(j,indexInfo);
- tIndexes.AddTail(indexInfo.m_strName,IID_INDEX);
- }
- }
- catch(CDaoException* e)
- {
- // ... Do nothing. Used to catch security violations opening tables.
- e->Delete();
- }
- td.Close();
- break;
- }
- case IID_QUERYDEF:
- {
- tQueryDefs.AddTail(lpszName,nItemType);
- break;
- }
- }
- }
-
- void CDaoTreeView::DeleteItem(CTreeCursor& itemDelete)
- {
- switch (itemDelete.GetImageID())
- {
- case IID_TABLE:
- {
- try
- {
- m_pDB->DeleteTableDef(itemDelete.GetText());
- itemDelete.Delete();
- }
- catch (CDaoException* e)
- {
- MessageBox(
- _T("DaoView - Warning"),
- e->m_pErrorInfo->m_strDescription);
- e->Delete();
- }
- break;
- }
- case IID_QUERYDEF:
- {
- try
- {
- m_pDB->DeleteQueryDef(itemDelete.GetText());
- itemDelete.Delete();
- }
- catch (CDaoException* e)
- {
- MessageBox(
- _T("DaoView - Warning"),
- e->m_pErrorInfo->m_strDescription);
- e->Delete();
- }
- break;
- }
- }
- }
-
- void CDaoTreeView::OnNodeSelect(NMHDR *pNotifyStruct,LRESULT *result)
- {
- *result = 0;
-
- if (m_bNoNotifications)
- return;
-
- CTreeCtrlEx& ctlTree = (CTreeCtrlEx&) GetTreeCtrl();
-
- m_ItemSel = ctlTree.GetSelectedItem();
-
- UINT nImageID = m_ItemSel.GetImageID();
- GetDocument()->m_pListView->SetRedraw(FALSE);
- switch (nImageID)
- {
- case IID_DATABASE:
- GetDocument()->m_pListView->ShowDatabase();
- break;
- case IID_TABLES:
- GetDocument()->m_pListView->ShowTableSchema();
- break;
- case IID_TABLE:
- GetDocument()->m_pListView->ShowTableSchema(m_ItemSel.GetText());
- break;
- case IID_FIELDS:
- GetDocument()->m_pListView->ShowFields(m_ItemSel.GetParent().GetText());
- break;
- case IID_FIELD:
- GetDocument()->m_pListView->ShowFields(m_ItemSel.GetParent().GetParent().GetText(),m_ItemSel.GetText());
- break;
- case IID_QUERYDEFS:
- GetDocument()->m_pListView->ShowQuerySchema();
- break;
- case IID_QUERYDEF:
- GetDocument()->m_pListView->ShowQuerySchema(m_ItemSel.GetText());
- break;
- case IID_RELATIONS:
- GetDocument()->m_pListView->ShowRelations();
- break;
- case IID_RELATION:
- GetDocument()->m_pListView->ShowRelations(m_ItemSel.GetText());
- break;
- case IID_INDEXES:
- GetDocument()->m_pListView->ShowIndexes(m_ItemSel.GetParent().GetText());
- break;
- case IID_INDEX:
- GetDocument()->m_pListView->ShowIndexes(m_ItemSel.GetParent().GetParent().GetText(),m_ItemSel.GetText());
- break;
- }
- GetDocument()->m_pListView->SetRedraw(TRUE);
- }
-
- void CDaoTreeView::OnRightClick(NMHDR *pNotifyStruct,LRESULT *result)
- {
- CTreeCtrlEx& ctlTree = (CTreeCtrlEx&) GetTreeCtrl();
-
- UINT nFlags;
- CPoint curPoint;
- GetCursorPos(&curPoint);
- ScreenToClient(&curPoint);
- m_ItemSel = ctlTree.HitTest(curPoint, &nFlags);
-
- UINT nImageID = m_ItemSel.GetImageID();
- switch (nImageID)
- {
- case IID_TABLE:
- DoPopupMenu(IDR_POPUP_TABLE);
- break;
- case IID_QUERYDEF:
- DoPopupMenu(IDR_POPUP_QUERY);
- break;
- }
- *result = 0;
- }
-
- void CDaoTreeView::DoPopupMenu(UINT nMenuID)
- {
- CMenu popMenu;
-
- popMenu.LoadMenu(nMenuID);
-
- CPoint posMouse;
- GetCursorPos(&posMouse);
-
- popMenu.GetSubMenu(0)->TrackPopupMenu(0,posMouse.x,posMouse.y,this);
- }
-
- void CDaoTreeView::OnPopupCommand(UINT nMenuID)
- {
- CWaitCursor w;
- GetDocument()->m_pListView->SetRedraw(FALSE);
- switch (nMenuID)
- {
- case ID_TABLE_SCHEMA:
- GetDocument()->m_pListView->ShowTableSchema(m_ItemSel.GetText());
- break;
- case ID_TABLE_DATA:
- GetDocument()->m_pListView->ShowTableData(m_ItemSel.GetText());
- break;
- case ID_QUERY_DEFINITION:
- GetDocument()->m_pListView->ShowQuerySchema(m_ItemSel.GetText());
- break;
- case ID_QUERY_RUN:
- GetDocument()->m_pListView->RunQueryDef(m_ItemSel.GetText());
- break;
- }
- GetDocument()->m_pListView->SetRedraw(TRUE);
- }
-
-
- void CDaoTreeView::OnBeginDrag(NMHDR *pNotifyStruct,LRESULT *result)
- {
- int nImageID = m_ItemSel.GetImageID();
-
- switch (nImageID)
- {
- case IID_TABLE:
- case IID_QUERYDEF:
- CSharedFile globFile;
- CArchive ar(&globFile,CArchive::store);
- CDragItem dragItem(nImageID,m_pDB->GetName(),m_pDB->GetConnect(),m_ItemSel.GetText());
- dragItem.Serialize(ar);
- ar.Close();
-
- COleDataSource srcItem;
-
- srcItem.CacheGlobalData(m_nIDClipFormat,globFile.Detach());
- srcItem.DoDragDrop();
- }
-
- }
-
-
- DROPEFFECT CDaoTreeView::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
- {
- if (m_pDB)
- if (pDataObject->IsDataAvailable(m_nIDClipFormat))
- return DROPEFFECT_COPY;
-
- return CTreeView::OnDragEnter(pDataObject, dwKeyState, point);
- }
-
- DROPEFFECT CDaoTreeView::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
- {
- if (m_pDB)
- if (pDataObject->IsDataAvailable(m_nIDClipFormat))
- return DROPEFFECT_COPY;
-
- return CTreeView::OnDragOver(pDataObject, dwKeyState, point);
- }
-
- BOOL CDaoTreeView::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
- {
- if (!(m_pDB && pDataObject->IsDataAvailable(m_nIDClipFormat)))
- return CTreeView::OnDrop(pDataObject, dropEffect, point);
-
- HGLOBAL hGlob = pDataObject->GetGlobalData(m_nIDClipFormat);
- if (hGlob != NULL){
- CSharedFile globFile;
- globFile.SetHandle(hGlob,FALSE);
- CArchive ar(&globFile,CArchive::load);
- CDragItem dragItem;
- dragItem.Serialize(ar);
- ar.Close();
- dragItem.Transfer(this,m_pDB);
- return TRUE;
- }
-
- return FALSE;
- }
-
-
- void CDaoTreeView::OnSysColorChange()
- {
- CWnd::OnSysColorChange();
-
- // Reset the background color of our image list when notified
- m_ctlImage.SetBkColor(GetSysColor(COLOR_WINDOW));
- }
-
- void CDaoTreeView::OnKeyDown(NMHDR *pNotifyStruct,LRESULT *result)
- {
- TV_KEYDOWN* pKeyDown = (TV_KEYDOWN *) pNotifyStruct;
-
- if (pKeyDown->wVKey == VK_DELETE)
- {
- BOOL bShowWarnings = ((CDaoViewApp *)AfxGetApp())->m_bShowWarnings;
- int retCode = IDYES;
- if (bShowWarnings)
- {
- retCode = MessageBox(
- _T("Are you sure you want to delete this item ?"),
- _T("DaoView - Warning"),MB_YESNO);
- }
- if (retCode == IDYES)
- DeleteItem(m_ItemSel);
- }
- *result = 0;
- }
-
- void CDaoTreeView::OnNewQuery()
- {
- ASSERT(m_pDB);
- ASSERT(m_pDB->IsOpen());
-
- CDlgSQL dlgSQL;
-
- if (dlgSQL.DoModal() != IDOK)
- return;
-
- try
- {
- CDaoQueryDef qdTarget(m_pDB);
-
- qdTarget.Create(dlgSQL.m_strName,dlgSQL.m_strSQL);
- qdTarget.Append();
- }
- catch (CDaoException* e)
- {
- DisplayDaoException(e);
- e->Delete();
- return;
- }
- AddItem(IID_QUERYDEF,dlgSQL.m_strName);
- }
-
-
- void CDaoTreeView::OnQueryEdit()
- {
- try
- {
- CDlgSQL dlgSQL;
-
- dlgSQL.m_bEditMode = TRUE;
-
- CDaoQueryDef qdEdit(m_pDB);
- qdEdit.Open(m_ItemSel.GetText());
-
- dlgSQL.m_strName = m_ItemSel.GetText();
- dlgSQL.m_strSQL = qdEdit.GetSQL();
-
- if (dlgSQL.DoModal() == IDOK)
- qdEdit.SetSQL(dlgSQL.m_strSQL);
-
- qdEdit.Close();
- }
- catch (CDaoException* e)
- {
- DisplayDaoException(e);
- e->Delete();
- return;
- }
- }
-