[commit] r2650 - trunk/GME/ObjectInspector

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Thu Sep 15 10:03:36 CDT 2016


Author: ksmyth
Date: Thu Sep 15 10:03:36 2016
New Revision: 2650

Log:
Add "Copy Value" and "Detach from Archetype" right-click menu items to Object Inspector

Modified:
   trunk/GME/ObjectInspector/InspectorDlg.cpp
   trunk/GME/ObjectInspector/InspectorDlg.h
   trunk/GME/ObjectInspector/InspectorList.cpp
   trunk/GME/ObjectInspector/InspectorList.h
   trunk/GME/ObjectInspector/ObjectInspector.rc
   trunk/GME/ObjectInspector/ObjectInspectorCtl.cpp
   trunk/GME/ObjectInspector/ObjectInspectorCtl.h
   trunk/GME/ObjectInspector/Resource.h

Modified: trunk/GME/ObjectInspector/InspectorDlg.cpp
==============================================================================
--- trunk/GME/ObjectInspector/InspectorDlg.cpp	Thu Aug 25 10:13:28 2016	(r2649)
+++ trunk/GME/ObjectInspector/InspectorDlg.cpp	Thu Sep 15 10:03:36 2016	(r2650)
@@ -413,6 +413,17 @@
 	{
 		OnItemChangedAttribute(wParam);
 	}
+	else if (lParam == INSP_PROP_PANEL)
+	{
+		CListItem ListItem;
+		m_inspectorLists[INSP_PROP_PANEL]->GetItem(wParam, ListItem);
+
+		CObjectInspectorCtrl* pParent = (CObjectInspectorCtrl*)GetParent();
+
+		if (ListItem.strName == L"Type") {
+			pParent->DetachFromArchetype(ListItem);
+		}
+	}
 	return TRUE;
 }
 

Modified: trunk/GME/ObjectInspector/InspectorDlg.h
==============================================================================
--- trunk/GME/ObjectInspector/InspectorDlg.h	Thu Aug 25 10:13:28 2016	(r2649)
+++ trunk/GME/ObjectInspector/InspectorDlg.h	Thu Sep 15 10:03:36 2016	(r2650)
@@ -86,7 +86,7 @@
 	bool m_bIsPanelVisible[INSP_PANEL_NUM];
 
 
-	
+	friend class CInspectorList;
 };
 
 //{{AFX_INSERT_LOCATION}}

Modified: trunk/GME/ObjectInspector/InspectorList.cpp
==============================================================================
--- trunk/GME/ObjectInspector/InspectorList.cpp	Thu Aug 25 10:13:28 2016	(r2649)
+++ trunk/GME/ObjectInspector/InspectorList.cpp	Thu Sep 15 10:03:36 2016	(r2650)
@@ -53,6 +53,7 @@
 	ON_BN_CLICKED(IDC_EDITOR_BUTTON, OnEditorClicked)
 	ON_MESSAGE(MSG_EDIT_END_OK, OnEditEndOK)
 	ON_COMMAND(ID_LISTCONTEXT_RESETTODEFAULT, OnListContextResetToDefault)
+	ON_COMMAND(ID_LISTCONTEXT_COPY, OnListContextCopy)
 	//}}AFX_MSG_MAP
 END_MESSAGE_MAP()
 
@@ -1154,32 +1155,73 @@
 
 void CInspectorList::OnRButtonDown(UINT nFlags, CPoint point)
 {
-	bool bIsCustom = false;
+	CWnd* pParent = GetParent();
+	CInspectorDlg* pInspectorDlg = (CInspectorDlg*)pParent->GetParent();
 
-	int nSelCount=GetSelCount();
+	int nSelCount = GetSelCount();
+	// if nothing selected, select item that was clicked
+	if (nSelCount == 0) {
+		BOOL outside;
+		auto clickedIndex = ItemFromPoint(point, outside);
+		if (!outside) {
+			SetSel(clickedIndex);
+			nSelCount = GetSelCount();
+		}
+	}
 
-	CArray<int,int> SelItemArr;
+	CArray<int, int> SelItemArr;
 	SelItemArr.SetSize(nSelCount);
 
-	CListBox::GetSelItems(nSelCount,SelItemArr.GetData());
+	CListBox::GetSelItems(nSelCount, SelItemArr.GetData());
 
-	for(int i=0;i<=SelItemArr.GetUpperBound();i++)
+	bool bIsCustom = false;
+
+	for (int i = 0; i <= SelItemArr.GetUpperBound(); i++)
 	{
-		int nCurr=SelItemArr.GetAt(i);
+		int nCurr = SelItemArr.GetAt(i);
 
-		CListItem& ListItem=m_ListItemArray.ElementAt(nCurr);
+		CListItem& ListItem = m_ListItemArray.ElementAt(nCurr);
 		if (!ListItem.bIsDefault) {
 			bIsCustom = true;
 			break;
 		}
 	}
 
-	if (bIsCustom) {
+	if (this == pInspectorDlg->m_inspectorLists[0] || this == pInspectorDlg->m_inspectorLists[1]) {
+
 		CMenu menu;
 		menu.LoadMenu(IDR_LISTCNTX_MENU);
+		if (!bIsCustom) {
+			menu.GetSubMenu(0)->EnableMenuItem(ID_LISTCONTEXT_RESETTODEFAULT, MF_GRAYED);
+		}
+		if (nSelCount == 1 && m_ListItemArray.ElementAt(SelItemArr.GetAt(0)).Value.dataType == ITEMDATA_STRING) {
+		}
+		else {
+			menu.GetSubMenu(0)->EnableMenuItem(ID_LISTCONTEXT_COPY, MF_GRAYED);
+		}
 		ClientToScreen(&point);
 		menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
-														point.x, point.y, this);
+			point.x, point.y, this);
+	}
+	else if (this == pInspectorDlg->m_inspectorLists[2]) {
+		if (nSelCount == 1) {
+			CListItem& listItem = m_ListItemArray.ElementAt(SelItemArr.GetAt(0));
+			if (listItem.strName == L"Type") {
+				CMenu menu;
+				menu.CreatePopupMenu();
+				menu.AppendMenuW(MF_STRING, ID_LISTCONTEXT_RESETTODEFAULT, L"Detach from Archetype");
+
+				const wchar_t* archetype = L" (Archetype)";
+				auto value = listItem.Value.stringVal.GetAt(0);
+				if (value.GetLength() >= wcslen(archetype) && wcscmp(archetype, value.Right(wcslen(archetype))) == 0) {
+					menu.EnableMenuItem(ID_LISTCONTEXT_RESETTODEFAULT, MF_GRAYED);
+				}
+
+				ClientToScreen(&point);
+				menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
+			}
+		}
+
 	}
 
 	CListBox::OnRButtonDown(nFlags, point);
@@ -1190,3 +1232,47 @@
 	SetDefault();
 	Invalidate();
 }
+
+void SetClipboardText(const CString& szData)
+{
+	HGLOBAL h;
+	LPTSTR arr;
+
+	h = GlobalAlloc(GMEM_MOVEABLE, (szData.GetLength() + 1) * sizeof(TCHAR));
+	arr = (LPTSTR)GlobalLock(h);
+	_tcscpy_s((TCHAR*)arr, szData.GetLength() + 1, static_cast<const wchar_t*>(szData));
+	GlobalUnlock(h);
+
+	::OpenClipboard(NULL);
+	EmptyClipboard();
+	SetClipboardData(CF_UNICODETEXT, h);
+	CloseClipboard();
+}
+
+void CInspectorList::OnListContextCopy()
+{
+	int nSelCount = GetSelCount();
+
+	CArray<int, int> SelItemArr;
+	SelItemArr.SetSize(nSelCount);
+
+	CListBox::GetSelItems(nSelCount, SelItemArr.GetData());
+
+	for (int i = 0; i <= SelItemArr.GetUpperBound(); i++)
+	{
+		int nCurr = SelItemArr.GetAt(i);
+
+		CListItem& ListItem = m_ListItemArray.ElementAt(nCurr);
+		if (ListItem.Value.dataType == ITEMDATA_STRING) {
+			// FIXME: is this O(n**2)?
+			CString concatenated;
+			for (int j = 0; j <= ListItem.Value.stringVal.GetUpperBound(); j++) {
+				concatenated += ListItem.Value.stringVal.GetAt(j) + "\r\n";
+			}
+			concatenated = concatenated.Left(concatenated.GetLength() - 2);
+			SetClipboardText(concatenated);
+
+		}
+	}
+	Invalidate();
+}

