556 lines
18 KiB
C++
556 lines
18 KiB
C++
/**
|
|
@file JSWindowEditBox.cpp
|
|
@brief
|
|
@author James
|
|
@version 1.0
|
|
@date 2017_11_28
|
|
*/
|
|
|
|
#include "JSWindowEditBox.h"
|
|
#include "../JSInterface/JSInterface.h"
|
|
#include "util/Log.h"
|
|
#include "util/JCColor.h"
|
|
#include "util/JCMemorySurvey.h"
|
|
#include <CommCtrl.h>
|
|
|
|
namespace laya
|
|
{
|
|
static unsigned int ToWinColor(const char* color)
|
|
{
|
|
static JCColorInt iCol;
|
|
JCColor::getColorRGBIntFromString(color, iCol);
|
|
unsigned int ret = ((iCol.r) | (iCol.g << 8) | (iCol.b << 16));
|
|
return ret;
|
|
}
|
|
|
|
static unsigned int ToWinColor(const std::string& color)
|
|
{
|
|
return ToWinColor(color.c_str());
|
|
}
|
|
|
|
#define MEM_EDITBOX_RENDER_COMMAND_SIZE 65536
|
|
|
|
WinEditBox* JSWindowEditBox::ms_EditBoxInst = nullptr;
|
|
|
|
|
|
ADDJSCLSINFO(JSWindowEditBox, JSObjNode);
|
|
//------------------------------------------------------------------------------
|
|
JSWindowEditBox::JSWindowEditBox()
|
|
{
|
|
m_nLeft = 0;
|
|
m_nTop = 0;
|
|
m_nWidth = 0;
|
|
m_nHeight = 0;
|
|
m_fOpacity = 1;
|
|
m_nMaxLength = -1;
|
|
m_sType = "text";
|
|
m_sRegular = "";
|
|
m_sStyle = "";
|
|
m_sValue = "";
|
|
m_sBgColor = "#ffffff";
|
|
m_sBoarderColor = "#00ff00";
|
|
m_nCaretColor = 0xff000000;
|
|
m_bVisible = false;
|
|
m_bFocus = false;
|
|
m_sFont = "normal 100 16px Arial";
|
|
m_nFontSize = 16;
|
|
m_sFontColor = "#000000";
|
|
m_nLastTextWidth = 0;
|
|
m_bCaretOn = false;
|
|
m_bMouseDrag = false;
|
|
m_nCaret = 0;
|
|
m_nCaretLast = 0;
|
|
m_nSelStart = 0;
|
|
m_nCaretPos = 0;
|
|
m_nCaretStart = 0;
|
|
m_nCaretEnd = 0;
|
|
m_bForbidEdit = false;
|
|
//AdjustAmountOfExternalAllocatedMemory( 540 + 65536 );
|
|
JCMemorySurvey::GetInstance()->newClass("WindowEditBox", 540 + 65536, this);
|
|
|
|
m_CallbackRef.reset(new int(1));
|
|
|
|
if (!ms_EditBoxInst)
|
|
{
|
|
ms_EditBoxInst = new WinEditBox;
|
|
}
|
|
|
|
ms_EditBoxInst->Retain();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
JSWindowEditBox::~JSWindowEditBox()
|
|
{
|
|
if (m_bFocus)
|
|
{
|
|
ms_EditBoxInst->SetFocus(false);
|
|
}
|
|
if (ms_EditBoxInst->Release())
|
|
{
|
|
ms_EditBoxInst = nullptr;
|
|
}
|
|
|
|
JCMemorySurvey::GetInstance()->releaseClass("WindowEditBox", this);
|
|
}
|
|
void JSWindowEditBox::addEventListener(const char* p_sName, JSValueAsParam p_pFunction)
|
|
{
|
|
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setFontSize(int p_nFontSize)
|
|
{
|
|
m_nFontSize = p_nFontSize;
|
|
char sBuffer[1024] = { 0 };
|
|
sprintf(sBuffer, "normal 100 %dpx Arial", m_nFontSize);
|
|
m_sFont = sBuffer;
|
|
ms_EditBoxInst->GetStyle().SetFontSize(m_nFontSize);
|
|
//focus();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
int JSWindowEditBox::set_Left(int p_nLeft)
|
|
{
|
|
m_nLeft = p_nLeft;
|
|
ms_EditBoxInst->GetStyle().SetLeft(m_nLeft);
|
|
return m_nLeft;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
int JSWindowEditBox::get_Left()
|
|
{
|
|
return m_nLeft;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
int JSWindowEditBox::set_Top(int p_nTop)
|
|
{
|
|
m_nTop = p_nTop;
|
|
ms_EditBoxInst->GetStyle().SetTop(m_nTop);
|
|
return m_nTop;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
int JSWindowEditBox::get_Top()
|
|
{
|
|
return m_nTop;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
int JSWindowEditBox::set_Width(int p_nWidth)
|
|
{
|
|
m_nWidth = p_nWidth;
|
|
ms_EditBoxInst->GetStyle().SetWidth(m_nWidth);
|
|
return m_nWidth;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
int JSWindowEditBox::get_Width()
|
|
{
|
|
return m_nWidth;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
int JSWindowEditBox::set_Height(int p_nHeight)
|
|
{
|
|
m_nHeight = p_nHeight;
|
|
ms_EditBoxInst->GetStyle().SetHeight(m_nHeight);
|
|
return m_nHeight;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
int JSWindowEditBox::get_Height()
|
|
{
|
|
return m_nHeight;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
float JSWindowEditBox::set_Opacity(float p_Opacity)
|
|
{
|
|
m_fOpacity = p_Opacity;
|
|
return m_fOpacity;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
float JSWindowEditBox::get_Opacity()
|
|
{
|
|
return m_fOpacity;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
const char* JSWindowEditBox::set_Value(const char* p_sValue)
|
|
{
|
|
//m_sValue = (p_sValue != NULL) ? p_sValue : "";
|
|
//m_vValue.clear();
|
|
//m_nCaret = m_nSelStart = 0;
|
|
//if (p_sValue != NULL)
|
|
//{
|
|
// int pLength = strlen(p_sValue);
|
|
// m_nCaret = m_nSelStart = pLength;
|
|
// const char* pUTF8 = p_sValue;
|
|
// for (int i = 0; i < pLength; i++)
|
|
// {
|
|
// int ucode;
|
|
// int l = UTF8ToUnicode((unsigned char*)pUTF8, &ucode);
|
|
// pUTF8 += l;
|
|
// if (ucode == 0)
|
|
// {
|
|
// break;
|
|
// }
|
|
// m_vValue.push_back(ucode);
|
|
// }
|
|
//}
|
|
ms_EditBoxInst->SetText(p_sValue);
|
|
m_sValue = ms_EditBoxInst->GetText();
|
|
return m_sValue.c_str();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
const char* JSWindowEditBox::get_Value()
|
|
{
|
|
// setValue(ms_EditBoxInst->GetText());
|
|
|
|
//m_sValue = "";
|
|
//for (int i = 0; i < (int)m_vValue.size(); i++)
|
|
//{
|
|
// char pTemp[10] = {};
|
|
// char* pCharEnd = UnicodeToUTF8(m_vValue[i], pTemp);
|
|
// m_sValue.append(pTemp);
|
|
//}
|
|
setValue(ms_EditBoxInst->GetText());
|
|
return m_sValue.c_str();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
const char* JSWindowEditBox::set_Style(const char* p_sStyle)
|
|
{
|
|
if (p_sStyle == NULL)
|
|
m_sStyle = "";
|
|
else
|
|
m_sStyle = p_sStyle;
|
|
return m_sStyle.c_str();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
const char* JSWindowEditBox::get_Style()
|
|
{
|
|
return m_sStyle.c_str();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
bool JSWindowEditBox::set_Visible(bool p_bVisible)
|
|
{
|
|
m_bVisible = p_bVisible;
|
|
return m_bVisible;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
bool JSWindowEditBox::get_Visible()
|
|
{
|
|
return m_bVisible;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setLeft(int p_nLeft)
|
|
{
|
|
set_Left(p_nLeft);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setTop(int p_nTop)
|
|
{
|
|
set_Top(p_nTop);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setWidth(int p_nWidth)
|
|
{
|
|
set_Width(p_nWidth);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setHeight(int p_nHeight)
|
|
{
|
|
set_Height(p_nHeight);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setOpacity(float p_Opacity)
|
|
{
|
|
set_Opacity(p_Opacity);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setValue(const char* p_sValue)
|
|
{
|
|
if (p_sValue == NULL)
|
|
set_Value("");
|
|
else
|
|
set_Value(p_sValue);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
const char* JSWindowEditBox::getValue()
|
|
{
|
|
return get_Value();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setStyle(const char* p_sStyle)
|
|
{
|
|
set_Style(p_sStyle);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setFont(const char* p_sFont)
|
|
{
|
|
m_sFont = p_sFont;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//并不是每帧都调,只有内容发生改变了,才会调用。包括光标位置改变
|
|
void JSWindowEditBox::drawEditboxAll()
|
|
{
|
|
if (m_bVisible == false)
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
//绘制底色和边框
|
|
//m_pNode->bgcolor( m_sBgColor.c_str() );
|
|
//m_pNode->border( m_sBoarderColor.c_str() );
|
|
|
|
////绘制文字和选中的
|
|
//drawText();
|
|
////drawSelected();
|
|
//ResetCaretBlink();
|
|
|
|
ms_EditBoxInst->SetFocus(true);
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setVisible(bool p_bVisible)
|
|
{
|
|
// if( m_bVisible == p_bVisible )return;
|
|
m_bVisible = p_bVisible;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::DeleteSelectionText()
|
|
{
|
|
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::CopyToClipboard()
|
|
{
|
|
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::PasteFromClipboard()
|
|
{
|
|
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::PlaceCaret(int nCP)
|
|
{
|
|
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//只有鼠标按下的时候才会调用。
|
|
bool JSWindowEditBox::handleMouseEvent(int p_nMouseX, int p_nMouseY)
|
|
{
|
|
return false;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
void JSWindowEditBox::mouseMove(int p_MouseX, int p_MouseY)
|
|
{
|
|
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::drawSelected()
|
|
{
|
|
|
|
}
|
|
|
|
void JSWindowEditBox::onInputCallJSFunction(std::weak_ptr<int> callbackref)
|
|
{
|
|
if (!callbackref.lock())
|
|
return;
|
|
m_pJSFunctionOnInput.Call();
|
|
}
|
|
|
|
void JSWindowEditBox::onKeyDownCallJSFunction(int keyCode, std::weak_ptr<int> callbackref)
|
|
{
|
|
if (!callbackref.lock())
|
|
return;
|
|
m_pJSFunctionOnKeydown.Call(keyCode);
|
|
}
|
|
|
|
void JSWindowEditBox::setSelectionRange(int start, int end)
|
|
{
|
|
setCursorPosition(start);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
bool JSWindowEditBox::onKeyChar(short p_sBuffer)
|
|
{
|
|
return true;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::onDeleteCharB()
|
|
{
|
|
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//delete 。这里没有更新 m_nCaretEnd 的值,因为drawText的时候会重新计算
|
|
//调用者在调用这个后,会再调用drawText
|
|
void JSWindowEditBox::onDeleteCharD()
|
|
{
|
|
//m_nLastTextWidth -= measureText( getLpChar(m_nCaret) );
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::drawText()
|
|
{
|
|
|
|
}
|
|
//-------------------------------------------------------------------------------
|
|
//光标右移一个字
|
|
void JSWindowEditBox::caretMoveRight()
|
|
{
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::caretMoveToEnd()
|
|
{
|
|
|
|
}
|
|
//-------------------------------------------------------------------------------
|
|
int JSWindowEditBox::measureText(const char* p_sText)
|
|
{
|
|
return 0;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
char* JSWindowEditBox::getLpChar(int index)
|
|
{
|
|
return 0;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::focus()
|
|
{
|
|
m_bFocus = true;
|
|
m_bVisible = true;
|
|
drawEditboxAll();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::blur()
|
|
{
|
|
setVisible(false);
|
|
m_bFocus = false;
|
|
m_bCaretOn = false;
|
|
m_bMouseDrag = false;
|
|
|
|
ms_EditBoxInst->SetFocus(false);
|
|
setValue(ms_EditBoxInst->GetText());
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
//显示光标
|
|
void JSWindowEditBox::ResetCaretBlink()
|
|
{
|
|
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setColor(const char* p_sColor)
|
|
{
|
|
m_sFontColor = p_sColor;
|
|
m_nCaret = 0;
|
|
m_nSelStart = m_nCaret;
|
|
m_bMouseDrag = false;
|
|
|
|
ms_EditBoxInst->GetStyle().SetFontColor(ToWinColor(m_sFontColor));
|
|
|
|
//focus();//单机两次是因为先处理的单机事件然后再赋值(应该反过来),因此应该在赋值以后应该调用focus响应,相当于单击事件的延续
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setBgColor(const char* p_sBgColor)
|
|
{
|
|
m_sBgColor = p_sBgColor;
|
|
ms_EditBoxInst->GetStyle().SetBgColor(ToWinColor(m_sBgColor));
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setPos(int x, int y)
|
|
{
|
|
m_nLeft = x;
|
|
m_nTop = y;
|
|
|
|
ms_EditBoxInst->GetStyle().SetLeft(m_nLeft);
|
|
ms_EditBoxInst->GetStyle().SetTop(m_nTop);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setSize(int w, int h)
|
|
{
|
|
m_nWidth = w;
|
|
m_nHeight = h;
|
|
|
|
ms_EditBoxInst->GetStyle().SetWidth(m_nWidth);
|
|
ms_EditBoxInst->GetStyle().SetHeight(m_nHeight);
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setCursorPosition(int pos)
|
|
{
|
|
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setScale(float p_nSx, float p_nSy)
|
|
{
|
|
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setMaxLength(int p_nMaxLength)
|
|
{
|
|
m_nMaxLength = p_nMaxLength;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setType(const char* p_sType)
|
|
{
|
|
m_sType = p_sType;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setRegular(const char* p_sRegular)
|
|
{
|
|
m_sRegular = p_sRegular;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::setNumberOnly(bool p_bNumberOnly)
|
|
{
|
|
|
|
}
|
|
void JSWindowEditBox::setMultiAble(bool p_bMultiAble)
|
|
{
|
|
ms_EditBoxInst->SetMutiLine(p_bMultiAble);
|
|
}
|
|
void JSWindowEditBox::setForbidEdit(bool bForbidEdit)
|
|
{
|
|
m_bForbidEdit = bForbidEdit;
|
|
}
|
|
bool JSWindowEditBox::getForbidEdit()
|
|
{
|
|
return m_bForbidEdit;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
void JSWindowEditBox::exportJS()
|
|
{
|
|
JSP_CLASS("ConchInput", JSWindowEditBox);
|
|
JSP_ADD_PROPERTY(left, JSWindowEditBox, get_Left, set_Left);
|
|
JSP_ADD_PROPERTY(top, JSWindowEditBox, get_Top, set_Top);
|
|
JSP_ADD_PROPERTY(width, JSWindowEditBox, get_Width, set_Width);
|
|
JSP_ADD_PROPERTY(height, JSWindowEditBox, get_Height, set_Height);
|
|
JSP_ADD_PROPERTY(opacity, JSWindowEditBox, get_Opacity, set_Opacity);
|
|
JSP_ADD_PROPERTY(style, JSWindowEditBox, get_Style, set_Style);
|
|
JSP_ADD_PROPERTY(value, JSWindowEditBox, get_Value, set_Value);
|
|
JSP_ADD_PROPERTY(visible, JSWindowEditBox, get_Visible, set_Visible);
|
|
JSP_ADD_METHOD("addEventListener", JSWindowEditBox::addEventListener);
|
|
JSP_ADD_METHOD("setLeft", JSWindowEditBox::setLeft);
|
|
JSP_ADD_METHOD("setTop", JSWindowEditBox::setTop);
|
|
JSP_ADD_METHOD("setWidth", JSWindowEditBox::setWidth);
|
|
JSP_ADD_METHOD("setHeight", JSWindowEditBox::setHeight);
|
|
JSP_ADD_METHOD("setOpacity", JSWindowEditBox::setOpacity);
|
|
JSP_ADD_METHOD("setValue", JSWindowEditBox::setValue);
|
|
JSP_ADD_METHOD("getValue", JSWindowEditBox::getValue);
|
|
JSP_ADD_METHOD("setStyle", JSWindowEditBox::setStyle);
|
|
JSP_ADD_METHOD("setVisible", JSWindowEditBox::setVisible);
|
|
JSP_ADD_METHOD("focus", JSWindowEditBox::focus);
|
|
JSP_ADD_METHOD("blur", JSWindowEditBox::blur);
|
|
JSP_ADD_METHOD("setColor", JSWindowEditBox::setColor);
|
|
JSP_ADD_METHOD("setBgColor", JSWindowEditBox::setBgColor);
|
|
JSP_ADD_METHOD("setFontSize", JSWindowEditBox::setFontSize);
|
|
JSP_ADD_METHOD("setPos", JSWindowEditBox::setPos);
|
|
JSP_ADD_METHOD("setSize", JSWindowEditBox::setSize);
|
|
JSP_ADD_METHOD("setCursorPosition", JSWindowEditBox::setCursorPosition);
|
|
JSP_ADD_METHOD("setScale", JSWindowEditBox::setScale);
|
|
JSP_ADD_METHOD("setMaxLength", JSWindowEditBox::setMaxLength);
|
|
JSP_ADD_METHOD("setType", JSWindowEditBox::setType);
|
|
JSP_ADD_METHOD("setNumberOnly", JSWindowEditBox::setNumberOnly);
|
|
JSP_ADD_METHOD("setRegular", JSWindowEditBox::setRegular);
|
|
JSP_ADD_METHOD("setFont", JSWindowEditBox::setFont);
|
|
JSP_ADD_METHOD("setMultiAble", JSWindowEditBox::setMultiAble);
|
|
JSP_ADD_METHOD("setForbidEdit", JSWindowEditBox::setForbidEdit);
|
|
JSP_ADD_METHOD("getForbidEdit", JSWindowEditBox::getForbidEdit);
|
|
JSP_INSTALL_CLASS("ConchInput", JSWindowEditBox);
|
|
}
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
//-----------------------------END FILE--------------------------------
|