jedioutcast/utils/Assimilate/AnimPicker.cpp

258 lines
6 KiB
C++
Raw Permalink Normal View History

2013-04-04 18:02:27 +00:00
// AnimPicker.cpp : implementation file
//
#include "stdafx.h"
//#include "assimilate.h"
#include "includes.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAnimPicker dialog
static bool gbFilterOutUsed = false;
CAnimPicker::CAnimPicker(char *psReturnString,
CWnd* pParent /*=NULL*/)
: CDialog(CAnimPicker::IDD, pParent)
{
//{{AFX_DATA_INIT(CAnimPicker)
m_bFilterOutUsed = gbFilterOutUsed;
//}}AFX_DATA_INIT
m_psReturnString= psReturnString;
*m_psReturnString = 0;
}
void CAnimPicker::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAnimPicker)
DDX_Check(pDX, IDC_CHECK_FILTEROUTUSED, m_bFilterOutUsed);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAnimPicker, CDialog)
//{{AFX_MSG_MAP(CAnimPicker)
ON_LBN_DBLCLK(IDC_LIST_BOTH, OnDblclkListBoth)
ON_LBN_DBLCLK(IDC_LIST_LEGS, OnDblclkListLegs)
ON_LBN_DBLCLK(IDC_LIST_TORSO, OnDblclkListTorso)
ON_LBN_SELCHANGE(IDC_LIST_LEGS, OnSelchangeListLegs)
ON_LBN_SELCHANGE(IDC_LIST_TORSO, OnSelchangeListTorso)
ON_LBN_SELCHANGE(IDC_LIST_BOTH, OnSelchangeListBoth)
ON_BN_CLICKED(IDC_CHECK_FILTEROUTUSED, OnCheckFilteroutused)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAnimPicker message handlers
const char *sEnumUsedString = "* ";
const char *sEnumSeperatorString_Prefix = "====== "; // (the spaces keep these unique/comparable)
const char *sEnumSeperatorString_Suffix = " ======"; //
void CAnimPicker::FillListBoxes()
{
// fill in the enum list boxes...
//
CListBox* boxLegs = (CListBox*)GetDlgItem(IDC_LIST_LEGS);
CListBox* boxTorso= (CListBox*)GetDlgItem(IDC_LIST_TORSO);
CListBox* boxBoth = (CListBox*)GetDlgItem(IDC_LIST_BOTH);
boxLegs->ResetContent();
boxTorso->ResetContent();
boxBoth->ResetContent();
CModel* theModel = ghAssimilateView->GetDocument()->GetCurrentUserSelectedModel();
ASSERT(theModel);
if (theModel)
{
for (int i=0; ; i++)
{
LPCSTR p = ((CAssimilateApp*)AfxGetApp())->GetEnumEntry(i);
if (!p)
break;
CString string = p;
if (theModel->AnimEnumInUse(p))
{
if (m_bFilterOutUsed)
continue;
string.Insert(0,sEnumUsedString);
}
if (IsEnumSeperator(p))
{
string = StripSeperatorStart(p);
string.Insert(0,sEnumSeperatorString_Prefix);
string+=sEnumSeperatorString_Suffix;
}
CListBox* listBoxPtr = NULL;
switch (GetEnumTypeFromString(p)) // note (p), *not* (string)
{
case ET_BOTH: listBoxPtr = boxBoth; break;
case ET_TORSO: listBoxPtr = boxTorso; break;
case ET_LEGS: listBoxPtr = boxLegs; break;
default: ASSERT(0); break;
}
if (listBoxPtr)
{
// keep an index to the original enum for comment-diving reasons...
//
int iIndex = listBoxPtr->InsertString(-1,string);
listBoxPtr->SetItemData(iIndex,(DWORD)p);
}
}
}
}
BOOL CAnimPicker::OnInitDialog()
{
CDialog::OnInitDialog();
FillListBoxes();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CAnimPicker::OnDblclkListBoth()
{
// not needed now...
//
// CListBox* boxBoth = (CListBox*)GetDlgItem(IDC_LIST_BOTH);
// boxBoth->GetText(boxBoth->GetCurSel(),m_psReturnString);
if (ReturnStringIsValid())
{
EndDialog( IDOK );
}
}
void CAnimPicker::OnDblclkListLegs()
{
// not needed now...
//
// CListBox* boxLegs = (CListBox*)GetDlgItem(IDC_LIST_LEGS);
// boxLegs->GetText(boxLegs->GetCurSel(),m_psReturnString);
if (ReturnStringIsValid())
{
EndDialog( IDOK );
}
}
void CAnimPicker::OnDblclkListTorso()
{
// not needed now...
//
// CListBox* boxTorso = (CListBox*)GetDlgItem(IDC_LIST_TORSO);
// boxTorso->GetText(boxTorso->GetCurSel(),m_psReturnString);
if (ReturnStringIsValid())
{
EndDialog( IDOK );
}
}
bool CAnimPicker::ReturnStringIsValid()
{
if (!strlen(m_psReturnString) ||
!strnicmp(m_psReturnString,sEnumUsedString, strlen(sEnumUsedString)) ||
!strnicmp(m_psReturnString,sEnumSeperatorString_Prefix, strlen(sEnumSeperatorString_Prefix))
)
{
return false;
}
return true;
}
// updates the return string for if needed later (so ENTER key can work), handles onscreen Comments.
//
void CAnimPicker::HandleSelectionChange(CListBox* listbox)
{
if (listbox->GetCurSel() != LB_ERR)
{
CString selectedString;
listbox->GetText(listbox->GetCurSel(),selectedString);
LPCSTR lpOriginalEnumName = (LPCSTR) listbox->GetItemData(listbox->GetCurSel());
LPCSTR psComment = lpOriginalEnumName?((CAssimilateApp*)AfxGetApp())->GetEnumComment(lpOriginalEnumName):NULL;
GetDlgItem(IDC_STATIC_COMMENT)->SetWindowText(psComment?va("Comment: %s",psComment):"");
strcpy(m_psReturnString,selectedString);
if (!ReturnStringIsValid())
{
strcpy(m_psReturnString,"");
}
}
}
void CAnimPicker::OnSelchangeListLegs()
{
CListBox* listbox = (CListBox*)GetDlgItem(IDC_LIST_LEGS);
HandleSelectionChange(listbox);
}
void CAnimPicker::OnSelchangeListTorso()
{
CListBox* listbox = (CListBox*)GetDlgItem(IDC_LIST_TORSO);
HandleSelectionChange(listbox);
}
void CAnimPicker::OnSelchangeListBoth()
{
CListBox* listbox = (CListBox*)GetDlgItem(IDC_LIST_BOTH);
HandleSelectionChange(listbox);
}
BOOL CAnimPicker::PreTranslateMessage(MSG* pMsg)
{
int i = VK_RETURN;
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
{
if (ReturnStringIsValid())
{
EndDialog( IDOK );
}
return 1; // disable the RETURN key
}
return CDialog::PreTranslateMessage(pMsg);
}
void CAnimPicker::OnCheckFilteroutused()
{
UpdateData(DIALOG_TO_DATA);
FillListBoxes();
}
void CAnimPicker::OnDestroy()
{
CDialog::OnDestroy();
gbFilterOutUsed = !!m_bFilterOutUsed;
}