summaryrefslogtreecommitdiff
path: root/hammer/entityreportdlg.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/entityreportdlg.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'hammer/entityreportdlg.cpp')
-rw-r--r--hammer/entityreportdlg.cpp573
1 files changed, 573 insertions, 0 deletions
diff --git a/hammer/entityreportdlg.cpp b/hammer/entityreportdlg.cpp
new file mode 100644
index 0000000..432641b
--- /dev/null
+++ b/hammer/entityreportdlg.cpp
@@ -0,0 +1,573 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Singleton dialog that generates and presents the entity report.
+//
+//=============================================================================//
+
+#include "stdafx.h"
+#include "EntityReportDlg.h"
+#include "fgdlib/GameData.h"
+#include "GlobalFunctions.h"
+#include "History.h"
+#include "MainFrm.h"
+#include "MapEntity.h"
+#include "MapInstance.h"
+#include "MapView2D.h"
+#include "MapWorld.h"
+#include "ObjectProperties.h"
+#include "hammer.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+
+static CEntityReportDlg *s_pDlg = NULL;
+static char *pszIniSection = "EntityReportDlg";
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Static function
+//-----------------------------------------------------------------------------
+void CEntityReportDlg::ShowEntityReport(CMapDoc *pDoc, CWnd *pwndParent)
+{
+ if (!s_pDlg)
+ {
+ s_pDlg = new CEntityReportDlg(pDoc, pwndParent);
+ s_pDlg->Create(IDD, pwndParent);
+ }
+
+ s_pDlg->ShowWindow(SW_SHOW);
+ s_pDlg->GenerateReport();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Private constructor.
+//-----------------------------------------------------------------------------
+CEntityReportDlg::CEntityReportDlg(CMapDoc *pDoc, CWnd* pParent /*=NULL*/)
+ : CDialog(CEntityReportDlg::IDD, pParent)
+{
+ m_pDoc = pDoc;
+
+ CWinApp *pApp = AfxGetApp();
+
+ m_bFilterByKeyvalue = pApp->GetProfileInt(pszIniSection, "FilterByKeyvalue", FALSE);
+ m_bFilterByClass = pApp->GetProfileInt(pszIniSection, "FilterByClass", FALSE);
+ m_bFilterByHidden = pApp->GetProfileInt(pszIniSection, "FilterByHidden", TRUE);
+ m_iFilterByType = pApp->GetProfileInt(pszIniSection, "FilterByType", 0);
+ m_bExact = pApp->GetProfileInt(pszIniSection, "Exact", FALSE);
+
+ m_szFilterClass = pApp->GetProfileString(pszIniSection, "FilterClass", "");
+ m_szFilterKey = pApp->GetProfileString(pszIniSection, "FilterKey", "");
+ m_szFilterValue = pApp->GetProfileString(pszIniSection, "FilterValue", "");
+
+ m_bFilterTextChanged = FALSE;
+
+ //{{AFX_DATA_INIT(CEntityReportDlg)
+ //}}AFX_DATA_INIT
+}
+
+void CEntityReportDlg::SaveToIni()
+{
+ CWinApp *pApp = AfxGetApp();
+
+ pApp->WriteProfileInt(pszIniSection, "FilterByKeyvalue", m_bFilterByKeyvalue);
+ pApp->WriteProfileInt(pszIniSection, "FilterByClass", m_bFilterByClass);
+ pApp->WriteProfileInt(pszIniSection, "FilterByHidden", m_bFilterByHidden);
+ pApp->WriteProfileInt(pszIniSection, "FilterByType", m_iFilterByType);
+ pApp->WriteProfileInt(pszIniSection, "Exact", m_bExact);
+
+ pApp->WriteProfileString(pszIniSection, "FilterClass", m_szFilterClass);
+ pApp->WriteProfileString(pszIniSection, "FilterKey", m_szFilterKey);
+ pApp->WriteProfileString(pszIniSection, "FilterValue", m_szFilterValue);
+}
+
+void CEntityReportDlg::DoDataExchange(CDataExchange* pDX)
+{
+ CDialog::DoDataExchange(pDX);
+ //{{AFX_DATA_MAP(CEntityReportDlg)
+ DDX_Control(pDX, IDC_EXACTVALUE, m_cExact);
+ DDX_Control(pDX, IDC_FILTERCLASS, m_cFilterClass);
+ DDX_Control(pDX, IDC_FILTERBYCLASS, m_cFilterByClass);
+ DDX_Control(pDX, IDC_ENTITIES, m_cEntities);
+ DDX_Control(pDX, IDC_FILTERVALUE, m_cFilterValue);
+ DDX_Control(pDX, IDC_FILTERKEY, m_cFilterKey);
+ DDX_Control(pDX, IDC_FILTERBYTYPE, m_cFilterByType);
+ DDX_Control(pDX, IDC_FILTERBYKEYVALUE, m_cFilterByKeyvalue);
+ DDX_Control(pDX, IDC_FILTERBYHIDDEN, m_cFilterByHidden);
+ //}}AFX_DATA_MAP
+
+ DDX_Check(pDX, IDC_EXACTVALUE, m_bExact);
+ DDX_Check(pDX, IDC_FILTERBYCLASS, m_bFilterByClass);
+ DDX_Radio(pDX, IDC_FILTERBYTYPE, m_iFilterByType);
+ DDX_Text(pDX, IDC_FILTERCLASS, m_szFilterClass);
+ DDX_Text(pDX, IDC_FILTERVALUE, m_szFilterValue);
+ DDX_Text(pDX, IDC_FILTERKEY, m_szFilterKey);
+ DDX_Check(pDX, IDC_FILTERBYKEYVALUE, m_bFilterByKeyvalue);
+ DDX_Check(pDX, IDC_FILTERBYHIDDEN, m_bFilterByHidden);
+}
+
+
+BEGIN_MESSAGE_MAP(CEntityReportDlg, CDialog)
+ //{{AFX_MSG_MAP(CEntityReportDlg)
+ ON_BN_CLICKED(IDC_DELETE, OnDelete)
+ ON_BN_CLICKED(IDC_FILTERBYHIDDEN, OnFilterbyhidden)
+ ON_BN_CLICKED(IDC_FILTERBYKEYVALUE, OnFilterbykeyvalue)
+ ON_BN_CLICKED(IDC_FILTERBYTYPE, OnFilterbytype)
+ ON_EN_CHANGE(IDC_FILTERKEY, OnChangeFilterkey)
+ ON_EN_CHANGE(IDC_FILTERVALUE, OnChangeFiltervalue)
+ ON_BN_CLICKED(IDC_GOTO, OnGoto)
+ ON_BN_CLICKED(IDC_PROPERTIES, OnProperties)
+ ON_WM_TIMER()
+ ON_CBN_EDITCHANGE(IDC_FILTERCLASS, OnEditchangeFilterclass)
+ ON_BN_CLICKED(IDC_FILTERBYCLASS, OnFilterbyclass)
+ ON_CBN_SELCHANGE(IDC_FILTERCLASS, OnSelchangeFilterclass)
+ ON_BN_CLICKED(IDC_RADIO2, OnFilterbytype)
+ ON_BN_CLICKED(IDC_RADIO3, OnFilterbytype)
+ ON_BN_CLICKED(IDC_EXACTVALUE, OnExactvalue)
+ ON_LBN_SELCHANGE(IDC_ENTITIES, OnSelChangeEntityList)
+ ON_LBN_DBLCLK(IDC_ENTITIES, OnDblClkEntityList)
+ ON_WM_DESTROY()
+ ON_WM_CLOSE()
+ //}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Deletes the marked objects.
+//-----------------------------------------------------------------------------
+void CEntityReportDlg::OnDelete(void)
+{
+ if (AfxMessageBox("Delete Objects?", MB_YESNO) == IDNO)
+ {
+ return;
+ }
+
+ GetHistory()->MarkUndoPosition(NULL, "Delete Objects");
+
+ int iSel = m_cEntities.GetCurSel();
+
+ //
+ // Build a list of objects to delete.
+ //
+ CMapObjectList Objects;
+ for (int i = 0; i < m_cEntities.GetCount(); i++)
+ {
+ if (!m_cEntities.GetSel(i))
+ {
+ continue;
+ }
+
+ CMapEntity *pEntity = (CMapEntity *)m_cEntities.GetItemDataPtr(i);
+ Objects.AddToTail(pEntity);
+ m_cEntities.DeleteString(i);
+ --i;
+ }
+
+ m_pDoc->DeleteObjectList(Objects);
+
+ //
+ // Update the list box selection.
+ //
+ if (iSel >= m_cEntities.GetCount())
+ {
+ iSel = m_cEntities.GetCount() - 1;
+ }
+ m_cEntities.SetCurSel(iSel);
+}
+
+
+void CEntityReportDlg::OnFilterbyhidden()
+{
+ m_bFilterByHidden = m_cFilterByHidden.GetCheck();
+ UpdateEntityList();
+}
+
+void CEntityReportDlg::OnFilterbykeyvalue()
+{
+ m_bFilterByKeyvalue = m_cFilterByKeyvalue.GetCheck();
+ UpdateEntityList();
+
+ m_cFilterKey.EnableWindow(m_bFilterByKeyvalue);
+ m_cFilterValue.EnableWindow(m_bFilterByKeyvalue);
+ m_cExact.EnableWindow(m_bFilterByKeyvalue);
+}
+
+void CEntityReportDlg::OnFilterbytype()
+{
+ // walk all children in group
+ int iButton = 0;
+ HWND hWndCtrl = ::GetDlgItem(m_hWnd, IDC_FILTERBYTYPE);
+ do {
+ // control in group is a radio button
+ if(::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L) != 0)
+ break;
+ iButton++;
+ hWndCtrl = ::GetWindow(hWndCtrl, GW_HWNDNEXT);
+ } while(hWndCtrl != NULL && !(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP));
+
+ m_iFilterByType = iButton;
+ UpdateEntityList();
+}
+
+void CEntityReportDlg::OnChangeFilterkey()
+{
+ m_cFilterKey.GetWindowText(m_szFilterKey);
+ m_szFilterKey.MakeUpper();
+ m_dwFilterTime = time(NULL);
+ m_bFilterTextChanged = TRUE;
+}
+
+void CEntityReportDlg::OnChangeFiltervalue()
+{
+ m_cFilterValue.GetWindowText(m_szFilterValue);
+ m_szFilterValue.MakeUpper();
+ m_dwFilterTime = time(NULL);
+ m_bFilterTextChanged = TRUE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Centers the 2D and 3D views on the selected entities.
+//-----------------------------------------------------------------------------
+void CEntityReportDlg::OnGoto()
+{
+ CMapDoc *pMapDoc = MarkSelectedEntities();
+
+ if ( pMapDoc )
+ {
+ pMapDoc->ShowWindow( true );
+ pMapDoc->CenterViewsOnSelection();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CMapDoc *CEntityReportDlg::MarkSelectedEntities()
+{
+ CUtlVector< CMapDoc * > FoundMaps;
+
+ for(int i = 0; i < m_cEntities.GetCount(); i++)
+ {
+ if(!m_cEntities.GetSel(i))
+ continue;
+ CMapEntity *pEntity = (CMapEntity*) m_cEntities.GetItemDataPtr(i);
+ CMapClass *pTopMapClass = pEntity;
+ while( pTopMapClass->GetParent() )
+ {
+ pTopMapClass = pTopMapClass->GetParent();
+ }
+ CMapWorld *pMapWorld = dynamic_cast< CMapWorld * >( pTopMapClass );
+ if ( pMapWorld )
+ {
+ CMapDoc *pMapDoc = pMapWorld->GetOwningDocument();
+
+ if ( FoundMaps.Find( pMapDoc ) == -1 )
+ {
+ FoundMaps.AddToTail( pMapDoc );
+ pMapDoc->SelectObject( NULL, scClear|scSaveChanges );
+ }
+
+ pMapDoc->SelectObject( pEntity, scSelect );
+ }
+ }
+
+ if ( FoundMaps.Count() == 1 )
+ {
+ return FoundMaps[ 0 ];
+ }
+
+ return NULL;
+}
+
+void CEntityReportDlg::OnProperties()
+{
+ CMapDoc *pMapDoc = MarkSelectedEntities();
+
+ if ( pMapDoc )
+ {
+ pMapDoc->ShowWindow( true );
+ GetMainWnd()->pObjectProperties->ShowWindow(SW_SHOW);
+ }
+}
+
+void CEntityReportDlg::OnTimer(UINT nIDEvent)
+{
+ CDialog::OnTimer(nIDEvent);
+
+ // check filters
+ if(!m_bFilterTextChanged)
+ return;
+
+ if((time(NULL) - m_dwFilterTime) > 1)
+ {
+ m_bFilterTextChanged = FALSE;
+ m_dwFilterTime = time(NULL);
+ UpdateEntityList();
+ }
+}
+
+BOOL AddEntityToList(CMapEntity *pEntity, CEntityReportDlg *pDlg)
+{
+ char szString[256];
+
+ // nope.
+ if (!pDlg->m_bFilterByHidden && !pEntity->IsVisible())
+ {
+ return TRUE;
+ }
+
+ /*
+ if (!pDlg->m_pDoc->selection.IsEmpty() && !pEntity->IsSelected())
+ {
+ return TRUE;
+ }
+ */
+
+ if (pDlg->m_iFilterByType)
+ {
+ if (pDlg->m_iFilterByType == 1 && pEntity->IsPlaceholder())
+ {
+ return TRUE;
+ }
+ if (pDlg->m_iFilterByType == 2 && !pEntity->IsPlaceholder())
+ {
+ return TRUE;
+ }
+ }
+
+ const char* pszClassName = pEntity->GetClassName();
+
+ if ( pEntity && stricmp( pszClassName, "func_instance" ) == 0 )
+ {
+ CMapInstance *pMapInstance = pEntity->GetChildOfType( ( CMapInstance * )NULL );
+ if ( pMapInstance )
+ {
+ CMapDoc *pMapDoc = pMapInstance->GetInstancedMap();
+ if ( pMapDoc )
+ {
+ CMapWorld *pWorld = pMapDoc->GetMapWorld();
+
+ pWorld->EnumChildren(ENUMMAPCHILDRENPROC(AddEntityToList), DWORD(pDlg), MAPCLASS_TYPE(CMapEntity));
+ }
+ }
+ }
+
+ if (pDlg->m_bFilterByClass)
+ {
+ if (pDlg->m_szFilterClass.IsEmpty())
+ {
+ if (pszClassName[0])
+ {
+ return(TRUE);
+ }
+ }
+ else
+ {
+ V_strcpy_safe( szString, pEntity->GetClassName() );
+ strupr(szString);
+ if (!strstr(szString, pDlg->m_szFilterClass))
+ {
+ return(TRUE);
+ }
+ }
+ }
+
+ strcpy(szString, pszClassName);
+
+ BOOL bAdd = TRUE;
+
+ if(pDlg->m_bFilterByKeyvalue)
+ bAdd = FALSE;
+
+ MDkeyvalue tmpkv;
+ for (int i = pEntity->GetFirstKeyValue(); i != pEntity->GetInvalidKeyValue(); i=pEntity->GetNextKeyValue( i ) )
+ {
+ // if filtering by keyvalue, check!
+ if (pDlg->m_bFilterByKeyvalue && !bAdd && !pDlg->m_szFilterValue.IsEmpty())
+ {
+ // first, check key
+ if (pDlg->m_szFilterKey.IsEmpty() || !strcmpi(pDlg->m_szFilterKey, pEntity->GetKey(i)))
+ {
+ // now, check value
+ char szTmp1[128], szTmp2[128];
+ V_strcpy_safe( szTmp1, pEntity->GetKeyValue( i ) );
+ strupr(szTmp1);
+ strcpy(szTmp2, pDlg->m_szFilterValue);
+ if ((!pDlg->m_bExact && strstr(szTmp1, szTmp2)) || !strcmpi(szTmp1, szTmp2))
+ {
+ bAdd = TRUE;
+ }
+ }
+ }
+
+ const char* pszName = pEntity->GetKey(i);
+
+ GDclass *pClass = pEntity->GetClass();
+ if (pClass != NULL)
+ {
+ GDinputvariable *pVar = pClass->VarForName(pEntity->GetKey(i));
+ if (!pVar || !pVar->IsReportable())
+ {
+ continue;
+ }
+ pszName = pVar->GetLongName();
+ }
+
+ sprintf(szString + strlen(szString), "\t%s \"%s\"", pszName, pEntity->GetKeyValue(i));
+
+ if (pClass == NULL)
+ {
+ break; // just do first if no class
+ }
+ }
+
+ if(bAdd)
+ {
+ int iIndex = pDlg->m_cEntities.AddString(szString);
+ pDlg->m_cEntities.SetItemDataPtr(iIndex, PVOID(pEntity));
+ }
+
+ return TRUE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CEntityReportDlg::UpdateEntityList(void)
+{
+ m_bFilterTextChanged = FALSE;
+
+ m_cEntities.SetRedraw(FALSE);
+ m_cEntities.ResetContent();
+
+ int x = 80;
+ m_cEntities.SetTabStops(x);
+
+ m_szFilterValue.MakeUpper();
+ m_szFilterKey.MakeUpper();
+ m_szFilterClass.MakeUpper();
+
+ // add items to list
+ CMapWorld *pWorld = m_pDoc->GetMapWorld();
+ pWorld->EnumChildren(ENUMMAPCHILDRENPROC(AddEntityToList), DWORD(this), MAPCLASS_TYPE(CMapEntity));
+
+ m_cEntities.SetRedraw(TRUE);
+ m_cEntities.Invalidate();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CEntityReportDlg::GenerateReport()
+{
+ CString str;
+ int nCount = pGD->GetClassCount();
+ for (int i = 0; i < nCount; i++)
+ {
+ GDclass *pc = pGD->GetClass(i);
+ if(!pc->IsBaseClass())
+ {
+ str = pc->GetName();
+ if(str != "worldspawn")
+ m_cFilterClass.AddString(str);
+ }
+ }
+
+ SetTimer(1, 500, NULL);
+
+ OnFilterbykeyvalue();
+ OnFilterbytype();
+ OnFilterbyclass();
+}
+
+void CEntityReportDlg::OnEditchangeFilterclass()
+{
+ m_cFilterClass.GetWindowText(m_szFilterClass);
+ m_szFilterClass.MakeUpper();
+ m_dwFilterTime = time(NULL);
+ m_bFilterTextChanged = TRUE;
+}
+
+void CEntityReportDlg::OnFilterbyclass()
+{
+ m_bFilterByClass = m_cFilterByClass.GetCheck();
+ UpdateEntityList();
+
+ m_cFilterClass.EnableWindow(m_bFilterByClass);
+}
+
+void CEntityReportDlg::OnSelchangeFilterclass()
+{
+ int iSel = m_cFilterClass.GetCurSel();
+ m_cFilterClass.GetLBText(iSel, m_szFilterClass);
+ m_szFilterClass.MakeUpper();
+ UpdateEntityList();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CEntityReportDlg::OnSelChangeEntityList()
+{
+ MarkSelectedEntities();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CEntityReportDlg::OnDblClkEntityList()
+{
+ CMapDoc *pMapDoc = MarkSelectedEntities();
+
+ if ( pMapDoc )
+ {
+ pMapDoc->ShowWindow( true );
+ pMapDoc->CenterViewsOnSelection();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CEntityReportDlg::OnExactvalue()
+{
+ m_bExact = m_cExact.GetCheck();
+ UpdateEntityList();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CEntityReportDlg::OnOK()
+{
+ DestroyWindow();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CEntityReportDlg::OnClose()
+{
+ DestroyWindow();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Called when our window is being destroyed.
+//-----------------------------------------------------------------------------
+void CEntityReportDlg::OnDestroy()
+{
+ SaveToIni();
+ s_pDlg = NULL;
+ delete this;
+}