|
|
/*************************************************
* lcfunc.c * * * * Copyright (C) 1995-1999 Microsoft Inc. * * * *************************************************/
//
// Change Log:
//
// @D01 Fix Bug #11204 Goto function with save text will error
// @D02 Fix Bug None Only check modify status for available lines 10/04
//
// Change log by Eric
//
// @E01 Fix Bug use "Delete line" doesn't enable "Save" and "Save As"
//
#include <windows.h> // required for all Windows applications
#include <windowsx.h>
#include <stdlib.h>
#include <memory.h>
#include "rc.h"
#include "lctool.h"
#ifndef UNICODE
#define lWordBuff iWordBuff
#define lPhraseBuff iPhraseBuff
#define lNext_Seg iNext_Seg
#define lFirst_Seg iFirst_Seg
#endif
extern HWND subhWnd;
TCHAR szEditStr[MAX_PATH]; WORD wOldID=IDE_WORD_START;
// Local function prototypes.
INT_PTR FAR PASCAL GotoDialogProc(HWND, UINT, WPARAM, LPARAM); INT_PTR FAR PASCAL SearchDialogProc(HWND, UINT, WPARAM, LPARAM);
BOOL lcKey( HWND hwnd, WPARAM wParam, USHORT uKeyState) {
switch (wParam) { case VK_UP: lcUp_key(hwnd); break;
case VK_DOWN: lcDown_key(hwnd); break;
case VK_PRIOR : lcPgUp_key(hwnd); break;
case VK_NEXT : lcPgDown_key(hwnd); break;
case VK_HOME : if(uKeyState != (USHORT)CTRL_STATE) return FALSE; iDisp_Top=0; yPos=0; SetFocus(hwndWord[0]); lcSetEditText(0, TRUE); break;
case VK_END : if(uKeyState != (USHORT)CTRL_STATE) return FALSE; if(lWordBuff <= iPage_line) { SetFocus(hwndWord[lWordBuff-1]); } else { iDisp_Top=lWordBuff-iPage_line; yPos=lWordBuff; lcSetEditText(iDisp_Top, TRUE); SetFocus(hwndWord[iPage_line-1]); } break;
default: return FALSE;
} PostMessage(hwndMain, WM_COMMAND, IDM_VSCROLL, 0); return TRUE; }
BOOL lcTab_key( HWND hwnd) { UINT iEdit; BOOL is_WORD;
iEdit=lcGetEditFocus(hwnd, &is_WORD); if(is_WORD) { SetFocus(hwndPhrase[iEdit]); } else { iEdit++; if(iEdit == iPage_line) iEdit=0; SetFocus(hwndWord[iEdit]); }
return TRUE; }
void lcUp_key( HWND hwnd) { UINT iEdit; BOOL is_WORD;
iEdit=lcGetEditFocus(hwnd, &is_WORD); if(iEdit == 0) { if(iDisp_Top != 0) { iDisp_Top--; if(!lcSetEditText(iDisp_Top, TRUE)) { iDisp_Top++; return; } yPos--; } else MessageBeep(MB_OK); return; } iEdit--; if(is_WORD) { SetFocus(hwndWord[iEdit]); }else { SetFocus(hwndPhrase[iEdit]); } yPos--; }
void lcDown_key( HWND hwnd) { UINT iEdit; BOOL is_WORD;
iEdit=lcGetEditFocus(hwnd, &is_WORD); if((iEdit+1) == iPage_line) { if((iDisp_Top+iPage_line) < lWordBuff) { iDisp_Top++; if(!lcSetEditText(iDisp_Top, TRUE)) { iDisp_Top--; return; } yPos++; } else MessageBeep(MB_OK); return; } iEdit++; if(is_WORD) { SetFocus(hwndWord[iEdit]); }else { SetFocus(hwndPhrase[iEdit]); } yPos++; }
void lcPgUp_key( HWND hwnd) { UINT iEdit,iDisp_temp; BOOL is_WORD;
if(iDisp_Top == 0) { iEdit=lcGetEditFocus(hwnd, &is_WORD); if(iEdit != 0) { if(is_WORD) { SetFocus(hwndWord[0]); }else { SetFocus(hwndPhrase[0]); } yPos=0; } else MessageBeep(MB_OK); return; } yPos-=iPage_line; if(yPos < 0) yPos=0; if(iDisp_Top < iPage_line) { iDisp_temp=0; iEdit=lcGetEditFocus(hwnd, &is_WORD); if(is_WORD) { SetFocus(hwndWord[yPos]); }else { SetFocus(hwndPhrase[yPos]); } } else iDisp_temp=iDisp_Top-iPage_line; if(lcSetEditText(iDisp_temp, TRUE)) iDisp_Top=iDisp_temp; }
void lcPgDown_key( HWND hwnd) { UINT iEdit,iDisp_temp; BOOL is_WORD;
if(lWordBuff < iPage_line) { MessageBeep(MB_OK); return; } if((iDisp_Top+iPage_line) == lWordBuff) { iEdit=lcGetEditFocus(hwnd, &is_WORD); if((iEdit+1) != iPage_line) { if(is_WORD) { SetFocus(hwndWord[iPage_line-1]); }else { SetFocus(hwndPhrase[iPage_line-1]); } yPos=lWordBuff-iPage_line; } else MessageBeep(MB_OK); return; }
yPos+=iPage_line; if((UINT)yPos > (lWordBuff-iPage_line)) yPos=lWordBuff-iPage_line;
if((iDisp_Top+(iPage_line*2)) < lWordBuff) iDisp_temp=iDisp_Top+iPage_line; else { iDisp_temp=lWordBuff-iPage_line; iEdit=lcGetEditFocus(hwnd, &is_WORD); if(is_WORD) { SetFocus(hwndWord[yPos+(iPage_line*2)-lWordBuff-1]); }else { SetFocus(hwndPhrase[yPos+(iPage_line*2)-lWordBuff-1]); } } if(lcSetEditText(iDisp_temp, TRUE)) iDisp_Top=iDisp_temp; }
void lcGoto( HWND hwnd) { UINT iDiff,iDisp_save; int is_OK;
if(!lcSaveEditText(iDisp_Top, 0)) return;
iDisp_save=iDisp_Top;
is_OK=(int)DialogBox(hInst, _TEXT("GotoDialog"), hwndMain, (DLGPROC)GotoDialogProc);
// Check cancel by user
if(!is_OK) { SetFocus(hwndFocus); return; } if(iDisp_Top > (lWordBuff-iPage_line)) { iDiff=iDisp_Top-lWordBuff+iPage_line; iDisp_Top=lWordBuff-iPage_line; SetFocus(hwndWord[iDiff]); } else SetFocus(hwndWord[0]); if(!lcSetEditText(iDisp_Top, FALSE)) iDisp_Top=iDisp_save; yPos=iDisp_Top;
}
INT_PTR FAR PASCAL GotoDialogProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { TCHAR szWordstr[MAX_PATH]; TCHAR szShowMsg[MAX_PATH]; WORD wWord; UINT i;
switch (message) { case WM_INITDIALOG:
szWordstr[0]=0; //set to be null
return TRUE;
case WM_COMMAND:
switch (wParam) {
case IDOK: case IDB_OK:
GetDlgItemText(hDlg,IDD_INDEX_NAME,szWordstr, sizeof(szWordstr)/sizeof(TCHAR) ); #ifdef UNICODE
wWord=szWordstr[0]; #else
wWord=(szWordstr[0] << 8)+szWordstr[1]; #endif
for(i=0; i<lWordBuff; i++) if(wWord == lpWord[i].wWord) break; if(i == lWordBuff) { LoadString(hInst, IDS_ERR_NOT_FOUND, szShowMsg, sizeof(szShowMsg)/sizeof(TCHAR)); MessageBox(hDlg, szShowMsg, NULL, MB_OK | MB_ICONEXCLAMATION); return TRUE; } iDisp_Top=i;
EndDialog (hDlg, TRUE) ;
return TRUE;
case IDB_CANCEL: case IDCANCEL: EndDialog (hDlg, FALSE) ; return TRUE; case IDD_INDEX_NAME: return TRUE; } break ;
case WM_CLOSE: EndDialog(hDlg, FALSE); return TRUE; } return FALSE; }
UINT lcGetEditFocus( HWND hwnd, BOOL *is_WORD) { UINT i;
for(i=0; i<iPage_line; i++) if(hwnd == hwndWord[i]) { *is_WORD= TRUE; return i; }
for(i=0; i<iPage_line; i++) if(hwnd == hwndPhrase[i]) { *is_WORD= FALSE; return i; }
// In case focus not in EDIT CONTROL, set to WORD 0
*is_WORD=TRUE; return 0; }
void lcErrMsg( UINT iMsgID) { TCHAR szErrStr[MAX_PATH]; static fShown=FALSE;
if ( fShown==TRUE ) return;
fShown=TRUE; LoadString(hInst, iMsgID, szErrStr, sizeof(szErrStr)/sizeof(TCHAR)); MessageBox(hwndMain, szErrStr, NULL, MB_OK | MB_ICONEXCLAMATION); fShown=FALSE; }
BOOL lcSetEditText( UINT iTopAddr, BOOL bSaveText) { static UINT iWord=1; TCHAR szStr[MAX_CHAR_NUM+1]; UINT i,j;
if(bSaveText) if(!lcSaveEditText(iWord, 0)) return FALSE; iWord=iTopAddr;
for(i=0; i<iPage_line; i++) { // Set Word string
if(iWord == lWordBuff) break;
#ifdef UNICODE
szStr[0]=(TCHAR) lpWord[iWord].wWord; szStr[1]=0; #else
szStr[0]=HIBYTE(lpWord[iWord].wWord); szStr[1]=LOBYTE(lpWord[iWord].wWord); szStr[2]=0; #endif
SendMessage(hwndWord[i], WM_SETTEXT, 0,(LPARAM) szStr);
// Set Phrase string
lcMem2Disp(iWord, szStr); SendMessage(hwndPhrase[i], WM_SETTEXT, 0,(LPARAM)szStr); iWord++; } iWord=iTopAddr;
// If Still have not in memory item set to null string
if(i != iPage_line) { szStr[0]=0; for(j=i; j<iPage_line; j++) { SendMessage(hwndWord[j], WM_SETTEXT, 0,(LPARAM)szStr); SendMessage(hwndPhrase[j], WM_SETTEXT, 0,(LPARAM)szStr); } }
return TRUE; }
BOOL lcSaveEditText( UINT iWord, UINT iSkip) { TCHAR szStr[MAX_CHAR_NUM]; UINT i,len,phraselen=0; UINT j;
//for(i=0; i<iPage_line; i++) {
for(i=0; i<min(iPage_line,lWordBuff); i++) { // @D02C
if(i+1 == iSkip) continue; // Get Word string
if(SendMessage(hwndWord[i], EM_GETMODIFY, 0, 0)) { bSaveFile=TRUE; SendMessage(hwndWord[i], WM_GETTEXT, 3, (LPARAM)szStr); if(lstrlen(szStr) == 0) { MessageBeep(MB_OK); SetFocus(hwndWord[i]); return FALSE; } if(!is_DBCS2(*((LPUNAWORD)(szStr)), TRUE)) { SetFocus(hwndWord[i]); return FALSE; } #ifdef UNICODE
lpWord[iWord+i].wWord=szStr[0]; #else
lpWord[iWord+i].wWord=(szStr[0] << 8)+szStr[1]; #endif
SendMessage(hwndWord[i], EM_SETMODIFY, FALSE, 0); //@D01A
}
// Get Phrase string
if(SendMessage(hwndPhrase[i], EM_GETMODIFY, 0, 0)) { bSaveFile=TRUE; SendMessage(hwndPhrase[i], WM_GETTEXT, MAX_CHAR_NUM-1, (LPARAM)szStr); len=lstrlen(szStr); if(len == 0) { MessageBeep(MB_OK); SetFocus(hwndPhrase[i]); return FALSE; } len++; //#53609 Limit phrase lenght to MAX_PHRASE_LEN.
for (j=0; j<len-1; j++) { phraselen++; if(szStr[j] ==TEXT(' ')) if (phraselen > MAX_PHRASE_LEN) { TCHAR szStr[128],szShowMsg[128]; LoadString(hInst, IDS_OVERPHRASELEN, szStr, sizeof(szStr)); wsprintf(szShowMsg, szStr, MAX_PHRASE_LEN); MessageBox(hwndMain,szShowMsg,NULL,MB_OK); SetFocus(hwndPhrase[i]); return FALSE; } else { phraselen = 0; continue; } }
// Check DBCS
#ifndef UNICODE
for(j=0; j<len-1; j++) { if(szStr[j] ==_TEXT(' ')) continue; if(!is_DBCS2(*((LPUNAWORD)(&szStr[j])), TRUE)) { SetFocus(hwndPhrase[i]); return FALSE; } j++; } #endif
if(!lcDisp2Mem(iWord+i, szStr)) return FALSE; SendMessage(hwndPhrase[i], EM_SETMODIFY, FALSE, 0); //@D01A
}
}
return TRUE; }
void lcDelLine( HWND hwnd) { UINT iEdit,i; BOOL is_WORD;
if(lWordBuff == 0) return; iEdit=lcGetEditFocus(GetFocus(), &is_WORD); if((iDisp_Top+iEdit) > lWordBuff) return; if(!lcSaveEditText(iDisp_Top, iEdit+1)) return; lcFreeSeg(lpWord[iDisp_Top+iEdit].lFirst_Seg); for(i=(iDisp_Top+iEdit); i < lWordBuff; i++) { lpWord[i].wWord=lpWord[i+1].wWord; lpWord[i].lFirst_Seg=lpWord[i+1].lFirst_Seg; } lWordBuff--; SetScrollRange(subhWnd, SB_VERT, 0, lWordBuff-iPage_line, TRUE);
// Check the last page
if(((iDisp_Top+iPage_line) >= lWordBuff) && (iDisp_Top != 0)) iDisp_Top--; lcSetEditText(iDisp_Top, FALSE); bSaveFile = TRUE; // <== @E01
}
void lcInsLine( HWND hwnd) { UINT iEdit,iFree,iWord; BOOL is_WORD; int i;
iEdit=lcGetEditFocus(GetFocus(), &is_WORD); iWord=iDisp_Top+iEdit; if(iWord > lWordBuff) iWord=lWordBuff; if(!lcSaveEditText(iDisp_Top, 0)) return; if(lWordBuff+1 == nWordBuffsize) if(!lcAllocWord()) return; iFree=lcGetSeg(); if(iFree == NULL_SEG) return; if(lWordBuff == 0) { lpWord[iWord].wWord=0; lpWord[iWord].lFirst_Seg=iFree; } else { for(i=(int)lWordBuff; i >= (int)iWord; i--) { lpWord[i+1].wWord=lpWord[i].wWord; lpWord[i+1].lFirst_Seg=lpWord[i].lFirst_Seg; } lpWord[iWord].wWord=0; lpWord[iWord].lFirst_Seg=iFree; } lWordBuff++;
lpPhrase[iFree].szPhrase[0]=0; lpPhrase[iFree].lNext_Seg=NULL_SEG; SetScrollRange(subhWnd, SB_VERT, 0, lWordBuff-iPage_line, TRUE); if((iEdit+1) == iPage_line) { iEdit--; iDisp_Top++; } lcSetEditText(iDisp_Top, FALSE); SendMessage(hwndWord[iEdit], EM_SETMODIFY, TRUE, 0); SendMessage(hwndPhrase[iEdit], EM_SETMODIFY, TRUE, 0);
}
int __cdecl lcComp( const void *Pointer1, const void *Pointer2) { LPWORDBUF lpWord1=(LPWORDBUF)Pointer1; LPWORDBUF lpWord2=(LPWORDBUF)Pointer2;
if(lpWord1->wWord == lpWord2->wWord) { wSameCode=lpWord1->wWord; return 0; } if(lpWord1->wWord > lpWord2->wWord) return 1; else return -1;
}
BOOL lcSort( HWND hwnd) {
if(!lcSaveEditText(iDisp_Top, 0)) return FALSE; wSameCode=0; qsort(lpWord, lWordBuff, sizeof(WORDBUF), lcComp); if(wSameCode) { TCHAR szStr[MAX_PATH]; TCHAR szErrStr[MAX_PATH];
LoadString(hInst, IDS_ERR_SAMECODE, szStr, sizeof(szStr)); #ifdef UNICODE
wsprintf(szErrStr, szStr, wSameCode, ' '); #else
wsprintf(szErrStr, szStr, HIBYTE(wSameCode), LOBYTE(wSameCode)); #endif
MessageBox(hwndMain, szErrStr, NULL, MB_OK | MB_ICONEXCLAMATION); } lcSetEditText(0, FALSE); yPos=0; SetScrollPos(subhWnd, SB_VERT, yPos, TRUE); iDisp_Top = 0; return TRUE; }
BOOL is_DBCS( WORD wWord, BOOL bMessage) { #ifdef UNICODE
#else
if((HIBYTE(wWord) < 0x81) || (HIBYTE(wWord) > 0xFE)) { if(bMessage) lcErrMsg(IDS_ERR_SBCS); return FALSE; } if((LOBYTE(wWord) < 0x40) || (LOBYTE(wWord) > 0xFE)) { if(bMessage) lcErrMsg(IDS_ERR_SBCS); return FALSE; } #endif
return TRUE; }
BOOL is_DBCS2( WORD wWord, BOOL bMessage) { #ifndef UNICODE
if((LOBYTE(wWord) < 0x81) || (LOBYTE(wWord) > 0xFE)) { if(bMessage) lcErrMsg(IDS_ERR_SBCS); return FALSE; } if((HIBYTE(wWord) < 0x40) || (HIBYTE(wWord) > 0xFE)) { if(bMessage) lcErrMsg(IDS_ERR_SBCS); return FALSE; } #endif
return TRUE; }
void lcEditFocusOn( WORD wID) { HWND hwnd; BOOL isWord; int iAddr; TCHAR szStr[MAX_CHAR_NUM]; UINT i,len; WORD wTemp;
if(wOldID != wID) { if(wOldID >= IDE_PHRASE_START) { isWord=FALSE; iAddr=wOldID-IDE_PHRASE_START; hwnd=hwndPhrase[iAddr]; } else { isWord=TRUE; iAddr=wOldID-IDE_WORD_START; hwnd=hwndWord[iAddr]; }
if(SendMessage(hwnd, EM_GETMODIFY, 0, 0)) { bSaveFile=TRUE; SendMessage(hwnd, WM_GETTEXT, MAX_CHAR_NUM-1, (LPARAM)szStr); len=lstrlen(szStr); if(len == 0) { wOldID=wID; return; } if(isWord) { #ifdef UNICODE
if(!is_DBCS2(szStr[0], FALSE)) return; wTemp=lpWord[iDisp_Top+iAddr].wWord=szStr[0]; #else
if(!is_DBCS2(*((WORD *)(szStr)), FALSE)) return; wTemp=(szStr[0] << 8)+szStr[1]; lpWord[iDisp_Top+iAddr].wWord=wTemp; #endif
for(i=0; i<lWordBuff; i++) { if(i == iDisp_Top+iAddr) continue; if(wTemp == lpWord[i].wWord) break; } if(i != lWordBuff) { lcErrMsg(IDS_ERR_INPUTSAME); SetFocus(hwnd); return; } } else { len++; // Check DBCS
for(i=0; i<len-1; i++) { if(szStr[i] ==_TEXT(' ')) continue; if(!is_DBCS2(*((LPUNAWORD)(&szStr[i])), TRUE)) { SetFocus(hwndPhrase[iAddr]); return; } i++; }
if(!lcDisp2Mem(iDisp_Top+iAddr, szStr)) return; } SendMessage(hwnd, EM_SETMODIFY, FALSE, 0); } if(wID >= IDE_PHRASE_START) { isWord=FALSE; iAddr=wID-IDE_PHRASE_START; } else { isWord=TRUE; iAddr=wID-IDE_WORD_START; } if((iAddr >= (int)iPage_line) || (iAddr < 0)) return; // Focus not in Edit Control
// Check out of legal buffer
if(iDisp_Top+iAddr >= lWordBuff) { MessageBeep(MB_OK); SetFocus(hwnd); return; } wOldID=wID; hwndFocus=isWord ? hwndWord[iAddr] : hwndPhrase[iAddr]; }
}
BOOL lcRemoveDup( TCHAR *szBuf ) { UINT len; UINT s; UINT i,cnt; TCHAR *szCurPos, *szStr; int unmatch; BOOL bModify=FALSE;
if ( szBuf == 0 ) return FALSE;
len = (UINT)lstrlen(szBuf); // remove trailing blanks
for ( ; len > 0 && szBuf[len-1] ==_TEXT(' '); szBuf[--len] = 0 );
// remove leading blanks
for ( s=0 ; s < len && szBuf[s] ==_TEXT(' '); s++ ); if ( s > 0 ) { #ifdef UNICODE
memcpy( &szBuf[0], &szBuf[s], (len-s)<<1 ); #else
memcpy( &szBuf[0], &szBuf[s], len-s ); #endif
len -= s; szBuf[len]=0; }
// return if len=0
if ( len == 0 ) return FALSE;
// search from the end of string and remove duplicate phrase
// s -> last char of target phrase
for ( i=0, s=len-1 ; s > 0 ; ) { // locate the range of current phrase
for ( cnt=1 ; s>0 && szBuf[s-1] !=_TEXT(' ') ; s--, cnt++ );
// s-> first char of target phrase
// break if start from first char in buf)
if (s==0) break;
// check if we found another occurrence before the target string
// match 1st char first, then match the rest of string
// do until a match or end of buf
for ( szStr=&szBuf[s], szCurPos=&szBuf[0], unmatch=1 ; szCurPos+cnt < szStr && (*szCurPos != *szStr || szCurPos[cnt] != _TEXT(' ') || #ifdef UNICODE
(unmatch=memcmp(szCurPos, szStr, cnt <<1))!=0) ; ) #else
(unmatch=memcmp(szCurPos, szStr, cnt))!=0) ; ) #endif
{ // skip this phrase
// skip non-blanks
while ( *szCurPos !=0 && *szCurPos != _TEXT(' ')) szCurPos++;
// skip blanks
while ( *szCurPos !=0 && *szCurPos == _TEXT(' ')) szCurPos++; }
// if found a string
if ( unmatch == 0 ) { // remove it and its trailing blanks
while (szBuf[s+cnt]==_TEXT(' ')) cnt++;
#ifdef UNICODE
memmove(&szBuf[s], &szBuf[s+cnt], (len-s-cnt+1)<<1); #else
memmove(&szBuf[s], &szBuf[s+cnt], len-s-cnt+1); #endif
len -= cnt; bModify=TRUE; }
// let s point to last byte of the previous string
// skip blanks
for ( s--; s>0 && (szBuf[s]==_TEXT(' ') || szBuf[s] ==0) ; s-- ) ; }
return bModify; }
BOOL lcDisp2Mem( UINT iAddr, TCHAR *szDispBuf) { LPPHRASEBUF Phrase; UINT i,j,len,iFree,iSave;
// remove duplicate phrase
if(lcRemoveDup(szDispBuf) && iAddr < MAX_LINE){ SendMessage(hwndPhrase[iAddr],WM_SETTEXT,0, (LPARAM)(LPCTSTR)szDispBuf); };
len=lstrlen(szDispBuf)+1; if((szDispBuf[len-1] == _TEXT(' ')) && (len > 1)) { szDispBuf[len-1]=0; len--; } if(len >= MAX_CHAR_NUM) { //tang must fix
szDispBuf[MAX_CHAR_NUM-1]=0; #ifndef UNICODE
if(is_DBCS_1st(szDispBuf, MAX_CHAR_NUM-2)) szDispBuf[MAX_CHAR_NUM-2]=' '; #endif
len=MAX_CHAR_NUM; } Phrase=&lpPhrase[lpWord[iAddr].lFirst_Seg]; iSave=lpWord[iAddr].lFirst_Seg; for(i=0; i<((len-1)/SEGMENT_SIZE); i++) { #ifdef UNICODE
CopyMemory(Phrase->szPhrase, &szDispBuf[i*SEGMENT_SIZE],SEGMENT_SIZE<< 1); #else
CopyMemory(Phrase->szPhrase, &szDispBuf[i*SEGMENT_SIZE],SEGMENT_SIZE); #endif
if(Phrase->lNext_Seg == NULL_SEG) { iFree=lcGetSeg(); if(iFree == NULL_SEG) return FALSE; Phrase=&lpPhrase[iSave]; Phrase->lNext_Seg=iFree; } iSave=Phrase->lNext_Seg; Phrase=&lpPhrase[Phrase->lNext_Seg]; } for(j=0; j<SEGMENT_SIZE; j++) { Phrase->szPhrase[j]=szDispBuf[i*SEGMENT_SIZE+j]; if(szDispBuf[i*SEGMENT_SIZE+j] == 0) break; } if(Phrase->lNext_Seg != NULL_SEG) lcFreeSeg(Phrase->lNext_Seg); Phrase->lNext_Seg=NULL_SEG;
return TRUE; }
UINT lcMem2Disp( UINT iAddr, TCHAR *szDispBuf) { LPPHRASEBUF Phrase; UINT i,len;
Phrase=&lpPhrase[lpWord[iAddr].lFirst_Seg]; for(i=0; Phrase->lNext_Seg != NULL_SEG; i+=SEGMENT_SIZE) { #ifdef UNICODE
CopyMemory(&szDispBuf[i], Phrase->szPhrase, SEGMENT_SIZE << 1); #else
CopyMemory(&szDispBuf[i], Phrase->szPhrase, SEGMENT_SIZE); #endif
Phrase=&lpPhrase[Phrase->lNext_Seg]; } szDispBuf[i] = 0; lstrcat(szDispBuf, Phrase->szPhrase); len=lstrlen(szDispBuf); if(szDispBuf[len] != _TEXT(' ')) { lstrcat(szDispBuf,_TEXT(" ")); len+=1; }
return len; }
extern TCHAR szPhrasestr[MAX_CHAR_NUM]; UINT nStartAddr = 0; UINT nStartPos = 0; void lcMoveEditWindowByWord(UINT nWords);
LONG lcSearchMem( TCHAR *szSearchBuf) { UINT iAddr; TCHAR szDispBuf[MAX_CHAR_NUM];
for (iAddr = nStartAddr; iAddr < lWordBuff; iAddr++) { lcMem2Disp(iAddr, szDispBuf); #ifdef UNICODE
if (wcsstr(szDispBuf, szSearchBuf) != NULL) { #else
if (strstr(szDispBuf, szSearchBuf) != NULL) { #endif
return (LONG) iAddr; } }
return -1; }
void lcSearch( HWND hwnd, BOOL bNext) { UINT iDiff,iDisp_save; TCHAR szBuf[MAX_CHAR_NUM], *lpStr; BOOL is_WORD; int is_OK; LONG i; TCHAR szShowMsg[MAX_PATH];
if(bNext && szPhrasestr[0] == 0) { MessageBeep(-1); return; }
if(!lcSaveEditText(iDisp_Top, 0)) return;
iDisp_save=iDisp_Top; nStartAddr=lcGetEditFocus(GetFocus(), &is_WORD) + iDisp_Top;
if (is_WORD) { nStartPos = 0; } else { SendMessage(hwndPhrase[nStartAddr - iDisp_Top],EM_GETSEL, 0, (LPARAM) (LPDWORD)&nStartPos); }
if (!bNext) {
is_OK=(int)DialogBox(hInst, _TEXT("SearchDialog"), hwndMain, (DLGPROC)SearchDialogProc);
// Check cancel by user
if(!is_OK) { SetFocus(hwndFocus); return; } }
SendMessage(hwndPhrase[nStartAddr - iDisp_Top], WM_GETTEXT, (WPARAM)MAX_CHAR_NUM-1, (LPARAM)szBuf); #ifdef UNICODE
lpStr = wcsstr(szBuf + nStartPos, szPhrasestr); #else
lpStr = strstr(szBuf + nStartPos, szPhrasestr); #endif
if (lpStr != NULL) { UINT nStart = (UINT)(lpStr - szBuf); UINT nEnd = nStart + lstrlen(szPhrasestr);
SetFocus(hwndPhrase[nStartAddr - iDisp_Top]); SendMessage(hwndPhrase[nStartAddr - iDisp_Top], EM_SETSEL, (WPARAM)nStart, (LPARAM)nEnd); lcMoveEditWindowByWord(nStart); return;
} else { nStartAddr++; }
if((i = lcSearchMem(szPhrasestr)) == -1) { LoadString(hInst, IDS_ERR_PHRASE_NOT_FOUND, szShowMsg, sizeof(szShowMsg)/sizeof(TCHAR)); MessageBox(hwnd, szShowMsg, NULL, MB_OK | MB_ICONEXCLAMATION);
SetFocus(hwndFocus); return ; } iDisp_Top=(UINT)i;
if(iDisp_Top > (lWordBuff-iPage_line)) { iDiff=iDisp_Top-lWordBuff+iPage_line; iDisp_Top=lWordBuff-iPage_line; SetFocus(hwndPhrase[iDiff]); } else { iDiff = 0; SetFocus(hwndPhrase[0]); }
if(!lcSetEditText(iDisp_Top, FALSE)) iDisp_Top=iDisp_save; yPos=iDisp_Top;
SendMessage(hwndPhrase[iDiff], WM_GETTEXT, (WPARAM)MAX_CHAR_NUM-1, (LPARAM)szBuf); #ifdef UNICODE
lpStr = wcsstr(szBuf, szPhrasestr); #else
lpStr = strstr(szBuf, szPhrasestr); #endif
if (lpStr != NULL) { UINT nStart = (UINT)(lpStr - szBuf); UINT nEnd = nStart + lstrlen(szPhrasestr);
SendMessage(hwndPhrase[iDiff], EM_SETSEL, (WPARAM)nStart, (LPARAM)nEnd); lcMoveEditWindowByWord(nStart);
}
}
INT_PTR FAR PASCAL SearchDialogProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) { case WM_INITDIALOG: szPhrasestr[0]=0; //set to be null
SetDlgItemText(hDlg,IDD_SEARCH_LINE,szPhrasestr); return TRUE;
case WM_COMMAND:
switch (wParam) {
case IDOK: case IDB_OK:
GetDlgItemText(hDlg,IDD_SEARCH_LINE,szPhrasestr, sizeof(szPhrasestr)/sizeof(TCHAR) ); EndDialog (hDlg, TRUE) ;
return TRUE;
case IDB_CANCEL: case IDCANCEL: EndDialog (hDlg, FALSE) ; return TRUE; case IDD_INDEX_NAME: return TRUE; } break ;
case WM_CLOSE: EndDialog(hDlg, FALSE); return TRUE; } return FALSE; }
|