Files
FireAlarmCtrlCn/MyCode/Gui/EditML.cpp
2026-04-06 19:02:09 +08:00

345 lines
6.6 KiB
C++

#include "gType.h"
#include"GraphLow.h"
#include"EditML.h"
void TEditML::Init(int aX, int aY, int aW, int aH, int OwnerX, int OwnerY, u32 aBorderWidth, u32 aBorderColor)
{
unsigned short Left,Right,Top,Bottom, aBW;
aBW = aBorderWidth;
aBW = 2;
Bound.SetBySize(aX+OwnerX, aY+OwnerY, aW, aH);
OwnerLeftTop.x = OwnerX;
OwnerLeftTop.y = OwnerY;
Border.Width = aBW;
Border.Color = aBorderColor;
Left = Bound.Left + aBW;
Right = Bound.Right - aBW;
Top = Bound.Top + aBW;
Bottom = Bound.Bottom - aBW;
Content.Set(Left,Top,Right,Bottom);
Index = 0;
Color = clNearWhite;
TextColor = clNearBlack;
SelectedColor = clBlue;
SelectedTextColor = clNearWhite;
SetText("Edit xx", 24);
Enable = true;
FlickDominance = true;
FlickTick = 0;
Pst = -1;
MaxLen = 256;
LineSpacing = 4;
SetLineSpacing(LineSpacing);
}
void TEditML::SetLineSpacing(int aSpacing)
{
int aN, aS;
LineSpacing = aSpacing;
aN = Content.Width / 12;
aS = Content.Width % 12;
if(aS < 3){
OneLineTextCount = aN -1;
}else{
OneLineTextCount = aN;
}
LineNum = Content.Height /24;
}
void TEditML::SetText(char *p, int aFontSize)
{
Str.FromStr(p);
FontSize = aFontSize;
}
void TEditML::SetText(const char *p, int aFontSize)
{
Str.FromStr(p);
FontSize = aFontSize;
}
void TEditML::TextClear(void)
{
Str.Text[0]=0;
Str.Text[1]=0;
Pst = -1;
ReDraw();
}
void TEditML::SelfDraw(void)
{
if (Border.Width>0){
VertLineRender(Bound.Left, Bound.Top, Bound.Height-1, 0xFF808080);
HorizLineRender(Bound.Left, Bound.Top, Bound.Width-1, 0xFF808080);
VertLineRender(Bound.Left+1, Bound.Top+1, Bound.Height-2, 0xFF404040);
HorizLineRender(Bound.Left+1, Bound.Top+1, Bound.Width-2, 0xFF404040);
VertLineRender(Bound.Right-1, Bound.Top+1, Bound.Height-2, 0xFFD4D0C8);
HorizLineRender(Bound.Left+1, Bound.Bottom-1, Bound.Width-2, 0xFFD4D0C8);
VertLineRender(Bound.Right, Bound.Top, Bound.Height, 0xFFFFFFFF);
HorizLineRender(Bound.Left, Bound.Bottom, Bound.Width, 0xFFFFFFFF);
}
ReDraw();
}
void TEditML::ReDraw(void)
{
int i,x,y, xCnt, yCnt, Inx, cpPst;
unsigned int tClr, bClr;
TmpChar[0] = 0;
TmpChar[1] = 0;
TmpChar[2] = 0;
TmpChar[3] = 0;
if(Enable){
if(Selected){
bClr = SelectedColor;
tClr = SelectedTextColor;
}else{
bClr = Color;
tClr = TextColor;
}
}else{
bClr = clFrmFace;
tClr = clGray;
}
RectFillRender(Content.Left, Content.Top, Content.Right, Content.Bottom, bClr);
x = Content.Left + 2;
y = Content.Top + 1;
xCnt = 0;
yCnt = 0;
Inx = 0;
if(Pst == -1){
if(Enable && Selected && IsShowCursor)
VertLineRender(x , y, 24, tClr);
}
for(i=0; i<dMYLONGSTRING_LENGTH; i++){
if(Str.Text[Inx] != 0){
if( (Str.Text[Inx] & 0x80) == 0){
TmpChar[0] = Str.Text[Inx];
TmpChar[1] = 0;
TextRender_string24(x, y, tClr, TmpChar);
if( Inx == Pst){
if(Enable && Selected && IsShowCursor)
VertLineRender(x + 12 +1, y, 24, tClr);
}
x += 12;
xCnt++;
Inx++;
}else{
TmpChar[0] = Str.Text[Inx];
TmpChar[1] = Str.Text[Inx +1];
TmpChar[2] = 0;
TextRender_string24(x, y, tClr, TmpChar);
if( Inx == Pst){
if(Enable && Selected && IsShowCursor)
VertLineRender(x + 24 +1, y, 24, tClr);
}
x += 24;
xCnt +=2;
Inx +=2;
}
if( (Str.Text[Inx] & 0x80) == 0){
cpPst = OneLineTextCount;
}else{
cpPst = OneLineTextCount -1;
}
if(xCnt >= cpPst){
xCnt = 0;
yCnt++;
x = Content.Left + 2;
y = y + LineSpacing + 24;
if(yCnt >= LineNum)break;
}
if(Inx >= (dMYLONGSTRING_LENGTH -1))break;
}
}
}
void TEditML::SetSelect(void)
{
Selected = 1;
ReDraw();
}
void TEditML::SetDeSelect(void)
{
Selected = 0;
FlickDominance = true;
FlickTick = 0;
Pst = Str.GetEndPst();
ReDraw();
}
void TEditML::Show(void)
{
SelfDraw();
}
void TEditML::KeyIn(unsigned char aKey)
{
int aEp, aLen;
switch(aKey){
case VK_DELETE:
aEp = Str.Delete(Pst);
Pst -= aEp;
if(Pst < -1)Pst =-1;
break;
case VK_LEFT:
if(Pst > 0){
if( (Str.Text[Pst] & 0x80) == 0){
//this is AscII
Pst--;
}else{
Pst -=2;
}
}else
if(Pst >-1){
Pst--;
}
break;
case VK_RIGHT:
aEp = Str.GetEndPst();
if(Pst < (aEp-1)){
if( (Str.Text[Pst+1] & 0x80) == 0){
//this is AscII
Pst++;
}else{
Pst +=2;
}
}else
if(Pst<aEp){
Pst++;
}else{
Pst = aEp;
}
break;
}
if(InputMethod == EN){
if( (aKey >= VK_0) && (aKey <= VK_9) ){
if(aKey == VK_0)Str.Insert("0",Pst);
if(aKey == VK_1)Str.Insert("1",Pst);
if(aKey == VK_2)Str.Insert("2",Pst);
if(aKey == VK_3)Str.Insert("3",Pst);
if(aKey == VK_4)Str.Insert("4",Pst);
if(aKey == VK_5)Str.Insert("5",Pst);
if(aKey == VK_6)Str.Insert("6",Pst);
if(aKey == VK_7)Str.Insert("7",Pst);
if(aKey == VK_8)Str.Insert("8",Pst);
if(aKey == VK_9)Str.Insert("9",Pst);
Pst++;
}
if(aKey == ' '){Str.Insert(" ",Pst); Pst++;}
else if(aKey == '='){Str.Insert("=",Pst); Pst++;}
else if(aKey == 'Y'){Str.Insert("Y",Pst); Pst++;}
else if(aKey == '('){Str.Insert("(",Pst); Pst++;}
else if(aKey == ')'){Str.Insert(")",Pst); Pst++;}
else if(aKey == '-'){Str.Insert("-",Pst); Pst++;}
else if(aKey == '+'){Str.Insert("+",Pst); Pst++;}
else if(aKey == '&'){Str.Insert("&",Pst); Pst++;}
else if(aKey == 'S'){Str.Insert("S",Pst); Pst++;}
else if(aKey == '*'){Str.Insert("*",Pst); Pst++;}
else if(aKey == VK_DECIMAL){Str.Insert("*",Pst); Pst++;}
else if(aKey == VK_OEM_2){Str.Insert("#",Pst);Pst++;}
}else
if(InputMethod == CN){
}else{
InputMethod = EN;
}
Str.Text[MaxLen] = 0;
if(Pst >= MaxLen)Pst = MaxLen -1;
}
void TEditML::OnTime100mS(void)
{
FlickTick++;
if(FlickTick>4){
FlickTick = 0;
if(FlickDominance){
FlickDominance = false;
}else{
FlickDominance = true;
}
}
}
void TEditML::SetMaxLen(unsigned int aLen)
{
if(aLen > (dMYLONGSTRING_LENGTH-2)){
MaxLen = dMYLONGSTRING_LENGTH-2;
}else{
MaxLen = aLen;
}
}
void TEditML::SetInputMaskEn(void)
{
InputMethod = EN;
}
void TEditML::SetInputCN(void)
{
InputMethod = CN;
}
void TEditML::SetPstTail(void)
{
Pst = Str.GetEndPst();
}
char TEditML::GetLastChar()
{
int i;
char aChr = 0;
for(i=0; i<(dMYLONGSTRING_LENGTH-2); i++){
if(Str.Text[i] != 0){
aChr = Str.Text[i];
}else{
return aChr;
}
}
return ' ';
}
void TEditML::SetLastChar(char aChr)
{
int i, aPst;
aPst = 0;
for(i=0; i<(dMYLONGSTRING_LENGTH-2); i++){
if(Str.Text[i] != 0){
aPst = i;
}else{
if(aPst < (dMYLONGSTRING_LENGTH-2)){
Str.Text[aPst] = aChr;
Str.Text[aPst +1] = 0;
}else{
Str.Text[aPst] = 0;
}
}
}
}
char TEditML::GetCurrentChar()
{
return Str.Text[Pst];
}
void TEditML::SetCurrentChar(char aChr)
{
Str.Text[Pst] = aChr;
}