[commit] r2460 - trunk/GME/Search

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Thu Mar 6 18:03:38 CST 2014


Author: ksmyth
Date: Thu Mar  6 18:03:38 2014
New Revision: 2460

Log:
Drag-n-drop to Search: primarily for 'what references this'. Can also drag-n-drop to Name, Role, or Kind boxes

Modified:
   trunk/GME/Search/Search.vcxproj
   trunk/GME/Search/Search.vcxproj.filters
   trunk/GME/Search/SearchDlg.cpp
   trunk/GME/Search/SearchDlg.h
   trunk/GME/Search/StdAfx.cpp

Modified: trunk/GME/Search/Search.vcxproj
==============================================================================
--- trunk/GME/Search/Search.vcxproj	Wed Mar  5 17:18:06 2014	(r2459)
+++ trunk/GME/Search/Search.vcxproj	Thu Mar  6 18:03:38 2014	(r2460)
@@ -225,6 +225,7 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="..\Gme\GMEOLEData.cpp" />
     <ClCompile Include="Attribute.cpp" />
     <ClCompile Include="ComHelp.cpp" />
     <ClCompile Include="..\Common\CommonError.cpp" />

Modified: trunk/GME/Search/Search.vcxproj.filters
==============================================================================
--- trunk/GME/Search/Search.vcxproj.filters	Wed Mar  5 17:18:06 2014	(r2459)
+++ trunk/GME/Search/Search.vcxproj.filters	Thu Mar  6 18:03:38 2014	(r2460)
@@ -45,6 +45,9 @@
     <ClCompile Include="StdAfx.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="..\Gme\GMEOLEData.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="Search.def">

Modified: trunk/GME/Search/SearchDlg.cpp
==============================================================================
--- trunk/GME/Search/SearchDlg.cpp	Wed Mar  5 17:18:06 2014	(r2459)
+++ trunk/GME/Search/SearchDlg.cpp	Thu Mar  6 18:03:38 2014	(r2460)
@@ -11,6 +11,8 @@
 #include <sstream>
 #include <stack>
 
+#include "..\Gme\GMEOLEData.h"
+
 #ifdef _DEBUG
 #define new DEBUG_NEW
 #undef THIS_FILE
@@ -186,6 +188,8 @@
     //load search history from registry
     LoadSearchHistory();
 
+	dropTarget.Register(this);
+
 	return true;
 }
 
@@ -1180,3 +1184,148 @@
     m_treeSearchHistory.DeleteAllItems();
     SaveSearchHistory();
 }