Modified: trunk/GME/ObjectInspector/InspectorList.h
==============================================================================
--- trunk/GME/ObjectInspector/InspectorList.h	Thu Aug 25 10:13:28 2016	(r2649)
+++ trunk/GME/ObjectInspector/InspectorList.h	Thu Sep 15 10:03:36 2016	(r2650)
@@ -97,6 +97,7 @@
 	afx_msg void OnSize(UINT nType, int cx, int cy);
 	afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
 	afx_msg void OnListContextResetToDefault();
+	afx_msg void OnListContextCopy();
 	//}}AFX_MSG
 
 	DECLARE_MESSAGE_MAP()

Modified: trunk/GME/ObjectInspector/ObjectInspector.rc
==============================================================================
--- trunk/GME/ObjectInspector/ObjectInspector.rc	Thu Aug 25 10:13:28 2016	(r2649)
+++ trunk/GME/ObjectInspector/ObjectInspector.rc	Thu Sep 15 10:03:36 2016	(r2650)
@@ -247,7 +247,8 @@
 BEGIN
     POPUP "ListContext"
     BEGIN
-        MENUITEM "Reset Value to Default       CTRL-D", ID_LISTCONTEXT_RESETTODEFAULT
+		MENUITEM "Reset Value to Default\tCtrl-D", ID_LISTCONTEXT_RESETTODEFAULT
+		MENUITEM "Copy Value", ID_LISTCONTEXT_COPY
     END
 END
 

Modified: trunk/GME/ObjectInspector/ObjectInspectorCtl.cpp
==============================================================================
--- trunk/GME/ObjectInspector/ObjectInspectorCtl.cpp	Thu Aug 25 10:13:28 2016	(r2649)
+++ trunk/GME/ObjectInspector/ObjectInspectorCtl.cpp	Thu Sep 15 10:03:36 2016	(r2650)
@@ -867,9 +867,8 @@
 	}
 }
 
-
-
-void CObjectInspectorCtrl::WriteAttributeItemToMga(CListItem ListItem)
+template<typename F>
+void CObjectInspectorCtrl::WriteToMga(CListItem ListItem, F f)
 {
 	CComPtr<IMgaMetaProject> ccpMetaProject;
 	try
@@ -880,45 +879,69 @@
 
 		ASSERT(!bInTransaction);
 
-		if(!bInTransaction)
+		if (!bInTransaction)
 		{
-			COMTHROW(m_project->BeginTransaction(m_territory,TRANSACTION_GENERAL));
-		}	
-
-		// Writing change to MGA
-		if (m_FCOList.IsEmpty()) {
-			m_Attribute.WriteItemToMga(ListItem,m_project);
-		}
-		else {
-			m_Attribute.WriteItemToMga(ListItem,m_FCOList);
+			COMTHROW(m_project->BeginTransaction(m_territory, TRANSACTION_GENERAL));
 		}
 
-		if(!bInTransaction)
+		f();
+
+		if (!bInTransaction)
 		{
 			HRESULT hResult = m_project->CommitTransaction();
-			if  ( FAILED(hResult) ) {
-				if ( hResult == E_MGA_CONSTRAINT_VIOLATION )
-					COMTHROW( m_project->AbortTransaction() );
-				else 
-					COMTHROW( hResult );
+			if (FAILED(hResult)) {
+				if (hResult == E_MGA_CONSTRAINT_VIOLATION)
+					COMTHROW(m_project->AbortTransaction());
+				else
+					COMTHROW(hResult);
 			}
-		}		
+		}
 	}
 	catch (hresult_exception e)
 	{
 		ASSERT(0);
 		m_project->AbortTransaction();
-		CWnd::MessageBox(_T("Object Inspector could not write attribute data due to an unexpected error. We apologize for the inconvenience."),_T("Object inspector"),MB_ICONERROR);
+		if (e.hr == E_MGA_LIBOBJECT)
+			CWnd::MessageBox(_T("Library objects cannot be modified."), _T("GME"), MB_ICONERROR);
+		else
+			CWnd::MessageBox(_T("Object Inspector could not write attribute data due to an unexpected error. We apologize for the inconvenience."), _T("Object inspector"), MB_ICONERROR);
 	}
 	catch (_com_error& e)
 	{
 		ASSERT(0);
 		m_project->AbortTransaction();
-		CWnd::MessageBox(CString(L"Object Inspector could not write attribute data: ") + static_cast<const wchar_t*>(e.Description()), L"Object inspector",MB_ICONERROR);
+		CWnd::MessageBox(CString(L"Object Inspector could not write attribute data: ") + static_cast<const wchar_t*>(e.Description()), L"Object inspector", MB_ICONERROR);
 	}
 
 }
 
+
+void CObjectInspectorCtrl::DetachFromArchetype(CListItem ListItem)
+{
+	auto write = [&]() {
+		if (m_FCOList.IsEmpty()) {
+		}
+		else {
+			MgaFCOPtr ptr = m_FCOList.GetHead();
+			ptr->DetachFromArcheType();
+		}
+	};
+	WriteToMga(ListItem, write);
+}
+
+void CObjectInspectorCtrl::WriteAttributeItemToMga(CListItem ListItem)
+{
+	auto write = [&]() {
+		if (m_FCOList.IsEmpty()) {
+			m_Attribute.WriteItemToMga(ListItem, m_project);
+		}
+		else {
+			m_Attribute.WriteItemToMga(ListItem, m_FCOList);
+		}
+	};
+	WriteToMga(ListItem, write);
+}
+
 void CObjectInspectorCtrl::WritePreferenceItemToMga(CListItem ListItem, bool bIsForKind)
 {
 	CComPtr<IMgaMetaProject> ccpMetaProject;

Modified: trunk/GME/ObjectInspector/ObjectInspectorCtl.h
==============================================================================
--- trunk/GME/ObjectInspector/ObjectInspectorCtl.h	Thu Aug 25 10:13:28 2016	(r2649)
+++ trunk/GME/ObjectInspector/ObjectInspectorCtl.h	Thu Sep 15 10:03:36 2016	(r2650)
@@ -114,11 +114,16 @@
 		STDMETHOD(ObjectEvent(IMgaObject * obj, unsigned long eventmask, VARIANT v));
 	END_INTERFACE_PART(EventSink)
 
+private:
+	template<typename F>
+	void WriteToMga(CListItem ListItem, F f);
+
 // Dispatch and event IDs
 public:
 	void WriteNameToMga( const CString& strName);
 	void UndoRedo( bool undo = true);
-	
+
+	void DetachFromArchetype(CListItem ListItem);
 	void WriteAttributeItemToMga(CListItem ListItem);
 	void WritePreferenceItemToMga(CListItem ListItem,bool bIsForKind);
 	void RefreshReferencePanel();

Modified: trunk/GME/ObjectInspector/Resource.h
==============================================================================
--- trunk/GME/ObjectInspector/Resource.h	Thu Aug 25 10:13:28 2016	(r2649)
+++ trunk/GME/ObjectInspector/Resource.h	Thu Sep 15 10:03:36 2016	(r2650)
@@ -49,6 +49,7 @@
 #define IDC_HELP_TEXT                   242
 #define IDC_STATIC_BKG                  243
 #define ID_LISTCONTEXT_RESETTODEFAULT   32768
+#define ID_LISTCONTEXT_COPY   32769
 
 // Next default values for new objects
 // 


More information about the gme-commit mailing list