[commit] r2411 - in trunk/GME: GMEActiveBrowser Search

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Fri Jan 10 16:20:29 CST 2014


Author: ksmyth
Date: Fri Jan 10 16:20:29 2014
New Revision: 2411

Log:
Search: autocomplete Kinds in combobox

Modified:
   trunk/GME/GMEActiveBrowser/AutoComboBox.cpp
   trunk/GME/Search/SearchCtl.cpp
   trunk/GME/Search/SearchDlg.cpp
   trunk/GME/Search/SearchDlg.h

Modified: trunk/GME/GMEActiveBrowser/AutoComboBox.cpp
==============================================================================
--- trunk/GME/GMEActiveBrowser/AutoComboBox.cpp	Thu Jan  2 14:51:11 2014	(r2410)
+++ trunk/GME/GMEActiveBrowser/AutoComboBox.cpp	Fri Jan 10 16:20:29 2014	(r2411)
@@ -66,9 +66,9 @@
 void CAutoComboBox::Fill(CString& strText, BOOL bReload)
 {
 	// Clear combo
-	while(GetCount()!=0)
+	for (int i = GetCount() - 1; i >= 0; i--)
 	{
-		DeleteString(0);
+		DeleteString(i);
 	}
 
 	if(strText=="")

Modified: trunk/GME/Search/SearchCtl.cpp
==============================================================================
--- trunk/GME/Search/SearchCtl.cpp	Thu Jan  2 14:51:11 2014	(r2410)
+++ trunk/GME/Search/SearchCtl.cpp	Fri Jan 10 16:20:29 2014	(r2411)
@@ -327,6 +327,7 @@
 		m_territory = NULL;
 		COMTHROW( m_project->CreateTerritory(&m_xEventSink,&m_territory,NULL) );
 		m_searchDlg.EnableSearch();
+		m_searchDlg.GetKinds(m_project);
 
 	}
 	else {

Modified: trunk/GME/Search/SearchDlg.cpp
==============================================================================
--- trunk/GME/Search/SearchDlg.cpp	Thu Jan  2 14:51:11 2014	(r2410)
+++ trunk/GME/Search/SearchDlg.cpp	Fri Jan 10 16:20:29 2014	(r2411)
@@ -17,6 +17,53 @@
 static char THIS_FILE[] = __FILE__;
 #endif
 
+
+BEGIN_MESSAGE_MAP(AutocompleteComboBox, CComboBox)
+	ON_CONTROL_REFLECT(CBN_EDITCHANGE, OnEditChange)
+END_MESSAGE_MAP()
+
+LRESULT AutocompleteComboBox::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
+{
+	if (message == WM_KEYDOWN && wParam == VK_DOWN)
+	{ // FIXME this doesn't work
+		this->ShowDropDown();
+		return 0;
+	}
+
+	return __super::WindowProc(message, wParam, lParam);
+}
+
+void AutocompleteComboBox::OnEditChange()
+{
+	CString str;
+	GetWindowTextW(str);
+	if (m_previous.GetLength() >= str.GetLength())
+	{
+		m_previous = str;
+		return;
+	}
+	auto substr_eq = [&str](const wchar_t* str2) { return wcsncmp(str, str2, str.GetLength()) == 0; };
+	ResetContent();
+	auto it = std::find_if(m_options.begin(), m_options.end(), substr_eq);
+	auto first = it;
+	for (; it != m_options.end() && substr_eq(*it); ++it)
+	{
+		InsertString(-1, *it);
+	}
+	if (first != m_options.end())
+	{
+		SetWindowTextW(*first);
+		SetEditSel(str.GetLength(), -1);
+	}
+	else
+	{
+		SetWindowTextW(str);
+		SetEditSel(str.GetLength(), -1);
+	}
+	m_previous = str;
+}
+
+
 /////////////////////////////////////////////////////////////////////////////
 // CSearchDlg dialog
 

Modified: trunk/GME/Search/SearchDlg.h
==============================================================================
--- trunk/GME/Search/SearchDlg.h	Thu Jan  2 14:51:11 2014	(r2410)
+++ trunk/GME/Search/SearchDlg.h	Fri Jan 10 16:20:29 2014	(r2411)
@@ -10,6 +10,8 @@
 #include "ComHelp.h"
 #include "afxwin.h"
 #include "afxcmn.h"
+#include <vector>
+#include <algorithm>
 // SearchDlg.h : header file
 //
 
@@ -50,6 +52,20 @@
    return _tcscmp(strItem2, strItem1);
 }
 
+class AutocompleteComboBox : public CComboBox
+{
+	CString m_previous;
+	std::vector<CString> m_options;
+public:
+	void SetOptions(std::vector<CString>&& options)
+	{
+		m_options = std::move(options);
+	}
+	DECLARE_MESSAGE_MAP()
+	void OnEditChange();
+protected:
+	virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
+};
 
 class CSearchDlg : public CDialog
 {
@@ -119,14 +135,14 @@
 
     //first search criteria controls
 	CComboBox	m_edtNameCtrlFirst;
-	CComboBox	m_edtKindNameCtrlFirst;
+	AutocompleteComboBox m_edtKindNameCtrlFirst;
 	CComboBox	m_edtRoleNameCtrlFirst;
 	CComboBox	m_edtAttributeCtrlFirst;
 	
     //second search criteria controls
     CComboBox m_edtNameCtrlSecond;
     CComboBox m_edtRoleNameCtrlSecond;
-    CComboBox m_edtKindNameCtrlSecond;
+    AutocompleteComboBox m_edtKindNameCtrlSecond;
     CComboBox m_edtAttributeCtrlSecond;
      
     CButton m_logicalGrp;
@@ -178,7 +194,28 @@
    
    	CComPtr<IMgaFCOs> results;
 	CComPtr<IMgaFCO> specialSearchFCO;
+public:
+	void GetKinds(CComPtr<IMgaProject>& project)
+	{
+		std::vector<CString> kinds;
+		CComPtr<IMgaMetaProject> meta;
+		project->get_RootMeta(&meta);
+		CComPtr<IMgaMetaFolder> root;
+		meta->get_RootFolder(&root);
+		CComPtr<IMgaMetaFCOs> metaFCOs;
+		root->get_DefinedFCOs(&metaFCOs);
+		MGACOLL_ITERATE(IMgaMetaFCO, metaFCOs)
+		{
+			_bstr_t name;
+			MGACOLL_ITER->get_Name(name.GetAddress());
+			kinds.push_back(CString(static_cast<const wchar_t*>(name)));
+		} MGACOLL_ITERATE_END;
+		std::sort(kinds.begin(), kinds.end());
+		m_edtKindNameCtrlFirst.SetOptions(std::vector<CString>(kinds));
+		m_edtKindNameCtrlSecond.SetOptions(std::move(kinds));
+	}
 
+protected:
 	BOOL m_scopedCtrlEnabled; // whether to enable scoped search at all
 
 


More information about the gme-commit mailing list