📄 m_mtext.c
字号:
//----------------------------------------------------------------------
// FileName : M_MText.c
// Project : SII_PHS
// Memo :
//----------------------------------------------------------------------
#ifdef PCVER
#include "assert.h"
#else
#include "skb.h"
#include "lcd.h"
#endif
#include "keydef.h"
#include "draw.h"
#include "typedef.h"
#include "m_data.h"
#include "m_mtext.h"
#include "m_index.h"
#include "keyEvent.h"
#define MAXWORDS 300
uchar MT_GvRamNo;
static uint ENDX, ENDY, LINELENGTH, LINENUM;
static uchar count = 0;
static uchar begin = 0;
static uint Text[MAXWORDS];
static uint pos = 0;
static uint offset = 0;
//======================================================================
// Function Name: void M_MTextInit()
// Purpose : Main Text Initialization
// Parameter : None
// Return : None
// Remarks : 正文初始化
// Change Log :
// Author Date Description
// John Wong 2004/2 SII-PHS
//======================================================================
void M_MTextInit()
{
ENDX = 112 / FONTWIDTH * FONTWIDTH;
ENDY = 128 / FONTHEIGHT * FONTHEIGHT;
LINELENGTH = ENDX / FONTWIDTH;
LINENUM = ENDY / FONTHEIGHT;
offset = (CODESTARTY - (ENDY - FONTHEIGHT * 2)) / 2 - 1;
MT_GvRamNo = MD_SetGvramArea(0, 0, ENDX, ENDY);
MD_SetCurGvramCousor(MT_GvRamNo, 0, 0);
}
//======================================================================
// Function Name: void MainText()
// Purpose : Main Text Editing
// Parameter : None
// Return : None
// Remarks : 正文编辑
// Change Log :
// Author Date Description
// John Wong 2004/2 SII-PHS
//======================================================================
void MainText()
{
short event = 0;
uchar key;
Point Pt;
Point * point = &Pt;
uint px, py;
uchar i;
UpdateText();
while(g_Thread)
{
key = GetKey(event);
switch(key)
{
case KEY_DOWN_ENT:
UpdateTextArea();
return;
//======================================================================
case KEY_DOWN_LEFT:
if (pos <= 0) break;
pos --;
MD_GetCurGvramCousor(MT_GvRamNo, point);
px = point->x;
py = point->y;
if ( px > 0 )
{
px -= FONTWIDTH;
MD_SetCurGvramCousor(MT_GvRamNo, px, py);
}
else if ( py > 0 )
{
px = ENDX - FONTWIDTH;
py = py - FONTHEIGHT;
MD_SetCurGvramCousor(MT_GvRamNo, px, py);
}
else
{
px = ENDX - FONTWIDTH;
py = 0;
MD_SetCurGvramCousor(MT_GvRamNo, px, py);
begin--;
}
UpdateText();
break;
//======================================================================
case KEY_DOWN_RIGHT:
if (pos >= count) break;
pos ++;
MD_GetCurGvramCousor(MT_GvRamNo, point);
px = point->x;
py = point->y;
if ( px < ENDX - FONTWIDTH)
{
px += FONTWIDTH;
MD_SetCurGvramCousor(MT_GvRamNo, px, py);
}
else if ( py < ENDY - FONTHEIGHT )
{
px = 0;
py += FONTHEIGHT;
MD_SetCurGvramCousor(MT_GvRamNo, px, py);
}
else
{
px = 0;
MD_SetCurGvramCousor(MT_GvRamNo, px, py);
begin++;
}
UpdateText();
break;
//======================================================================
case KEY_DOWN_UP:
if (pos < LINELENGTH) break;
pos -= LINELENGTH;
MD_GetCurGvramCousor(MT_GvRamNo, point);
px = point->x;
py = point->y;
if ( py > 0 )
{
py -= FONTHEIGHT;
MD_SetCurGvramCousor(MT_GvRamNo, px, py);
}
else
{
begin--;
}
UpdateText();
break;
//======================================================================
case KEY_DOWN_DOWN:
MD_GetCurGvramCousor(MT_GvRamNo, point);
px = point->x;
py = point->y;
if (pos + LINELENGTH <= count) //next line is not the end
{
pos += LINELENGTH;
if ( py < ENDY - FONTHEIGHT )
{
py += FONTHEIGHT;
MD_SetCurGvramCousor(MT_GvRamNo, px, py);
}
else
{
begin++;
}
}
else if (pos / LINELENGTH < count / LINELENGTH ) //next line is the end
{
pos = count;
if ( py < ENDY - FONTHEIGHT )
{
px = (pos%LINELENGTH) * FONTWIDTH ;
py += FONTHEIGHT;
MD_SetCurGvramCousor(MT_GvRamNo, px, py);
}
else
{
begin++;
px = (pos%LINELENGTH) * FONTWIDTH;
MD_SetCurGvramCousor(MT_GvRamNo, px, py);
}
}
else break;
UpdateText();
break;
//======================================================================
case KEY_DOWN_C:
if ( count <= 0)
{
MD_Clear (0, 0, ENDX, ENDY, MT_GvRamNo);
return;
}
MD_GetCurGvramCousor(MT_GvRamNo, point);
px = point->x;
py = point->y;
if (pos == count ) //at the end
{
pos --;
if ( px > 0 )
MD_SetCurGvramCousor(MT_GvRamNo, (uint)(px - FONTWIDTH), py);
else if ( py > 0 )
MD_SetCurGvramCousor(MT_GvRamNo, (uint)(ENDX - FONTWIDTH) , (uint)(py - FONTHEIGHT));
else
{
MD_SetCurGvramCousor(MT_GvRamNo, (uint)(ENDX - FONTWIDTH) ,0 );
begin--;
}
}
else
{
for (i = 0; pos + i + 1 < count ;i++)
Text[pos + i] = Text[pos + i + 1];
}
Text[--count ] = 0;
UpdateText();
break;
default:
//#ifdef PCVER
// assert(0);
//#endif
break;
}
#ifdef PCVER
UpdateGvram();
#endif
}
}
//======================================================================
// Function Name: void DrawOnetext(uint ulTextNo)
// Purpose : Add or Insert a New Char
// Parameter : uint ulTextNo
// Return : None
// Remarks : 追加或插入一个字
// Change Log :
// Author Date Description
// John Wong 2004/2 SII-PHS
//======================================================================
void DrawOnetext(uint ulTextNo)
{
uint px,py,i;
Point Pt;
Point * point = &Pt;
if (count >= MAXWORDS) return;
#ifdef PCVER
ulTextNo = (ulTextNo >> 8) | (ulTextNo << 8); //reverse
#endif
if (pos < count ) //not at the end
{
for (i = count; i > pos ;i--)
Text[i] = Text[i - 1];
}
Text[pos] = ulTextNo;
count ++;
pos ++;
MD_GetCurGvramCousor(MT_GvRamNo, point);
px = point->x;
py = point->y;
if ( px < ENDX - FONTWIDTH)
{
px += FONTWIDTH;
MD_SetCurGvramCousor(MT_GvRamNo, px, py);
}
else if ( py < ENDY - FONTHEIGHT )
{
py += FONTHEIGHT;
MD_SetCurGvramCousor(MT_GvRamNo, 0 , py);
}
else
{
begin++;
MD_SetCurGvramCousor(MT_GvRamNo, 0 , py);
}
UpdateTextArea();
}
//======================================================================
// Function Name: void UpdateText()
// Purpose : Update the Main Text Screen While Editing
// Parameter : None
// Return : None
// Remarks : 刷新屏幕(编辑状态下)
// Change Log :
// Author Date Description
// John Wong 2004/2 SII-PHS
//======================================================================
static void UpdateText()
{
uchar i;
Point pt;
Point * point = &pt;
uint px,py;
#ifndef PCVER
Lcdfreeze(1);
#endif
MD_GetCurGvramCousor(MT_GvRamNo, point);
px = point->x;
py = point->y;
MD_Clear (0, 0, ENDX, ENDY, MT_GvRamNo);
for (i = 0; i < LINENUM; i++)
{
MD_SetCurGvramCousor(MT_GvRamNo, 0, (uint)(i * FONTHEIGHT) );
if ((begin + i + 1) * LINELENGTH <= count)
MD_UnicTextVLine(Text + (begin + i) * LINELENGTH , MT_GvRamNo, (uchar)LINELENGTH);
else if ((begin + i) * LINELENGTH <= count)
MD_UnicTextVLine(Text + (begin + i) * LINELENGTH , MT_GvRamNo,(uchar)(count % LINELENGTH));
}
MD_Reverse ( px , py , (uint)(px + FONTWIDTH ), (uint)(py + FONTHEIGHT), MT_GvRamNo);
MD_SetCurGvramCousor(MT_GvRamNo, px , py);
#ifdef PCVER
UpdateGvram();
#endif
#ifndef PCVER
Lcdfreeze(0);
#endif
}
//======================================================================
// Function Name: void UpdateTextArea()
// Purpose : Update the Main Text Screen While Drawing
// Parameter : None
// Return : None
// Remarks : 刷新屏幕(输入状态下)
// Change Log :
// Author Date Description
// John Wong 2004/2 SII-PHS
//======================================================================
void UpdateTextArea()
{
Point pt;
Point * point = &pt;
uint px,py;
uchar i;
#ifndef PCVER
Lcdfreeze(1);
#endif
MD_GetCurGvramCousor(MT_GvRamNo, point);
px = point->x;
py = point->y;
if (py == ENDY - 2 * FONTHEIGHT)
{
begin ++;
py -= FONTHEIGHT;
MD_SetCurGvramCousor(MT_GvRamNo,px,py );
}
else if (py == ENDY - FONTHEIGHT)
{
begin += 2;
py -= 2 * FONTHEIGHT;
MD_SetCurGvramCousor(MT_GvRamNo,px,py );
}
MD_Clear (0, 0, ENDX, ENDY, MT_GvRamNo);
for (i = 0; i < LINENUM - 2 ; i++)
{
MD_SetCurGvramCousor(MT_GvRamNo, 0, (uint)(i * FONTHEIGHT + offset ));
if ((begin + i + 1) * LINELENGTH <= count)
MD_UnicTextVLine(Text + (begin + i) * LINELENGTH , MT_GvRamNo,(uchar)LINELENGTH);
else if ((begin + i) * LINELENGTH <= count)
MD_UnicTextVLine(Text + (begin + i) * LINELENGTH , MT_GvRamNo,(uchar)(count % LINELENGTH));
}
MD_Reverse ( px , (uint)(py + offset) , (uint)(px + FONTWIDTH ), (uint)(py + FONTHEIGHT + offset) , MT_GvRamNo);
MD_SetCurGvramCousor(MT_GvRamNo, px , py );
#ifdef PCVER
UpdateGvram();
#endif
#ifndef PCVER
Lcdfreeze(0);
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -