4jcraft/Minecraft.Client/Platform/Common/XUI/XUI_Ctrl_4JEdit.cpp
2026-03-22 12:40:22 -05:00

192 lines
6.2 KiB
C++

#include "../../Minecraft.World/Platform/stdafx.h"
#include "XUI_Ctrl_4JEdit.h"
HRESULT CXuiCtrl4JEdit::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) {
HRESULT hr = S_OK;
// set a limit for the text box
m_uTextLimit = XUI_4JEDIT_MAX_CHARS - 1;
XuiEditSetTextLimit(m_hObj, m_uTextLimit);
// Find the text limit. (Add one for NULL terminator)
// m_uTextLimit = std::min( XuiEditGetTextLimit(m_hObj) + 1,
// XUI_4JEDIT_MAX_CHARS);
ZeroMemory(wchText, sizeof(WCHAR) * (m_uTextLimit + 1));
m_bReadOnly = false;
m_uiTitle = 0;
m_uiText = 0;
m_eKeyboardMode = C_4JInput::EKeyboardMode_Default;
return hr;
}
HRESULT CXuiCtrl4JEdit::SetTextLimit(int iLimit) {
CXuiCtrl4JEdit* pThis;
HRESULT hr = XuiObjectFromHandle(m_hObj, (void**)&pThis);
if (FAILED(hr)) return hr;
if (iLimit < XUI_4JEDIT_MAX_CHARS) {
pThis->m_uTextLimit = iLimit;
XuiEditSetTextLimit(pThis->m_hObj, iLimit);
ZeroMemory(pThis->wchText, sizeof(WCHAR) * XUI_4JEDIT_MAX_CHARS);
}
return S_OK;
}
HRESULT CXuiCtrl4JEdit::SetCaretPosition(int iPos) {
CXuiCtrl4JEdit* pThis;
HRESULT hr = XuiObjectFromHandle(m_hObj, (void**)&pThis);
if (FAILED(hr)) return hr;
XuiEditSetCaretPosition(pThis->m_hObj, iPos);
return S_OK;
}
HRESULT CXuiCtrl4JEdit::SetTitleAndText(unsigned int uiTitle,
unsigned int uiText) {
CXuiCtrl4JEdit* pThis;
HRESULT hr = XuiObjectFromHandle(m_hObj, (void**)&pThis);
if (FAILED(hr)) return hr;
pThis->m_uiTitle = uiTitle;
pThis->m_uiText = uiText;
return S_OK;
}
HRESULT CXuiCtrl4JEdit::SetReadOnly(bool bReadOnly) {
// Attempt to make the change on the actual original version of this object
// that XUI made itself, rather than the copy we make ourselves and then map
// to it, which shares the same handle
CXuiCtrl4JEdit* pThis;
HRESULT hr = XuiObjectFromHandle(m_hObj, (void**)&pThis);
if (FAILED(hr)) return hr;
pThis->m_bReadOnly = bReadOnly;
return S_OK;
}
HRESULT CXuiCtrl4JEdit::SetKeyboardType(
C_4JInput::EKeyboardMode eKeyboardMode) {
CXuiCtrl4JEdit* pThis;
HRESULT hr = XuiObjectFromHandle(m_hObj, (void**)&pThis);
if (FAILED(hr)) return hr;
pThis->m_eKeyboardMode = eKeyboardMode;
return S_OK;
}
// HRESULT CXuiCtrl4JEdit::SetIPMode(bool bIPMode)
// {
// // Attempt to make the change on the actual original version of this
// object that XUI made itself, rather
// // than the copy we make ourselves and then map to it, which shares the
// same handle CXuiCtrl4JEdit *pThis;
// HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis);
// if (FAILED(hr))
// return hr;
// pThis->m_bIPMode= bIPMode;
//
// return S_OK;
// }
// HRESULT CXuiCtrl4JEdit::SetExtendedMode(bool bExtendedMode)
// {
// // Attempt to make the change on the actual original version of this
// object that XUI made itself, rather
// // than the copy we make ourselves and then map to it, which shares the
// same handle CXuiCtrl4JEdit *pThis;
// HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis);
// if (FAILED(hr))
// return hr;
// pThis->m_bExtendedMode= bExtendedMode;
//
// return S_OK;
// }
HRESULT CXuiCtrl4JEdit::OnChar(XUIMessageChar* pInputData, BOOL& rfHandled) {
CXuiCtrl4JEdit* pThis;
HRESULT hr = XuiObjectFromHandle(m_hObj, (void**)&pThis);
if (FAILED(hr)) return hr;
HXUIOBJ hBaseObj;
// need to send the key down to the base object, so that when we notify the
// parent, the edit control has been updated with the right text
hr = XuiGetBaseObject(pThis->m_hObj, &hBaseObj);
XUIMessage xuiMsg;
XUIMessageChar xuiMsgChar;
XuiMessageChar(&xuiMsg, &xuiMsgChar, pInputData->wch, pInputData->dwFlags,
pInputData->UserIndex);
// Send the XM_CHAR message.
XuiSendMessage(hBaseObj, &xuiMsg);
rfHandled = TRUE;
SendNotifyValueChanged((int)pInputData->wch);
return hr;
}
HRESULT CXuiCtrl4JEdit::OnKeyDown(XUIMessageInput* pInputData,
BOOL& rfHandled) {
CXuiCtrl4JEdit* pThis;
HRESULT hr = XuiObjectFromHandle(m_hObj, (void**)&pThis);
if (FAILED(hr)) return hr;
ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
// HRESULT hr = S_OK;
if (pThis->m_bReadOnly) return hr;
// Find the text limit. (Add one for NULL terminator)
// m_uTextLimit = std::min( XuiEditGetTextLimit(m_hObj) + 1,
// XUI_4JEDIT_MAX_CHARS);
if ((((pInputData->dwKeyCode == VK_PAD_A) && (pInputData->wch == 0)) ||
(pInputData->dwKeyCode == VK_PAD_START)) &&
!(pInputData->dwFlags & XUI_INPUT_FLAG_REPEAT)) {
pThis->RequestKeyboard(pInputData->UserIndex);
rfHandled = TRUE;
}
return hr;
}
void CXuiCtrl4JEdit::RequestKeyboard(int iPad) {
InputManager.RequestKeyboard(m_uiTitle, GetText(), m_uiText, iPad, wchText,
m_uTextLimit + 1,
&CXuiCtrl4JEdit::KeyboardReturned, this,
m_eKeyboardMode, app.GetStringTable());
}
//-----------------------------------------------------------------------------
HRESULT CXuiCtrl4JEdit::SendNotifyValueChanged(int iValue) {
CXuiCtrl4JEdit* pThis;
HRESULT hr = XuiObjectFromHandle(m_hObj, (void**)&pThis);
if (FAILED(hr)) return hr;
HXUIOBJ hParent;
// HRESULT hr=S_OK;
XUIMessage msg;
XUINotify msgNotify;
XUINotifyValueChanged msgNotifyValueChanged;
XuiElementGetParent(pThis->m_hObj, &hParent);
XuiNotifyValueChanged(&msg, &msgNotify, &msgNotifyValueChanged,
XuiGetOuter(pThis->m_hObj), iValue);
XuiBubbleMessage(XuiGetOuter(hParent), &msg);
return hr;
}
int CXuiCtrl4JEdit::KeyboardReturned(void* pParam, bool bSet) {
CXuiCtrl4JEdit* pClass = (CXuiCtrl4JEdit*)pParam;
HRESULT hr = S_OK;
if (bSet) {
pClass->SetText(pClass->wchText);
// need to move the caret to the end of the newly set text
XuiEditSetCaretPosition(pClass->m_hObj,
(int)wcsnlen(pClass->wchText, 50));
pClass->SendNotifyValueChanged(10); // 10 for a return
}
return hr;
}