Files
FC1/Editor/SelectObjectDlg.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

1036 lines
26 KiB
C++

// SelectObjectDlg.cpp : implementation file
//
#include "stdafx.h"
#include "SelectObjectDlg.h"
#include "Objects\Group.h"
#include "Objects\ObjectManager.h"
#include "Objects\Entity.h"
#include "DisplaySettings.h"
#include "Settings.h"
#include "Material\Material.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define CHILD_INDENT 1
#define DISPLAY_VISIBLE 0
#define DISPLAY_HIDDEN 1
#define DISPLAY_FROZEN 2
#define COLUMN_NAME 0
#define COLUMN_TYPE 1
#define COLUMN_LAYER 2
#define COLUMN_MATERIAL 3
#define LIST_BITMAP_ANY 0
#define LIST_BITMAP_ENTITY 1
#define LIST_BITMAP_BRUSH 2
#define LIST_BITMAP_TAGPOINT 3
#define LIST_BITMAP_PATH 4
#define LIST_BITMAP_VOLUME 5
#define LIST_BITMAP_GROUP 7
int CSelectObjectDlg::m_sortFlags = 0;
int CSelectObjectDlg::m_displayMode = DISPLAY_VISIBLE;
BOOL CSelectObjectDlg::m_bEntity = TRUE;
BOOL CSelectObjectDlg::m_bPrefabs = TRUE;
BOOL CSelectObjectDlg::m_bOther = TRUE;
BOOL CSelectObjectDlg::m_bAIPoint = TRUE;
BOOL CSelectObjectDlg::m_bTagPoint = TRUE;
BOOL CSelectObjectDlg::m_bGroups = TRUE;
BOOL CSelectObjectDlg::m_bVolumes = TRUE;
BOOL CSelectObjectDlg::m_bShapes = TRUE;
BOOL CSelectObjectDlg::m_bBrushes = TRUE;
BOOL CSelectObjectDlg::m_bAutoselect = FALSE;
BOOL CSelectObjectDlg::m_bTree = FALSE;
CSelectObjectDlg* CSelectObjectDlg::m_instance = 0;
/////////////////////////////////////////////////////////////////////////////
// CSelectObjectDlg dialog
CSelectObjectDlg* CSelectObjectDlg::GetInstance()
{
if (!m_instance)
{
m_instance = new CSelectObjectDlg;
}
return m_instance;
}
CSelectObjectDlg::CSelectObjectDlg(CWnd* pParent /*=NULL*/)
: CXTResizeDialog(CSelectObjectDlg::IDD, pParent)
{
m_bIgnoreObjectCallback = false;
m_picking = false;
}
void CSelectObjectDlg::DoDataExchange(CDataExchange* pDX)
{
CXTResizeDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSelectObjectDlg)
DDX_Control(pDX, IDC_OBJECTS, m_list);
DDX_Control(pDX, IDC_HIDE, m_hideBtn);
DDX_Control(pDX, IDC_FREEZE, m_freezeBtn);
DDX_Control(pDX, IDC_SEL_ALL, m_selAllBtn);
DDX_Control(pDX, IDC_SEL_NONE, m_selNoneBtn);
DDX_Control(pDX, IDC_SEL_INV, m_selInvBtn);
DDX_Control(pDX, IDC_SELECT_PROPERTY_NAME, m_selByPropertyName);
DDX_Control(pDX, IDC_SELECT_PROPERTY_VALUE, m_selByPropertyValue);
DDX_Check(pDX, IDC_LIST_ENTITY, m_bEntity);
DDX_Check(pDX, IDC_LIST_PREFABS, m_bPrefabs);
DDX_Check(pDX, IDC_LIST_OTHER, m_bOther);
DDX_Check(pDX, IDC_LIST_TAGPOINT, m_bTagPoint);
DDX_Check(pDX, IDC_LIST_GROUPS, m_bGroups);
DDX_Check(pDX, IDC_LIST_VOLUMES, m_bVolumes);
DDX_Check(pDX, IDC_LIST_AIPOINTS, m_bAIPoint);
DDX_Check(pDX, IDC_LIST_PATHS, m_bShapes);
DDX_Check(pDX, IDC_LIST_BRUSHES, m_bBrushes);
DDX_Check(pDX, IDC_AUTOSELECT, m_bAutoselect);
DDX_Check(pDX, IDC_TREE, m_bTree);
DDX_Control( pDX,IDC_PROPERTY,m_propertyFilterCtrl );
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSelectObjectDlg, CXTResizeDialog)
//{{AFX_MSG_MAP(CSelectObjectDlg)
ON_WM_DESTROY()
ON_COMMAND(IDC_SEL_ALL, OnSelAll)
ON_COMMAND(IDC_SEL_NONE, OnSelNone)
ON_COMMAND(IDC_SEL_INV, OnSelInv)
ON_BN_CLICKED(IDC_LIST_ENTITY, OnListType)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_OBJECTS, OnColumnclickObjects)
ON_EN_UPDATE(IDC_FASTFIND, OnUpdateFastfind)
ON_NOTIFY(NM_CLICK, IDC_OBJECTS, OnClickObjects)
ON_BN_CLICKED(IDC_VISIBLE, OnVisible)
ON_BN_CLICKED(IDC_HIDDEN, OnHidden)
ON_BN_CLICKED(IDC_FROZEN, OnFrozen)
ON_BN_CLICKED(IDC_HIDE, OnHide)
ON_BN_CLICKED(IDC_FREEZE, OnFreeze)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_OBJECTS, OnItemchangedObjects)
ON_BN_CLICKED(IDC_LIST_BUILDING, OnListType)
ON_BN_CLICKED(IDC_LIST_TAGPOINT, OnListType)
ON_BN_CLICKED(IDC_LIST_STATOBJ, OnListType)
ON_BN_CLICKED(IDC_LIST_SOUND, OnListType)
ON_BN_CLICKED(IDC_LIST_PATHS, OnListType)
ON_BN_CLICKED(IDC_LIST_VOLUMES, OnListType)
ON_BN_CLICKED(IDC_LIST_BRUSHES, OnListType)
ON_BN_CLICKED(IDC_LIST_OTHER, OnListType)
ON_BN_CLICKED(IDC_AUTOSELECT, OnListType)
ON_BN_CLICKED(IDC_TREE, OnListType)
ON_BN_CLICKED(IDC_SELECT_PROPERTY_NAME, OnMatchPropertyName)
ON_BN_CLICKED(IDC_SELECT_PROPERTY_VALUE, OnMatchPropertyValue)
ON_NOTIFY(NM_DBLCLK, IDC_OBJECTS, OnDblclkObjects)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static int __stdcall CompareItems( LPARAM p1,LPARAM p2,LPARAM sort )
{
CBaseObject *o1 = (CBaseObject*)p1;
CBaseObject *o2 = (CBaseObject*)p2;
int order = sort >> 8;
int column = sort & 0xF;
if (column == 0)
{
// Sort by name.
if (order == 0)
return stricmp( o1->GetName(),o2->GetName() );
else
return -stricmp( o1->GetName(),o2->GetName() );
}
else if (column == 1)
{
// Sort by type
if (order == 0)
return stricmp( o1->GetTypeDescription(),o2->GetTypeDescription() );
else
return -stricmp( o1->GetTypeDescription(),o2->GetTypeDescription() );
}
else if (column == 2)
{
// Sort by type
if (order == 0)
return stricmp( o1->GetLayer()->GetName(),o2->GetLayer()->GetName() );
else
return -stricmp( o1->GetLayer()->GetName(),o2->GetLayer()->GetName() );
}
else if (column == 3)
{
const char *mtl1 = "";
const char *mtl2 = "";
if (o1->GetMaterial())
mtl1 = o1->GetMaterial()->GetName();
if (o2->GetMaterial())
mtl2 = o2->GetMaterial()->GetName();
// Sort by type
if (order == 0)
{
return stricmp( mtl1,mtl2 );
}
else
return -stricmp( mtl1,mtl2 );
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CSelectObjectDlg message handlers
BOOL CSelectObjectDlg::OnInitDialog()
{
CXTResizeDialog::OnInitDialog();
m_pObjMan = GetIEditor()->GetObjectManager();
m_displayMode = DISPLAY_VISIBLE;
m_picking = GetIEditor()->IsPicking();
if (GetIEditor()->IsPicking())
{
SetWindowText( "Pick Object" );
m_list.ModifyStyle( 0,LVS_SINGLESEL );
}
m_nameFilter = "";
m_propertyFilter = "";
m_bMatchPropertyName = true;
CheckDlgButton( IDC_VISIBLE,BST_CHECKED );
CRect rc;
GetDlgItem(IDC_OBJECTS)->GetClientRect( rc );
int w1 = 2*rc.right/4-20;
int w2 = rc.right/3 + 10;
int w3 = rc.right - w1 - w2 - 25;
//m_imageList.Create(IDB_SELECT_OBJECT_LIST, 16, 1, RGB (255, 255, 255));
CMFCUtils::LoadTrueColorImageList( m_imageList,IDB_SELECT_OBJECT_LIST,16,RGB(255,255,255) );
LVCOLUMN lvc;
ZeroStruct(lvc);
m_list.SetExtendedStyle( LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP );
m_list.InsertColumn( COLUMN_NAME+1,"Name",LVCFMT_LEFT,w1,0 );
m_list.InsertColumn( COLUMN_TYPE+1,"Type",LVCFMT_LEFT,w2,1 );
m_list.InsertColumn( COLUMN_LAYER+1,"Layer",LVCFMT_LEFT,w2,2 );
m_list.InsertColumn( COLUMN_MATERIAL+1,"Material",LVCFMT_LEFT,80,2 );
//m_list.InsertColumn( COLUMN_NAME,"Name",LVCFMT_LEFT,w1,0 );
//m_list.InsertColumn( COLUMN_TYPE,"Type",LVCFMT_LEFT,w2,1 );
//m_list.InsertColumn( COLUMN_LAYER,"Layer",LVCFMT_LEFT,w2,2 );
//m_list.InsertColumn( COLUMN_MATERIAL,"Material",LVCFMT_LEFT,80,2 );
FillList();
// Define resize anchors.
SetResize( IDC_OBJECTS,SZ_RESIZE(1) );
SetResize( IDC_SEL_NONE,SZ_HORREPOS(1) );
SetResize( IDC_SEL_ALL,SZ_HORREPOS(1) );
SetResize( IDC_SEL_INV,SZ_HORREPOS(1) );
SetResize( IDC_STATIC,SZ_VERREPOS(1) );
SetResize( IDC_STATIC1,SZ_HORREPOS(1) );
SetResize( IDC_STATIC2,SZ_HORREPOS(1) );
SetResize( IDC_FASTFIND,CXTResizeRect(0,1,1,1) );
SetResize( IDC_STATIC3,CXTResizeRect(0,1,1,1) );
SetResize( IDC_LIST_ENTITY,SZ_HORREPOS(1) );
SetResize( IDC_LIST_PREFABS,SZ_HORREPOS(1) );
SetResize( IDC_LIST_AIPOINTS,SZ_HORREPOS(1) );
SetResize( IDC_LIST_TAGPOINT,SZ_HORREPOS(1) );
SetResize( IDC_LIST_OTHER,SZ_HORREPOS(1) );
SetResize( IDC_LIST_GROUPS,SZ_HORREPOS(1) );
SetResize( IDC_LIST_VOLUMES,SZ_HORREPOS(1) );
SetResize( IDC_LIST_PATHS,SZ_HORREPOS(1) );
SetResize( IDC_LIST_BRUSHES,SZ_HORREPOS(1) );
SetResize( IDC_AUTOSELECT,SZ_HORREPOS(1) );
SetResize( IDC_TREE,SZ_HORREPOS(1) );
SetResize( IDC_VISIBLE,SZ_HORREPOS(1) );
SetResize( IDC_HIDDEN,SZ_HORREPOS(1) );
SetResize( IDC_FROZEN,SZ_HORREPOS(1) );
SetResize( IDC_HIDE,SZ_HORREPOS(1) );
SetResize( IDC_FREEZE,SZ_HORREPOS(1) );
SetResize( IDC_PROPERTY_STATIC,SZ_HORREPOS(1) );
SetResize( IDC_SELECT_PROPERTY_NAME,SZ_HORREPOS(1) );
SetResize( IDC_SELECT_PROPERTY_VALUE,SZ_HORREPOS(1) );
SetResize( IDC_PROPERTY,SZ_HORREPOS(1) );
SetResize( IDOK,SZ_REPOS(1) );
SetResize( IDCANCEL,SZ_REPOS(1) );
AutoLoadPlacement( "Dialogs\\SelectObject" );
EnableControls();
// Add event listener.
GetIEditor()->GetObjectManager()->AddObjectEventListener( functor(*this, &CSelectObjectDlg::OnObjectEvent) );
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//////////////////////////////////////////////////////////////////////////
void CSelectObjectDlg::OnDestroy()
{
// Remove event listener.
GetIEditor()->GetObjectManager()->RemoveObjectEventListener( functor(*this, &CSelectObjectDlg::OnObjectEvent) );
CXTResizeDialog::OnDestroy();
}
//////////////////////////////////////////////////////////////////////////
void CSelectObjectDlg::PostNcDestroy()
{
CXTResizeDialog::PostNcDestroy();
delete this;
m_instance = 0;
}
//////////////////////////////////////////////////////////////////////////
// Simply sub string searching case insensitive.
//////////////////////////////////////////////////////////////////////////
inline const char* strstri( const char *s1, const char *s2)
{
int i,j,k;
for(i=0;s1[i];i++)
for(j=i,k=0;tolower(s1[j])==tolower(s2[k]);j++,k++)
if(!s2[k+1])
return (s1+i);
return NULL;
}
void CSelectObjectDlg::AddObject( CBaseObject *obj,int level )
{
int objType = obj->GetType();
if (gSettings.objectHideMask & objType)
return;
if (obj->GetGroup())
{
if (!obj->GetGroup()->IsOpen())
return;
}
if (m_displayMode == DISPLAY_VISIBLE)
{
if (obj->IsHidden()||obj->IsFrozen())
return;
}
else if (m_displayMode == DISPLAY_HIDDEN)
{
if (!obj->IsHidden())
return;
}
else if (m_displayMode == DISPLAY_FROZEN)
{
if (!obj->IsFrozen())
return;
}
CString typeName = obj->GetTypeDescription();
if (!(objType & m_listMask))
return;
CObjectLayer *layer = obj->GetLayer();
if (layer->IsFrozen())
return;
if (!layer->IsVisible())
return;
/*
if (type == OBJTYPE_ENTITY && obj->GetRuntimeClass()->IsDerivedFrom(RUNTIME_CLASS(CEntity)))
{
typeName = ((CEntity*)obj)->GetEntityClass();
}
*/
CString objName = obj->GetName();
if (obj->GetGroup())
{
objName = CString("[") + obj->GetGroup()->GetName() + "] " + obj->GetName();
}
else
{
if (obj->GetType() == OBJTYPE_GROUP)
objName = CString("[") + obj->GetName() + "]";
}
// Check if have name filter.
if (!m_nameFilter.IsEmpty())
{
if (strstri(objName,m_nameFilter) == 0)
{
return;
}
}
if (!m_propertyFilter.IsEmpty())
{
if (!IsPropertyMatch( obj ))
return;
}
int iImage = LIST_BITMAP_ANY;
switch (objType)
{
case OBJTYPE_GROUP:
iImage = LIST_BITMAP_GROUP;
break;
case OBJTYPE_TAGPOINT:
iImage = LIST_BITMAP_TAGPOINT;
break;
case OBJTYPE_ENTITY:
iImage = LIST_BITMAP_ENTITY;
break;
case OBJTYPE_SHAPE:
iImage = LIST_BITMAP_PATH;
break;
case OBJTYPE_VOLUME:
iImage = LIST_BITMAP_VOLUME;
break;
case OBJTYPE_BRUSH:
iImage = LIST_BITMAP_BRUSH;
break;
}
int last = m_list.GetItemCount();
//int id = m_list.InsertItem( last,(const char*)objName );
LVITEM lvi;
lvi.mask = LVIF_PARAM|LVIF_INDENT|LVIF_IMAGE|LVIF_TEXT;
lvi.iItem = last;
lvi.iIndent = level;
lvi.iSubItem = COLUMN_NAME;
lvi.stateMask = 0;
lvi.state = 0;
lvi.pszText = const_cast<char*>((const char*)objName);
lvi.iImage = iImage;
lvi.lParam = (LPARAM)obj;
int id = m_list.InsertItem( &lvi );
/*
#if _MFC_VER >= 0x0700 //MFC7.0
m_list.SetItem( id,COLUMN_NAME,LVIF_PARAM|LVIF_INDENT|LVIF_IMAGE,0,iImage,0,0,(LPARAM)obj,level );
#else //MFC7.0
m_list.SetItem( id,COLUMN_NAME,LVIF_PARAM|LVIF_INDENT|LVIF_IMAGE,0,iImage,0,0,(LPARAM)obj );
#endif
*/
m_list.SetItem( id,COLUMN_TYPE,LVIF_TEXT|LVIF_STATE,(const char*)typeName,0,0,0,0 );
m_list.SetItem( id,COLUMN_LAYER,LVIF_TEXT|LVIF_STATE,(const char*)layer->GetName(),0,0,0,0 );
CMaterial *pMtl = obj->GetMaterial();
if (pMtl)
{
m_list.SetItem( id,COLUMN_MATERIAL,LVIF_TEXT|LVIF_STATE,(const char*)pMtl->GetName(),0,0,0,0 );
}
//m_list.SetItem( id,2,LVIF_TEXT,"S",0,0,0,0 );
if (obj->IsSelected())
{
m_list.SetItem( id,0,LVIF_STATE,0,0,LVIS_SELECTED,LVIS_SELECTED,0 );
}
}
void CSelectObjectDlg::AddObjectRecursively( CBaseObject *obj,int level )
{
AddObject( obj,level );
for (int i = 0; i < obj->GetChildCount(); i++)
{
AddObjectRecursively( obj->GetChild(i),level+1 );
}
}
//////////////////////////////////////////////////////////////////////////
void CSelectObjectDlg::FillList()
{
if (m_bTree)
m_list.SetImageList( &m_imageList,LVSIL_SMALL );
else
m_list.SetImageList( NULL,LVSIL_SMALL );
m_list.SetRedraw(FALSE);
//m_list.LockWindowUpdate();
m_list.DeleteAllItems();
int numObjects = GetIEditor()->GetObjectManager()->GetObjectCount();
std::vector<CBaseObject*> objects;
objects.clear();
objects.reserve( numObjects );
GetIEditor()->GetObjectManager()->GetObjects( objects );
int mask = 0;
if (m_bEntity)
mask |= OBJTYPE_ENTITY;
if (m_bPrefabs)
mask |= OBJTYPE_PREFAB;
if (m_bTagPoint)
mask |= OBJTYPE_TAGPOINT;
if (m_bAIPoint)
mask |= OBJTYPE_AIPOINT;
if (m_bVolumes)
mask |= OBJTYPE_VOLUME;
if (m_bGroups)
mask |= OBJTYPE_GROUP;
if (m_bShapes)
mask |= OBJTYPE_SHAPE;
if (m_bBrushes)
mask |= OBJTYPE_BRUSH;
if (m_bOther)
mask |= ~(OBJTYPE_ANY_DEFINED);
m_listMask = mask;
////////////////////////////////////////////////////////////////////////
// Fill the list box with data from the object
////////////////////////////////////////////////////////////////////////
for (int i = 0; i < objects.size(); i++)
{
CBaseObject *obj = objects[i];
if (m_bTree && obj->GetParent())
continue;
if (m_bTree)
AddObjectRecursively( obj,0 );
else
AddObject( obj,0 );
}
if (!m_bTree)
m_list.SortItems( CompareItems,m_sortFlags );
// Ensure that first selected item is visible.
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos != NULL)
{
int nItem = m_list.GetNextSelectedItem(pos);
m_list.EnsureVisible(nItem,FALSE);
}
//m_list.UnlockWindowUpdate();
m_list.SetRedraw(TRUE);
}
afx_msg void CSelectObjectDlg::OnSelAll()
{
////////////////////////////////////////////////////////////////////////
// Select all items in the list
////////////////////////////////////////////////////////////////////////
for (int i = 0; i < m_list.GetItemCount(); i++)
{
m_list.SetItem( i,0,LVIF_STATE,0,0,LVIS_SELECTED,LVIS_SELECTED,0 );
SelectItemObject( i );
}
m_list.SetFocus();
}
afx_msg void CSelectObjectDlg::OnSelNone()
{
////////////////////////////////////////////////////////////////////////
// Remove selection from all items in the list
////////////////////////////////////////////////////////////////////////
for (int i = 0; i < m_list.GetItemCount(); i++)
{
m_list.SetItem( i,0,LVIF_STATE,0,0,0,LVIS_SELECTED,0 );
SelectItemObject( i );
}
m_list.SetFocus();
}
afx_msg void CSelectObjectDlg::OnSelInv()
{
////////////////////////////////////////////////////////////////////////
// Reverse selection of all items in the list
////////////////////////////////////////////////////////////////////////
m_bIgnoreObjectCallback = true;
bool bChanged = false;
for (int i = 0; i < m_list.GetItemCount(); i++)
{
LVITEM item;
ZeroStruct(item);
item.mask = LVIF_STATE;
item.stateMask = LVIS_SELECTED;
item.iItem = i;
m_list.GetItem( &item );
item.state = (item.state==LVIS_SELECTED)?0:LVIS_SELECTED;
m_list.SetItem( &item );
SelectItemObject( i );
}
m_bIgnoreObjectCallback = false;
m_list.SetFocus();
}
void CSelectObjectDlg::OnOK()
{
//////////////////////////////////////////////////////////////////////
// Write the changes to the selection back to the document
//////////////////////////////////////////////////////////////////////
/*
if (!m_picking)
{
GetIEditor()->ClearSelection();
}
for (int i = 0; i < m_list.GetItemCount(); i++)
{
LVITEM item;
ZeroStruct(item);
item.mask = LVIF_STATE|LVIF_PARAM;
item.stateMask = LVIS_SELECTED;
item.iItem = i;
m_list.GetItem( &item );
if (item.state == LVIS_SELECTED)
{
CBaseObject *obj = (CBaseObject*)item.lParam;
GetIEditor()->GetObjectManager()->SelectObject( obj );
if (picking)
break;
}
}
*/
m_bIgnoreObjectCallback = true;
if (m_picking || !m_bAutoselect)
{
if (!m_picking)
{
GetIEditor()->ClearSelection();
}
for (int i = 0; i < m_list.GetItemCount(); i++)
{
LVITEM item;
ZeroStruct(item);
item.mask = LVIF_STATE|LVIF_PARAM;
item.stateMask = LVIS_SELECTED;
item.iItem = i;
m_list.GetItem( &item );
if (item.state == LVIS_SELECTED)
{
CBaseObject *obj = (CBaseObject*)item.lParam;
m_pObjMan->SelectObject( obj );
if (m_picking)
break;
}
}
}
m_bIgnoreObjectCallback = false;
DestroyWindow();
}
void CSelectObjectDlg::OnCancel()
{
DestroyWindow();
}
void CSelectObjectDlg::OnListType()
{
UpdateData();
FillList();
}
void CSelectObjectDlg::OnColumnclickObjects(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
int order = 0;
int column = pNMListView->iSubItem;
int bit = 1 << column;
if ((m_sortFlags&0xF) == column)
{
// change order.
order = m_sortFlags >> 8;
order = (order == 0) ? 1 : 0;
}
m_sortFlags = (order << 8) | column;
// Resort items.
if (!m_bTree)
m_list.SortItems( CompareItems,m_sortFlags );
*pResult = 0;
}
void CSelectObjectDlg::OnUpdateFastfind()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CXTResizeDialog::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_UPDATE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
CString findText;
GetDlgItemText( IDC_FASTFIND,findText );
//if (findText.IsEmpty())
//return;
m_nameFilter = findText;
FillList();
/*
LVFINDINFO info;
ZeroStruct(info);
info.flags = LVFI_PARTIAL|LVFI_STRING;
info.psz = findText;
int nIndex=-1;
POSITION pos = NULL;
GetIEditor()->ClearSelection();
// First unselect all.
for (int i = 0; i < m_list.GetItemCount(); i++)
{
m_list.SetItem( i,0,LVIF_STATE,0,0,0,LVIS_SELECTED,0 );
}
// Find string partially from the begining.
while ((nIndex = m_list.FindItem(&info,nIndex)) != -1)
{
m_list.SetItem( nIndex,0,LVIF_STATE,0,0,LVIS_SELECTED,LVIS_SELECTED,0 );
SelectItemObject( i );
}
pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
{
// Nothing selected.
// Select all items that much this string.
for (int i = 0; i < m_list.GetItemCount(); i++)
{
CString text = m_list.GetItemText( i,0 );
if (strstr(text,findText) != 0)
{
m_list.SetItem( i,0,LVIF_STATE,0,0,LVIS_SELECTED,LVIS_SELECTED,0 );
SelectItemObject( i );
}
}
}
// Ensure that first selected item is visible.
pos = m_list.GetFirstSelectedItemPosition();
if (pos != NULL)
{
int nItem = m_list.GetNextSelectedItem(pos);
m_list.EnsureVisible(nItem,FALSE);
}
GetDlgItem(IDC_FASTFIND)->SetFocus();
*/
}
void CSelectObjectDlg::OnClickObjects(NMHDR* pNMHDR, LRESULT* pResult)
{
/*
CString text;
GetDlgItemText( IDC_FASTFIND,text );
if (!text.IsEmpty())
{
SetDlgItemText( IDC_FASTFIND,"" );
m_nameFilter = "";
}
*/
*pResult = 0;
}
void CSelectObjectDlg::EnableControls()
{
BOOL bEnable;
if (m_list.GetSelectedCount() > 0)
bEnable = TRUE;
else
bEnable = FALSE;
GetDlgItem(IDC_HIDE)->EnableWindow(bEnable);
GetDlgItem(IDC_FREEZE)->EnableWindow(bEnable);
}
void CSelectObjectDlg::OnVisible()
{
m_displayMode = DISPLAY_VISIBLE;
FillList();
GetDlgItem(IDC_HIDE)->SetWindowText( "Hide" );
GetDlgItem(IDC_FREEZE)->SetWindowText( "Freeze" );
}
void CSelectObjectDlg::OnHidden()
{
m_displayMode = DISPLAY_HIDDEN;
FillList();
GetDlgItem(IDC_HIDE)->SetWindowText( "Unhide" );
GetDlgItem(IDC_FREEZE)->SetWindowText( "Freeze" );
}
void CSelectObjectDlg::OnFrozen()
{
m_displayMode = DISPLAY_FROZEN;
FillList();
GetDlgItem(IDC_HIDE)->SetWindowText( "Hide" );
GetDlgItem(IDC_FREEZE)->SetWindowText( "Unfreeze" );
}
void CSelectObjectDlg::OnHide()
{
// Hide/Unhide selected objects.
for (int i = 0; i < m_list.GetItemCount(); i++)
{
LVITEM item;
ZeroStruct(item);
item.mask = LVIF_STATE|LVIF_PARAM;
item.stateMask = LVIS_SELECTED;
item.iItem = i;
m_list.GetItem( &item );
if (item.state == LVIS_SELECTED)
{
CBaseObject *obj = (CBaseObject*)item.lParam;
if (m_displayMode == DISPLAY_HIDDEN)
GetIEditor()->GetObjectManager()->HideObject(obj,false);
else
GetIEditor()->GetObjectManager()->HideObject(obj,true);
}
}
FillList();
}
void CSelectObjectDlg::OnFreeze()
{
// Freeze/Unfreeze selected objects.
for (int i = 0; i < m_list.GetItemCount(); i++)
{
LVITEM item;
ZeroStruct(item);
item.mask = LVIF_STATE|LVIF_PARAM;
item.stateMask = LVIS_SELECTED;
item.iItem = i;
m_list.GetItem( &item );
if (item.state == LVIS_SELECTED)
{
CBaseObject *obj = (CBaseObject*)item.lParam;
if (m_displayMode == DISPLAY_FROZEN)
GetIEditor()->GetObjectManager()->FreezeObject(obj,false);
else
GetIEditor()->GetObjectManager()->FreezeObject(obj,true);
}
}
FillList();
}
void CSelectObjectDlg::OnItemchangedObjects(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
CBaseObject *pObject = (CBaseObject*)m_list.GetItemData( pNMListView->iItem );
if (pObject)
{
bool bWasSelected = (pNMListView->uOldState & LVIS_SELECTED) != 0;
bool bNowSelected = (pNMListView->uNewState & LVIS_SELECTED) != 0;
if (bWasSelected != bNowSelected)
{
SelectItemObject( pNMListView->iItem );
}
}
EnableControls();
*pResult = 0;
}
void CSelectObjectDlg::OnDblclkObjects(NMHDR* pNMHDR, LRESULT* pResult)
{
if (m_picking || !m_bAutoselect)
{
OnOK();
*pResult = 0;
return;
}
// Select and Goto object.
NMITEMACTIVATE *pNM = (NMITEMACTIVATE*)pNMHDR;
CBaseObject *pObject = (CBaseObject*)m_list.GetItemData( pNM->iItem );
if (pObject)
{
if (m_displayMode == DISPLAY_VISIBLE)
{
SelectItemObject( pNM->iItem );
Vec3 selPos = pObject->GetWorldPos();
Vec3 pos = selPos;
pos += Vec3(0,5,1);
//pos.z = GetIEditor()->GetTerrainElevation(pos.x,pos.y)+5;
GetIEditor()->SetViewerPos( pos );
Vec3 dir = selPos - pos;
dir = ConvertVectorToCameraAngles(dir);
GetIEditor()->SetViewerAngles( dir );
GetIEditor()->SetModifiedFlag();
}
}
*pResult = 0;
}
//////////////////////////////////////////////////////////////////////////
void CSelectObjectDlg::OnObjectEvent( CBaseObject *pObject,int event )
{
if (m_bIgnoreObjectCallback)
return;
switch (event)
{
case CBaseObject::ON_DELETE:
case CBaseObject::ON_SELECT:
case CBaseObject::ON_UNSELECT:
{
LVFINDINFO info;
ZeroStruct(info);
info.flags = LVFI_PARAM;
info.lParam = (LPARAM)pObject;
int iItem = m_list.FindItem( &info );
if (iItem >= 0)
{
if (event == CBaseObject::ON_DELETE)
m_list.DeleteItem( iItem );
else if (event == CBaseObject::ON_SELECT)
m_list.SetItem( iItem,0,LVIF_STATE,0,0,LVIS_SELECTED,LVIS_SELECTED,0 );
else if (event == CBaseObject::ON_UNSELECT)
m_list.SetItem( iItem,0,LVIF_STATE,0,0,0,LVIS_SELECTED,0 );
}
}
break;
}
}
void CSelectObjectDlg::SelectItemObject( int iItem )
{
if (!m_bAutoselect)
return;
if (m_picking || m_displayMode != DISPLAY_VISIBLE)
{
return;
}
m_bIgnoreObjectCallback = true;
LVITEM item;
ZeroStruct(item);
item.mask = LVIF_STATE|LVIF_PARAM;
item.stateMask = LVIS_SELECTED;
item.iItem = iItem;
m_list.GetItem( &item );
CBaseObject *pObject = (CBaseObject*)item.lParam;
if (pObject)
{
if (item.state & LVIS_SELECTED)
m_pObjMan->SelectObject(pObject);
else
m_pObjMan->UnselectObject(pObject);
}
m_bIgnoreObjectCallback = false;
}
//////////////////////////////////////////////////////////////////////////
void CSelectObjectDlg::OnMatchPropertyName()
{
m_bMatchPropertyName = true;
CWaitCursor wait;
m_propertyFilterCtrl.GetWindowText( m_propertyFilter );
FillList();
}
//////////////////////////////////////////////////////////////////////////
void CSelectObjectDlg::OnMatchPropertyValue()
{
m_bMatchPropertyName = false;
CWaitCursor wait;
m_propertyFilterCtrl.GetWindowText( m_propertyFilter );
FillList();
}
//////////////////////////////////////////////////////////////////////////
bool CSelectObjectDlg::IsPropertyMatch( CBaseObject *pObject )
{
//if (strstri(objName,m_nameFilter) == 0)
CVarBlock *pVars = pObject->GetVarBlock();
if (pVars)
{
for (int i = 0; i < pVars->GetVarsCount(); i++)
{
IVariable *pVar = pVars->GetVariable(i);
if (IsPropertyMatchVariable( pVar ))
return true;
}
}
if (pObject->IsKindOf( RUNTIME_CLASS(CEntity) ))
{
CEntity *pEntity = (CEntity*)pObject;
{
CVarBlock *pVars = pEntity->GetProperties();
if (pVars)
{
for (int i = 0; i < pVars->GetVarsCount(); i++)
{
IVariable *pVar = pVars->GetVariable(i);
if (IsPropertyMatchVariable( pVar ))
return true;
}
}
}
{
CVarBlock *pVars = pEntity->GetProperties2();
if (pVars)
{
for (int i = 0; i < pVars->GetVarsCount(); i++)
{
IVariable *pVar = pVars->GetVariable(i);
if (IsPropertyMatchVariable( pVar ))
return true;
}
}
}
}
return false;
}
//////////////////////////////////////////////////////////////////////////
bool CSelectObjectDlg::IsPropertyMatchVariable( IVariable *pVar )
{
if (m_bMatchPropertyName)
{
if (strstri(pVar->GetHumanName(),m_propertyFilter) != 0)
return true;
}
else
{
CString value;
pVar->Get( value );
if (strstri(value,m_propertyFilter) != 0)
return true;
}
if (pVar->NumChildVars() > 0)
{
for (int i = 0; i < pVar->NumChildVars(); i++)
{
IVariable *pChildVar = pVar->GetChildVar( i );
if (IsPropertyMatchVariable( pChildVar ))
return true;
}
}
return false;
}