+
+DROPEFFECT CSearchDropTarget::OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
+{
+	CSearchDlg *ctrl = STATIC_DOWNCAST(CSearchDlg, pWnd);
+	CSearchCtrl *TheCtrl = ctrl->GetCtrl();
+	if (CGMEDataSource::IsGmeNativeDataAvailable(pDataObject, TheCtrl->GetProject()))
+	{
+		return DROPEFFECT_LINK;
+	}
+	return DROPEFFECT_NONE;
+}
+
+void CSearchDropTarget::OnDragLeave(CWnd* pWnd)
+{
+}
+
+DROPEFFECT CSearchDropTarget::OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
+{
+	CSearchDlg *ctrl = STATIC_DOWNCAST(CSearchDlg, pWnd);
+	CSearchCtrl *TheCtrl = ctrl->GetCtrl();
+	if (CGMEDataSource::IsGmeNativeDataAvailable(pDataObject, TheCtrl->GetProject()))
+	{
+		return DROPEFFECT_LINK;
+	}
+	return DROPEFFECT_NONE;
+}
+
+BOOL CSearchDropTarget::OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
+{
+	COMTRY {
+	CSearchDlg *ctrl = STATIC_DOWNCAST(CSearchDlg, pWnd);
+	CSearchCtrl *TheCtrl = ctrl->GetCtrl();
+	if (CGMEDataSource::IsGmeNativeDataAvailable(pDataObject, TheCtrl->GetProject()))
+	{
+		
+		CComPtr<IDataObject> p = pDataObject->GetIDataObject(FALSE);
+		CComPtr<IMgaDataSource> pt;
+		COMTHROW(p.QueryInterface(&pt));
+
+		CComPtr<IUnknown> unk;
+		COMTHROW(pt->get_Data(&unk));
+
+		CComPtr<IMgaFCOs> fcos;
+		// CComPtr<IMgaMetaRole> metaRole; TODO: put Kind or Role based on partbrowser drag-n-drop
+		if (SUCCEEDED(unk.QueryInterface(&fcos)))
+		{
+			CComPtr<IMgaFCO> fco;
+			long count = 0;
+			if (SUCCEEDED(fcos->get_Count(&count)) && count > 0)
+			{
+				COMTHROW(fcos->get_Item(1, &fco));
+			}
+			if (fco == nullptr)
+			{
+				return FALSE;
+			}
+
+			CWnd *dropTarget = ctrl->ChildWindowFromPoint(point);
+			CWnd *editKind = STATIC_DOWNCAST(CButton, ctrl->GetDlgItem(IDC_EDITKIND));
+			CWnd *editRole = STATIC_DOWNCAST(CButton, ctrl->GetDlgItem(IDC_EDITROLE));
+			CWnd *editName = STATIC_DOWNCAST(CButton, ctrl->GetDlgItem(IDC_EDITNAME));
+			if (dropTarget->GetSafeHwnd() == editKind->GetSafeHwnd())
+			{
+				TheCtrl->BeginTransaction();
+				try
+				{
+					CComPtr<IMgaMetaFCO> meta;
+					COMTHROW(fco->get_Meta(&meta));
+					_bstr_t kind;
+					COMTHROW(meta->get_Name(kind.GetAddress()));
+					editKind->SetWindowTextW(static_cast<const wchar_t*>(kind));
+					TheCtrl->CommitTransaction();
+				}
+				catch (hresult_exception)
+				{
+					TheCtrl->AbortTransaction();
+					throw;
+				}
+			}
+			else if (dropTarget->GetSafeHwnd() == editRole->GetSafeHwnd())
+			{
+				try
+				{
+					TheCtrl->BeginTransaction();
+					CComPtr<IMgaMetaRole> meta;
+					COMTHROW(fco->get_MetaRole(&meta));
+					_bstr_t rolename;
+					COMTHROW(meta->get_Name(rolename.GetAddress()));
+					editRole->SetWindowTextW(static_cast<const wchar_t*>(rolename));
+					TheCtrl->CommitTransaction();
+				}
+				catch (hresult_exception)
+				{
+					TheCtrl->AbortTransaction();
+					throw;
+				}
+			}
+			else if (dropTarget->GetSafeHwnd() == editName->GetSafeHwnd())
+			{
+				TheCtrl->BeginTransaction();
+				try
+				{
+					_bstr_t name;
+					COMTHROW(fco->get_Name(name.GetAddress()));
+					editName->SetWindowTextW(static_cast<const wchar_t*>(name));
+					TheCtrl->CommitTransaction();
+				}
+				catch (hresult_exception)
+				{
+					TheCtrl->AbortTransaction();
+					throw;
+				}
+			}
+			else
+			{
+				ctrl->results = NULL;
+				COMTHROW(ctrl->results.CoCreateInstance(L"Mga.MgaFCOs"));
+				COMTHROW(ctrl->results->Append(fco));
+				TheCtrl->BeginTransaction();
+				try
+				{
+					ctrl->DisplayResults();
+					TheCtrl->CommitTransaction();
+					ctrl->m_lstResults.SetFocus();
+					int ind = ctrl->m_lstResults.GetTopIndex();
+					VERIFY(ctrl->m_lstResults.SetItemState(ind, LVIS_SELECTED, LVIS_SELECTED));
+					ctrl->m_lstResults.SetSelectionMark(ind);
+					ctrl->itemClicked();
+					CButton *special_check = STATIC_DOWNCAST(CButton, ctrl->GetDlgItem(IDC_CHECKSPLSEARCH));
+					special_check->SetCheck(TRUE);
+					ctrl->OnCheckSplSearch();
+				}
+				catch (hresult_exception)
+				{
+					TheCtrl->AbortTransaction();
+					throw;
+				}
+			}
+
+			return TRUE;
+		}
+	}
+	return FALSE;
+	} COMCATCH(return FALSE;)
+}

Modified: trunk/GME/Search/SearchDlg.h
==============================================================================
--- trunk/GME/Search/SearchDlg.h	Wed Mar  5 17:18:06 2014	(r2459)
+++ trunk/GME/Search/SearchDlg.h	Thu Mar  6 18:03:38 2014	(r2460)
@@ -18,6 +18,15 @@
 /////////////////////////////////////////////////////////////////////////////
 // CSearchDlg dialog
 
+class CSearchDropTarget : public COleDropTarget
+{
+public:
+	virtual DROPEFFECT OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
+	virtual void OnDragLeave(CWnd* pWnd);
+	virtual DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
+	virtual BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
+};
+
 //struct used for sending information to sort function usd by List Control
 
 struct SortParam
@@ -227,6 +236,9 @@
 	afx_msg void OnKeyDownListResults(NMHDR* pNMHDR, LRESULT* pResult);
 	//}}AFX_MSG
 	DECLARE_MESSAGE_MAP()
+
+	friend class CSearchDropTarget;
+	CSearchDropTarget dropTarget;
 public:
 	afx_msg void OnSize(UINT nType, int cx, int cy);
 	afx_msg void OnSizing(UINT fwSide, LPRECT pRect);

Modified: trunk/GME/Search/StdAfx.cpp
==============================================================================
--- trunk/GME/Search/StdAfx.cpp	Wed Mar  5 17:18:06 2014	(r2459)
+++ trunk/GME/Search/StdAfx.cpp	Thu Mar  6 18:03:38 2014	(r2460)
@@ -3,3 +3,5 @@
 //  stdafx.obj will contain the pre-compiled type information
 
 #include "stdafx.h"
+
+EXTERN_C const IID IID_IMgaDataSource = {0x9FF8F4E0,0xE0C9,0x11d3,{0xB3,0x76,0x00,0x50,0x04,0xD3,0x85,0x90}};


More information about the gme-commit mailing list