123
This commit is contained in:
384
Editor/Controls/ConsoleSCB.cpp
Normal file
384
Editor/Controls/ConsoleSCB.cpp
Normal file
@@ -0,0 +1,384 @@
|
||||
// ConsoleSCB.cpp: implementation of the CConsoleSCB class.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "ConsoleSCB.h"
|
||||
#include "PropertiesDialog.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[]=__FILE__;
|
||||
#define new DEBUG_NEW
|
||||
#endif
|
||||
|
||||
static CPropertiesDialog *gPropertiesDlg = 0;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
BEGIN_MESSAGE_MAP(CConsoleEdit, CEdit)
|
||||
ON_WM_GETDLGCODE()
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
BEGIN_MESSAGE_MAP(CConsoleSCB, CWnd)
|
||||
//{{AFX_MSG_MAP(CConsoleSCB)
|
||||
ON_WM_CREATE()
|
||||
ON_WM_SIZE()
|
||||
ON_WM_DESTROY()
|
||||
ON_WM_SETFOCUS()
|
||||
ON_EN_SETFOCUS( IDC_EDIT,OnEditSetFocus )
|
||||
ON_EN_KILLFOCUS( IDC_EDIT,OnEditKillFocus )
|
||||
//}}AFX_MSG_MAP
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
static CVarBlock* VarBlockFromConsoleVars()
|
||||
{
|
||||
IConsole *console = GetIEditor()->GetSystem()->GetIConsole();
|
||||
std::vector<const char*> cmds;
|
||||
cmds.resize( console->GetNumVars() );
|
||||
console->GetSortedVars( &cmds[0],cmds.size() );
|
||||
|
||||
CVarBlock *vb = new CVarBlock;
|
||||
IVariable* pVariable;
|
||||
for (int i = 0; i < cmds.size(); i++)
|
||||
{
|
||||
ICVar *pCVar = console->GetCVar(cmds[i]);
|
||||
int varType = pCVar->GetType();
|
||||
|
||||
switch(varType) {
|
||||
case CVAR_INT:
|
||||
pVariable = new CVariable<int>;
|
||||
pVariable->SetName(cmds[i]);
|
||||
pVariable->Set( pCVar->GetIVal() );
|
||||
vb->AddVariable( pVariable );
|
||||
pVariable->SetDescription( pCVar->GetHelp() );
|
||||
pVariable->SetDescription( pCVar->GetHelp() );
|
||||
break;
|
||||
case CVAR_FLOAT:
|
||||
pVariable = new CVariable<float>;
|
||||
pVariable->SetName(cmds[i]);
|
||||
pVariable->Set( pCVar->GetFVal() );
|
||||
pVariable->SetDescription( pCVar->GetHelp() );
|
||||
vb->AddVariable( pVariable );
|
||||
break;
|
||||
case CVAR_STRING:
|
||||
pVariable = new CVariable<CString>;
|
||||
pVariable->SetName(cmds[i]);
|
||||
pVariable->Set( pCVar->GetString() );
|
||||
pVariable->SetDescription( pCVar->GetHelp() );
|
||||
vb->AddVariable( pVariable );
|
||||
break;
|
||||
}
|
||||
}
|
||||
return vb;
|
||||
}
|
||||
|
||||
static void OnConsoleVariableUpdated( IVariable *pVar )
|
||||
{
|
||||
if (!pVar)
|
||||
return;
|
||||
CString varName = pVar->GetName();
|
||||
ICVar *pCVar = GetIEditor()->GetSystem()->GetIConsole()->GetCVar(varName);
|
||||
if (!pCVar)
|
||||
return;
|
||||
if (pVar->GetType() == IVariable::INT)
|
||||
{
|
||||
int val;
|
||||
pVar->Get(val);
|
||||
pCVar->Set(val);
|
||||
}
|
||||
else if (pVar->GetType() == IVariable::FLOAT)
|
||||
{
|
||||
float val;
|
||||
pVar->Get(val);
|
||||
pCVar->Set(val);
|
||||
}
|
||||
else if (pVar->GetType() == IVariable::STRING)
|
||||
{
|
||||
CString val;
|
||||
pVar->Get(val);
|
||||
pCVar->Set(val);
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
static CString popup_helper( HWND hwnd,int x,int y )
|
||||
{
|
||||
IConsole *console = GetIEditor()->GetSystem()->GetIConsole();
|
||||
std::vector<const char*> cmds;
|
||||
cmds.resize( console->GetNumVars() );
|
||||
console->GetSortedVars( &cmds[0],cmds.size() );
|
||||
|
||||
TSmartPtr<CVarBlock> vb = VarBlockFromConsoleVars();
|
||||
XmlNodeRef node;
|
||||
if (!gPropertiesDlg)
|
||||
gPropertiesDlg = new CPropertiesDialog( "Console Variables",node,AfxGetMainWnd() );
|
||||
if (!gPropertiesDlg->m_hWnd)
|
||||
{
|
||||
gPropertiesDlg->Create( CPropertiesDialog::IDD,AfxGetMainWnd() );
|
||||
gPropertiesDlg->SetUpdateCallback( functor(OnConsoleVariableUpdated) );
|
||||
}
|
||||
gPropertiesDlg->ShowWindow( SW_SHOW );
|
||||
gPropertiesDlg->GetPropertyCtrl()->AddVarBlock( vb );
|
||||
|
||||
/*
|
||||
HMENU hm = CreatePopupMenu();
|
||||
for (int i = 0; i < cmds.size(); i++) {
|
||||
AppendMenu( hm,MF_STRING,i+1,cmds[i] );
|
||||
}
|
||||
int res = TrackPopupMenuEx( hm,TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD,x,y,hwnd,NULL );
|
||||
if (res > 0) {
|
||||
return cmds[res-1];
|
||||
}
|
||||
*/
|
||||
return "";
|
||||
}
|
||||
|
||||
UINT CConsoleEdit::OnGetDlgCode()
|
||||
{
|
||||
UINT code = CEdit::OnGetDlgCode();
|
||||
code |= DLGC_WANTMESSAGE;
|
||||
return code;
|
||||
}
|
||||
|
||||
BOOL CConsoleEdit::PreTranslateMessage(MSG* msg)
|
||||
{
|
||||
if (msg->message == WM_LBUTTONDBLCLK || msg->message == WM_RBUTTONDOWN)
|
||||
{
|
||||
CPoint pnt;
|
||||
GetCursorPos(&pnt);
|
||||
CString str = popup_helper( GetSafeHwnd(),pnt.x,pnt.y );
|
||||
if (!str.IsEmpty())
|
||||
{
|
||||
SetWindowText( str+" " );
|
||||
}
|
||||
}
|
||||
else if (msg->message == WM_CHAR)
|
||||
{
|
||||
switch (msg->wParam)
|
||||
{
|
||||
case '~':
|
||||
case '`':
|
||||
// disable log.
|
||||
GetIEditor()->ShowConsole( false );
|
||||
SetWindowText( "" );
|
||||
break;
|
||||
}
|
||||
} else if (msg->message == WM_KEYDOWN)
|
||||
{
|
||||
switch (msg->wParam)
|
||||
{
|
||||
case VK_RETURN:
|
||||
{
|
||||
CString str;
|
||||
GetWindowText( str );
|
||||
// Execute this string as command.
|
||||
if (!str.IsEmpty())
|
||||
{
|
||||
CLogFile::WriteLine( str );
|
||||
GetIEditor()->GetSystem()->GetIConsole()->ExecuteString( str );
|
||||
m_history.erase( std::remove(m_history.begin(),m_history.end(),str),m_history.end() );
|
||||
m_history.push_back(str);
|
||||
}
|
||||
SetWindowText( "" );
|
||||
return 0;
|
||||
}
|
||||
return TRUE;
|
||||
break;
|
||||
|
||||
case VK_TAB:
|
||||
{
|
||||
GetAsyncKeyState(VK_CONTROL);
|
||||
bool bCtrl = GetAsyncKeyState(VK_CONTROL) != 0;
|
||||
IConsole *console = GetIEditor()->GetSystem()->GetIConsole();
|
||||
|
||||
CString inputStr,newStr;
|
||||
GetWindowText( inputStr );
|
||||
inputStr = inputStr.SpanExcluding( " " );
|
||||
|
||||
if (!bCtrl)
|
||||
{
|
||||
newStr = console->AutoComplete( inputStr );
|
||||
}
|
||||
else
|
||||
{
|
||||
newStr = console->AutoCompletePrev( inputStr );
|
||||
}
|
||||
|
||||
if (!newStr.IsEmpty())
|
||||
{
|
||||
newStr += " ";
|
||||
SetWindowText( newStr );
|
||||
}
|
||||
CString str;
|
||||
GetWindowText( str );
|
||||
SetSel( str.GetLength(),str.GetLength() );
|
||||
return TRUE;
|
||||
}
|
||||
return TRUE;
|
||||
break;
|
||||
|
||||
case VK_UP:
|
||||
case VK_DOWN:
|
||||
{
|
||||
CString str;
|
||||
CMenu menu;
|
||||
menu.CreatePopupMenu();
|
||||
for (int i = 0; i < m_history.size(); i++) {
|
||||
menu.AppendMenu( MF_STRING,i+1,m_history[i] );
|
||||
}
|
||||
CPoint pnt;
|
||||
GetCursorPos(&pnt);
|
||||
int res = ::TrackPopupMenuEx( menu.GetSafeHmenu(),TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD,pnt.x,pnt.y,GetSafeHwnd(),NULL );
|
||||
if (res > 0) {
|
||||
str = m_history[res-1];
|
||||
}
|
||||
if (!str.IsEmpty())
|
||||
{
|
||||
SetWindowText( str );
|
||||
SetSel( str.GetLength(),str.GetLength() );
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
case VK_ESCAPE:
|
||||
// disable log.
|
||||
GetIEditor()->ShowConsole( false );
|
||||
return TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return CEdit::PreTranslateMessage(msg);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
CConsoleSCB::CConsoleSCB()
|
||||
{
|
||||
CLogFile::WriteLine("Console created");
|
||||
}
|
||||
|
||||
CConsoleSCB::~CConsoleSCB()
|
||||
{
|
||||
if (gPropertiesDlg)
|
||||
delete gPropertiesDlg;
|
||||
gPropertiesDlg = 0;
|
||||
CLogFile::WriteLine("Console destroyed");
|
||||
}
|
||||
|
||||
int CConsoleSCB::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
||||
{
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Create the edit control and register it
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
RECT rcEdit;
|
||||
CFont cListBoxFont;
|
||||
|
||||
if (CWnd::OnCreate(lpCreateStruct) == -1)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
// Create the edit control
|
||||
VERIFY(m_cListBox.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL |
|
||||
LBS_NOSEL, rcEdit, this, NULL));
|
||||
m_cListBox.ShowWindow( SW_HIDE );
|
||||
*/
|
||||
m_dialog.Create( CConsoleDialog::IDD,this );
|
||||
|
||||
m_edit.Create( WS_CHILD|WS_VISIBLE|ES_MULTILINE|WS_VSCROLL|ES_AUTOVSCROLL|ES_AUTOHSCROLL|ES_READONLY, rcEdit, &m_dialog, NULL );
|
||||
m_edit.SetFont( CFont::FromHandle( (HFONT)::GetStockObject(DEFAULT_GUI_FONT)) );
|
||||
m_edit.ModifyStyleEx( 0,WS_EX_STATICEDGE );
|
||||
m_edit.SetLimitText(0);
|
||||
|
||||
|
||||
m_input.Create( WS_CHILD|WS_VISIBLE|ES_WANTRETURN|ES_AUTOHSCROLL|WS_TABSTOP, rcEdit, &m_dialog, IDC_EDIT );
|
||||
m_input.SetFont( CFont::FromHandle( (HFONT)::GetStockObject(SYSTEM_FONT)) );
|
||||
m_input.ModifyStyleEx( 0,WS_EX_STATICEDGE );
|
||||
m_input.SetWindowText( "" );
|
||||
|
||||
/*
|
||||
// Change
|
||||
cListBoxFont.Attach(::GetStockObject(DEFAULT_GUI_FONT));
|
||||
m_cListBox.SetFont(&cListBoxFont);
|
||||
cListBoxFont.Detach();
|
||||
*/
|
||||
|
||||
// Attach / register the listbox control
|
||||
//CLogFile::AttachListBox(m_cListBox.m_hWnd);
|
||||
CLogFile::AttachEditBox(m_edit.GetSafeHwnd());
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CConsoleSCB::OnSize(UINT nType, int cx, int cy)
|
||||
{
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Resize the edit control
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
RECT rcEdit;
|
||||
|
||||
CWnd::OnSize(nType, cx, cy);
|
||||
|
||||
// Get the size of the client window
|
||||
GetClientRect(&rcEdit);
|
||||
/*
|
||||
// Set the position of the listbox
|
||||
m_cListBox.SetWindowPos(NULL, rcEdit.left + 3, rcEdit.top + 3, rcEdit.right - 6,
|
||||
rcEdit.bottom - 6, SWP_NOZORDER);
|
||||
*/
|
||||
int inputH = 18;
|
||||
|
||||
m_dialog.MoveWindow( rcEdit.left,rcEdit.top,rcEdit.right,rcEdit.bottom );
|
||||
|
||||
m_edit.SetWindowPos(NULL, rcEdit.left, rcEdit.top + 2, rcEdit.right, rcEdit.bottom - 1 - inputH, SWP_NOZORDER);
|
||||
|
||||
m_input.SetWindowPos(NULL, rcEdit.left, rcEdit.bottom-inputH, rcEdit.right, rcEdit.bottom - 2, SWP_NOZORDER);
|
||||
m_input.SetFocus();
|
||||
}
|
||||
|
||||
void CConsoleSCB::OnDestroy()
|
||||
{
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Unregister the edit control
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
CLogFile::AttachEditBox(NULL);
|
||||
|
||||
CLogFile::WriteLine("Console control bar destroied");
|
||||
}
|
||||
|
||||
void CConsoleSCB::OnSetFocus( CWnd* pOldWnd )
|
||||
{
|
||||
m_input.SetFocus();
|
||||
}
|
||||
|
||||
BOOL CConsoleSCB::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CConsoleSCB::OnEditSetFocus()
|
||||
{
|
||||
// Disable accelerators when Edit gets focus.
|
||||
GetIEditor()->EnableAcceleratos( false );
|
||||
}
|
||||
|
||||
void CConsoleSCB::OnEditKillFocus()
|
||||
{
|
||||
// Enable accelerators when Edit loose focus.
|
||||
GetIEditor()->EnableAcceleratos( true );
|
||||
}
|
||||
|
||||
void CConsoleSCB::SetInputFocus()
|
||||
{
|
||||
m_input.SetFocus();
|
||||
m_input.SetWindowText( "" );
|
||||
}
|
||||
Reference in New Issue
Block a user