[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