[commit] r2749 - trunk/GME/Gme
GMESRC Repository Notifications
gme-commit at list.isis.vanderbilt.edu
Wed Jun 27 09:20:32 CDT 2018
Author: ksmyth
Date: Wed Jun 27 09:20:31 2018
New Revision: 2749
Log:
Right-click drag-n-drop: don't offer options that are disallowed by metamodel
Modified:
trunk/GME/Gme/GMEView.cpp
Modified: trunk/GME/Gme/GMEView.cpp
==============================================================================
--- trunk/GME/Gme/GMEView.cpp Wed Jun 27 09:20:27 2018 (r2748)
+++ trunk/GME/Gme/GMEView.cpp Wed Jun 27 09:20:31 2018 (r2749)
@@ -1546,7 +1546,7 @@
{
VERIFY(inTransaction >= 0);
if(!inEventHandler && ++inTransaction == 1) {
- inRWTransaction = (mode == TRANSACTION_GENERAL);
+ inRWTransaction = (mode == TRANSACTION_GENERAL || mode == TRANSACTION_NON_NESTED);
COMTHROW(theApp.mgaProject->BeginTransaction(terry,mode));
}
}
@@ -6529,15 +6529,72 @@
OnDragLeave();
if (m_dropRightClick)
{
+ bool canMove = true;
+ bool canRef = true;
+ if (CGMEDataSource::IsGmeNativeDataAvailable(pDataObject, theApp.mgaProject))
+ {
+ canMove = false;
+ canRef = false;
+ try {
+ BeginTransaction(TRANSACTION_READ_ONLY);
+
+ CComPtr<IDataObject> p = pDataObject->GetIDataObject(FALSE);
+ CComPtr<IMgaDataSource> pt;
+ COMTHROW(p.QueryInterface(&pt));
+
+ CGMEDoc *doc = GetDocument();
+
+ CComPtr<IUnknown> unk;
+ COMTHROW(pt->get_Data(&unk));
+ IMgaFCOsPtr fcos = unk.p;
+
+ if (fcos)
+ {
+ IMgaMetaModelPtr meta = currentModel->Meta;
+ auto roles = meta->Roles;
+
+ for (int i = 1; i <= fcos->Count; i++)
+ {
+ for (int j = 1; j <= roles->Count; j++)
+ {
+ if (fcos->Item[i]->Meta == roles->Item[j]->Kind)
+ {
+ canMove = true;
+ }
+ IMgaMetaReferencePtr ref = roles->Item[j]->Kind;
+ if (ref)
+ {
+ _bstr_t descs;
+ IMgaMetaPointerItemsPtr specs = ref->RefSpec->Items;
+ for (int k = 1; k <= specs->Count; k++)
+ {
+ if (wcscmp(fcos->Item[i]->Meta->Name, specs->Item[k]->Desc) == 0)
+ {
+ canRef = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ catch (...) {
+ CommitTransaction();
+ throw;
+ }
+ CommitTransaction();
+ }
+
CMenu menu;
if (menu.CreatePopupMenu())
{
enum actions { MOVE= 1000, COPY, REF, INSTANCE, SUBTYPE, CANCEL };
- menu.AppendMenu(MF_STRING, MOVE, L"Move");
- menu.AppendMenu(MF_STRING, COPY, L"Copy");
- menu.AppendMenu(MF_STRING, REF, L"Create reference");
- menu.AppendMenu(MF_STRING, SUBTYPE, L"Create subtype");
- menu.AppendMenu(MF_STRING, INSTANCE, L"Create instance");
+ UINT moveFlag = MF_STRING | (canMove ? 0u : MF_GRAYED);
+ menu.AppendMenu(moveFlag, MOVE, L"Move");
+ menu.AppendMenu(moveFlag, COPY, L"Copy");
+ menu.AppendMenu(MF_STRING | (canRef ? 0u : MF_GRAYED), REF, L"Create reference");
+ menu.AppendMenu(moveFlag, SUBTYPE, L"Create subtype");
+ menu.AppendMenu(moveFlag, INSTANCE, L"Create instance");
menu.AppendMenu(MF_STRING, CANCEL, L"Cancel");
UINT nItemID = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD, screen.x, screen.y, this);
More information about the gme-commit
mailing list