[commit] r2656 - trunk/GME/MgaUtil
GMESRC Repository Notifications
gme-commit at list.isis.vanderbilt.edu
Tue Nov 8 16:25:18 CST 2016
Author: ksmyth
Date: Tue Nov 8 16:25:18 2016
New Revision: 2656
Log:
Connection disambiguation dialog: sort roles
Modified:
trunk/GME/MgaUtil/MgaResolver.cpp
Modified: trunk/GME/MgaUtil/MgaResolver.cpp
==============================================================================
--- trunk/GME/MgaUtil/MgaResolver.cpp Mon Oct 10 16:27:39 2016 (r2655)
+++ trunk/GME/MgaUtil/MgaResolver.cpp Tue Nov 8 16:25:18 2016 (r2656)
@@ -7,6 +7,8 @@
#include "AlterNmspDlg.h"
#include "CommonError.h"
+#include <algorithm>
+
/////////////////////////////////////////////////////////////////////////////
CString helper_ObjTypeStr(objtype_enum objtype) {
@@ -1354,72 +1356,51 @@
COMTHROW(metaFco.QueryInterface(&metaModel));
- COMTHROW(metaModel->LegalConnectionRoles(bstr,&roles));
+ COMTHROW(metaModel->LegalConnectionRoles(bstr, &roles));
// now get valid roles for input aspect (if any)
CDialogList cdl(_T("Select Connection Role Type"), CDialogList::CHKTEXT_STICKY);
- CList<int, int> valid_role_map;
- CComPtr<IMgaMetaRole> immr_ix;
-
- long role_count = 0;
-
- COMTHROW( roles->get_Count(&role_count) );
- for (int z = 1; z <= role_count; z++) {
-
- immr_ix = NULL;
- COMTHROW( roles->get_Item(z, &immr_ix) );
- ASSERT(immr_ix != NULL);
+ struct role_info {
+ IMgaMetaRolePtr role;
+ CString roleName;
+ };
+ std::vector<struct role_info> valid_roles;
+
+ long role_count = roles->Count;
+
+ for (int i = 1; i <= role_count; i++) {
+
+ auto metaRole = roles->Item[i];
+ ASSERT(metaRole != NULL);
+ CString role_name = CString(static_cast<const TCHAR*>(metaRole->Name));
if (aspect == NULL) {
- CComBSTR role_name;
-
- COMTHROW( immr_ix->get_Name(&role_name ) );
-
- cdl.m_sz_prelist.AddTail(CString(role_name));
+ role_info info = { metaRole, role_name };
- valid_role_map.AddTail(z);
-
+ valid_roles.push_back(info);
} else {
CComPtr<IMgaMetaParts> parts;
- COMTHROW( immr_ix->get_Parts(&parts) );
+ COMTHROW( metaRole->get_Parts(&parts) );
ASSERT(parts!=NULL);
- CComPtr<IMgaMetaPart> part_ix;
-
MGACOLL_ITERATE(IMgaMetaPart,parts) {
- part_ix = MGACOLL_ITER;
+ CComPtr<IMgaMetaPart>& part_ix = MGACOLL_ITER;
ASSERT(part_ix != NULL);
- VARIANT_BOOL vb_primary;
+ if (part_ix->IsPrimary != VARIANT_FALSE && part_ix->ParentAspect == aspect) {
- COMTHROW(part_ix->get_IsPrimary(&vb_primary) );
+ role_info info = { metaRole, role_name };
- if (vb_primary != VARIANT_FALSE) {
-
-
- CComPtr<IMgaMetaAspect> part_aspect;
-
- COMTHROW( part_ix->get_ParentAspect(&part_aspect) );
-
- if (part_aspect == aspect) {
-
- CComBSTR role_name;
-
- COMTHROW( immr_ix->get_Name(&role_name ) );
-
- cdl.m_sz_prelist.AddTail(CString(role_name));
-
- valid_role_map.AddTail(z);
-
- break;
- }
+ valid_roles.push_back(info);
+ break;
}
+
}
MGACOLL_ITERATE_END;
@@ -1427,13 +1408,20 @@
} // iterate over roles
- int valid_role_count = valid_role_map.GetCount();
- if (valid_role_count == 1) {
+ std::sort(valid_roles.begin(), valid_roles.end(), [](const struct role_info& info1, const struct role_info& info2) {
+ return wcscmp(info1.roleName, info2.roleName);
+ });
+ std::for_each(valid_roles.begin(), valid_roles.end(), [&cdl](const struct role_info& info) {
+ cdl.m_sz_prelist.AddTail(info.roleName);
+ });
- COMTHROW( roles->get_Item(valid_role_map.GetHead(), p) );
- return S_OK;
+ int valid_role_count = valid_roles.size();
+
+ if (valid_role_count == 1) {
+ *p = valid_roles[0].role.Detach();
+ return S_OK;
}
// before popping up the dialog, see if it is in the knowledge map
@@ -1442,7 +1430,8 @@
return S_OK;
}
else { // if sticky is disabled, remove it from the map
- (*p)->Release(); *p = NULL;
+ (*p)->Release();
+ *p = NULL;
map_put_RoleByPathStr(bstr, metaModel,OBJTYPE_CONNECTION,*p);
}
}
@@ -1465,13 +1454,10 @@
} else {
// get the entry in the list
-
- immr_ix = NULL;
- COMTHROW( roles->get_Item(
- valid_role_map.GetAt(valid_role_map.FindIndex(cdl.mn_selection_index)), p) );
+ *p = valid_roles[cdl.mn_selection_index].role.Detach();
if(cdl.mb_check_once == TRUE) {
- map_put_RoleByPathStr(bstr, metaModel,OBJTYPE_CONNECTION,*p);
+ map_put_RoleByPathStr(bstr, metaModel, OBJTYPE_CONNECTION, *p);
}
return S_OK;
More information about the gme-commit
mailing list