📄 mfw_edt.c
字号:
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) $Workfile:: mfw_edt.c $|
| $Author:: Es $ CONDAT GmbH $Revision:: 15 $|
| CREATED: 21.09.98 $Modtime:: 23.03.00 8:57 $|
| STATE : code |
+--------------------------------------------------------------------+
MODULE : MFW_EDT
PURPOSE : edit handling functions
EXPORT :
TO DO :
$History:: mfw_edt.c $
*
* ***************** Version 15 *****************
* User: Es Date: 23.03.00 Time: 14:40
* Updated in $/GSM/Condat/MS/SRC/MFW
* added edtUnhide()
*
* ***************** Version 14 *****************
* User: Kk Date: 21.02.00 Time: 9:36
* Updated in $/GSM/Condat/MS/SRC/MFW
* changes from es inserted
*
* ***************** Version 13 *****************
* User: Es Date: 18.02.00 Time: 15:45
* Updated in $/GSM/Condat/MS/SRC/MFW
* added edit controls: ecTop, ecBottom
|
| ***************** Version 12 *****************
| User: Le Date: 6.01.00 Time: 9:23
| Updated in $/GSM/Condat/MS/SRC/MFW
| Alignment of MFW versions
*
* ***************** Version 3 *****************
* User: Kk Date: 13.12.99 Time: 17:30
* Updated in $/GSM/Condat/SND-MMI/MFW
*
* ***************** Version 2 *****************
* User: Es Date: 22.11.99 Time: 10:29
* Updated in $/GSM/Condat/SND-MMI/MFW
*
* ***************** Version 1 *****************
* User: Es Date: 18.11.99 Time: 16:35
* Created in $/GSM/Condat/SND-MMI/MFW
* Initial
*
* ***************** Version 11 *****************
* User: Es Date: 6.07.99 Time: 12:18
* Updated in $/GSM/DEV/MS/SRC/MFW
*
* ***************** Version 10 *****************
* User: Es Date: 14.04.99 Time: 17:34
* Updated in $/GSM/DEV/MS/SRC/MFW
* moved to CST
|
| ***************** Version 9 *****************
| User: Le Date: 14.04.99 Time: 9:51
| Updated in $/GSM/DEV/MS/SRC/MFW
*
* ***************** Version 8 *****************
* User: Es Date: 1.04.99 Time: 17:07
* Updated in $/GSM/DEV/MS/SRC/MFW
* removed lots of traces
*
* ***************** Version 7 *****************
* User: Es Date: 18.02.99 Time: 17:01
* Updated in $/GSM/DEV/MS/SRC/MFW
*
* ***************** Version 6 *****************
* User: Es Date: 17.02.99 Time: 19:10
* Updated in $/GSM/DEV/MS/SRC/MFW
*
* ***************** Version 5 *****************
* User: Es Date: 8.02.99 Time: 19:06
* Updated in $/GSM/DEV/MS/SRC/MFW
* Cursor auf 0 !
*
* ***************** Version 4 *****************
* User: Es Date: 27.01.99 Time: 15:06
* Updated in $/GSM/DEV/MS/SRC/MFW
*
* ***************** Version 3 *****************
* User: Es Date: 14.01.99 Time: 17:19
* Updated in $/GSM/DEV/MS/SRC/MFW
*
* ***************** Version 2 *****************
* User: Es Date: 23.12.98 Time: 16:19
* Updated in $/GSM/DEV/MS/SRC/MFW
*/
#if defined (NEW_FRAME)
#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"
#else
#include "stddefs.h"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"
#endif
#include <stdio.h>
#include <string.h>
#include "mfw_mfw.h"
#include "mfw_sys.h"
#include "gdi.h"
#include "dspl.h"
#include "mfw_edt.h"
#include "font_bitmaps.h"
#include "mfw_mmi.h"
#define TIME_TRACE_EVENT TRACE_EVENT
#ifndef TIME_TRACE_EVENT
#define TIME_TRACE_EVENT
#endif
static int edtInsert (int c, char *b, int s, U8 curMode, U16 curCP);
static int edtCommand (U32 cmd, void *h);
void moveLeft (char * str, int ofs);
static void edtUnicodeSplitLine (int px, int py, int ls, int ly, U16 *tp);
static void moveLeftUnicode(U16 *unicodeStr, int nChars);
static int edtInsertUnicode (MfwEdt *e, int c, U16 *b, int s);
U16 strlenUnicode(U16* str);
static void edtOutTextLines (int px, int py, int ls, int ly, U16 *tpUnicode, unsigned char* tpAscii,
int fontHeight, int display);
MfwRes updateWindow (MfwEdt *e, int dy );
int isAWordChar( char chr);
//Define the chars that correspond to the end of a word.
#define STR_WORDBREAK " .?!"
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EDT |
| STATE : code ROUTINE : edtInit |
+--------------------------------------------------------------------+
PURPOSE : initialize edit handler
*/
MfwRes edtInit (void)
{
mfwCommand[MfwTypEdt] = (MfwCb) edtCommand;
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EDT |
| STATE : code ROUTINE : edtExit |
+--------------------------------------------------------------------+
PURPOSE : finalize edit handler
*/
MfwRes edtExit (void)
{
mfwCommand[MfwTypEdt] = 0;
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EDT |
| STATE : code ROUTINE : edtCreate |
+--------------------------------------------------------------------+
PURPOSE : create editor control
*/
MfwHnd edtCreate (MfwHnd w, MfwEdtAttr *a, MfwEvt e, MfwCb f)
{
MfwHdr *hdr = (MfwHdr *) mfwAlloc(sizeof(MfwHdr));
MfwEdt *edt = (MfwEdt *) mfwAlloc(sizeof(MfwEdt));
MfwHdr *insert_status =0;
TRACE_FUNCTION("edtCreate");
if (!hdr || !edt)
{
TRACE_ERROR("ERROR: edtCreate() Mem Alloc Failed.");
if(hdr)
mfwFree((U8*)hdr,sizeof(MfwHdr));
if(edt)
mfwFree((U8*)edt,sizeof(MfwEdt));
return 0;
}
edt->mask = e;
edt->flags = 0;
edt->handler = f;
edt->attr = a;
edt->cp = 0; /* cursor position */
edt->curOffs = 0;
hdr->data = edt;
hdr->type = MfwTypEdt;
edtUpdate(edt);
insert_status = mfwInsert(w,hdr);
if(!insert_status)
{
TRACE_ERROR("ERROR: edtCreate() Failed to Install Handler. ");
mfwFree((U8*)hdr,sizeof(MfwHdr));
mfwFree((U8*)edt,sizeof(MfwEdt));
return 0;
}
return insert_status;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EDT |
| STATE : code ROUTINE : edtDelete |
+--------------------------------------------------------------------+
PURPOSE : delete editor control
*/
MfwRes edtDelete (MfwHnd e)
{
MfwRes res;
if (!e)
return MfwResIllHnd;
edtHide(e); /* hide editor contents */
res = (mfwRemove(e)) ? MfwResOk : MfwResIllHnd;
mfwFree(((MfwHdr *) e)->data,sizeof(MfwEdt));
mfwFree(e,sizeof(MfwHdr));
return res;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EDT |
| STATE : code ROUTINE : edtReset |
+--------------------------------------------------------------------+
PURPOSE : reset editor control
*/
MfwRes edtReset (MfwHnd w)
{
MfwEdt *e;
TRACE_FUNCTION("edtReset()");
if (!w)
return MfwResIllHnd; /* editor does not exist */
e = ((MfwHdr *) w)->data;
if (!e)
return MfwResIllHnd; /* editor does not exist */
e->cp = 0; /* cursor position */
e->curOffs = 0;
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EDT |
| STATE : code ROUTINE : edtShow |
+--------------------------------------------------------------------+
PURPOSE : show editor
*/
MfwRes edtShow (MfwHnd e)
{
MfwEdt *edt;
TRACE_FUNCTION("edtShow()");
if (!e)
return MfwResIllHnd; /* editor does not exist */
edt = ((MfwHdr *) e)->data; /* get control block */
edt->flags |= MfwEdtVisible; /* editor is visible */
if (edt->handler) /* call event handler */
if (edt->mask & MfwEdtVisible)
edt->handler(MfwEdtVisible,edt);
edt->display = 1; /* really show it */
edtUpdate(edt); /* draw editor elements */
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EDT |
| STATE : code ROUTINE : edtHide |
+--------------------------------------------------------------------+
PURPOSE : hide editor
*/
MfwRes edtHide (MfwHnd e)
{
MfwEdt *edt;
TRACE_FUNCTION("edtHide()");
if (!e)
return MfwResIllHnd; /* element does not exist */
edt = ((MfwHdr *) e)->data; /* get edit control block */
edt->flags &= ~MfwEdtVisible; /* editor is not visible */
if (edt->handler) /* call event handler */
if (edt->mask & MfwEdtVisible)
edt->handler(MfwEdtVisible,edt);
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EDT |
| STATE : code ROUTINE : edtUnhide |
+--------------------------------------------------------------------+
PURPOSE : unhide editor (without drawing)
*/
MfwRes edtUnhide (MfwHnd e)
{
MfwEdt *edt;
TRACE_FUNCTION("edtunhide()");
if (!e)
return MfwResIllHnd; /* element does not exist */
edt = ((MfwHdr *) e)->data; /* get edit control block */
edt->flags |= MfwEdtVisible; /* editor is visible */
if (edt->handler) /* call event handler */
if (edt->mask & MfwEdtVisible)
edt->handler(MfwEdtVisible,edt);
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EDT |
| STATE : code ROUTINE : edtClear |
+--------------------------------------------------------------------+
PURPOSE : clear editor
*/
MfwRes edtClear (MfwHnd e)
{
MfwEdt *edt;
TRACE_FUNCTION("edtClear()");
if (!e)
return MfwResIllHnd; /* element does not exist */
edt = ((MfwHdr *) e)->data; /* get edit control block */
if (edtReset(e) && edt->attr->text)
{
*(edt->attr->text) = 0; /* clear buffer */
edtUpdate(edt); /* clear edit area */
}
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_EDT |
| STATE : code ROUTINE : edtUpdate |
+--------------------------------------------------------------------+
PURPOSE : draw editor
GW 06/09/01 - Call chinese update if first char is 0x80,0x81 or 0x82.
GW 06/09/01 - Added extra parameters to displ_setCursorPos for the size of cursor.
*/
//Return non-zero result if chr is in the string str.
int chrInString(char chr,char* str)
{
int i;
i=0;
TRACE_FUNCTION("chrInString()");
while (str[i] != 0x00)
{
if (str[i]== chr)
return (i+1);
else
i++;
}
//Not found -
return (0);
}
//GW 18/09/01 Use 'isAWordChar' procedure instead of 'chrInString'
void findWordBounds(MfwEdt *e, int *opStChr, int *opEndChr)
{
int found;
int stChr,endChr;
TRACE_FUNCTION("findWordBounds()");
//Find char before start of the word.
stChr = e->cp-1;
found = FALSE;
while ((stChr >0) && (!found))
{
if (isAWordChar(e->attr->text[stChr])==0)
found = TRUE;
else
stChr--;
}
//find char after end of the word.
endChr = e->cp;
found = FALSE;
while ((e->attr->text[endChr]!=0x00 ) && (!found))
{
if (isAWordChar(e->attr->text[endChr])==0)
found = TRUE;
else
endChr++;
}
*opStChr = stChr;
*opEndChr = endChr;
}
//GW 18/09/01 Commented out debug code.
MfwRes edtUpdate (MfwEdt *e)
{
UBYTE temp;
char *tp;
S16 px, py; /* top left corner of edit */
S16 ls; /* width of edit window */
S16 ly; /* bottom of edit window */
U8 oldFont = -1; /* store previous font */
char* endChar;
unsigned char *tb;
//Data used to add word highlight
char saveChr[2];
char startHtext[2] = {0x01,0x00};
char endHtext[2] = {0x02,0x00};
int stChr,endChr;
U16* tmp;
TRACE_FUNCTION("edtUpdate()")
if (!e)
return MfwResIllHnd;
if (!e->attr->text)
return MfwResErr; /* no text to display */
//Have we still got keys in the buffer to process? - process them first!
if (mfwKey_skipDisplay())
return (MfwResOk);
tb = (unsigned char*)e->attr->text;
if ((tb[0] == 0x80) || (tb[0] == 0x81) || (tb[0] == 0x82))
{
return( edtUpdateUnicode (e ) );
}
temp = dspl_get_char_type();
dspl_set_char_type(DSPL_TYPE_ASCII);
//TRACE_EVENT_P1("flags: %d", e->flags);
if (!(e->flags & MfwEdtVisible))
e->display = 0; /* invisible editor */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -