mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
399 lines
11 KiB
399 lines
11 KiB
#include "precomp.h"
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* Windows Cardfile - Written by Mark Cliggett */
|
|
/* (c) Copyright Microsoft Corp. 1985, 1994 - All Rights Reserved */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
#if defined(WIN32)
|
|
LPTSTR ReverseScan(LPTSTR lpSource, LPTSTR lpLast, LPTSTR lpSearch, BOOL fCaseSensitive )
|
|
{
|
|
int iLen = lstrlen(lpSearch);
|
|
|
|
if( !lpLast )
|
|
lpLast = lpSource + lstrlen(lpSource);
|
|
|
|
do
|
|
{
|
|
if( lpLast == lpSource )
|
|
return NULL;
|
|
|
|
--lpLast;
|
|
if( fCaseSensitive )
|
|
{
|
|
if( *lpLast != *lpSearch )
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if (CharUpper ((LPTSTR)MAKELONG((WORD)*lpLast, 0)) != CharUpper ((LPTSTR)MAKELONG((WORD)*lpSearch, 0)))
|
|
continue;
|
|
}
|
|
|
|
if( fCaseSensitive )
|
|
{
|
|
if( !_tcsncmp( lpLast, lpSearch, iLen ) )
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if( !_tcsnicmp( lpLast, lpSearch, iLen ) )
|
|
break;
|
|
}
|
|
|
|
} while( TRUE );
|
|
|
|
return lpLast;
|
|
}
|
|
|
|
LPTSTR ForwardScan(LPTSTR lpSource, LPTSTR lpSearch, BOOL fCaseSensitive )
|
|
{
|
|
int iLen = lstrlen(lpSearch);
|
|
|
|
while( *lpSource )
|
|
{
|
|
if( fCaseSensitive )
|
|
{
|
|
if( *lpSource != *lpSearch )
|
|
{
|
|
lpSource++;
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (CharUpper ((LPTSTR)MAKELONG((WORD)*lpSource, 0)) != CharUpper ((LPTSTR)MAKELONG((WORD)*lpSearch, 0)))
|
|
{
|
|
lpSource++;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if( fCaseSensitive )
|
|
{
|
|
if( !_tcsncmp( lpSource, lpSearch, iLen ) )
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if( !_tcsnicmp( lpSource, lpSearch, iLen ) )
|
|
break;
|
|
}
|
|
|
|
lpSource++;
|
|
}
|
|
|
|
return *lpSource ? lpSource : NULL;
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* Forward Search for szSearch
|
|
*
|
|
* Start search from the current selection or cursor if it is a new string.
|
|
* Start from one char after the beginning of the current selection if we are
|
|
* repeating a search.
|
|
* If not found, search continues through the text in the consecutive cards.
|
|
* If still not found, search continues from the beginning of the text in the
|
|
* current card. If still not found, then report failure.
|
|
*/
|
|
void ForwardSearch(
|
|
void)
|
|
{
|
|
int i, index, iCard = iFirstCard;
|
|
int SelStart, SelEnd;
|
|
TCHAR *pStart;
|
|
WORD Len;
|
|
TCHAR cHold, buf[160];
|
|
TCHAR *pMatch, *pLast;
|
|
CARDHEADER CardHead;
|
|
CARD Card;
|
|
LPCARDHEADER Cards;
|
|
HCURSOR hOldCursor;
|
|
DWORD Sel;
|
|
|
|
hOldCursor = SetCursor(hWaitCurs); /* Putup the Hour glass cursor */
|
|
GetWindowText(hEditWnd, szText, CARDTEXTSIZE);
|
|
/* Get current selection */
|
|
Sel = SendMessage(hEditWnd, EM_GETSEL, 0, 0L);
|
|
SelStart = LOWORD(Sel);
|
|
SelEnd = HIWORD(Sel);
|
|
/* if we are repeating a search and there exists a current selection
|
|
* start from one char after the beginning of the selection. */
|
|
if (fRepeatSearch && SelStart != SelEnd)
|
|
pStart = szText + SelStart + 1;
|
|
else /* not repeating a search or no selection exists */
|
|
pStart = szText + SelStart;
|
|
|
|
#if !defined(WIN32)
|
|
pMatch = (fCase ? StrStr(pStart, szSearch):
|
|
StrStrI(pStart, szSearch));
|
|
#else
|
|
pMatch = ForwardScan( pStart, szSearch, fCase );
|
|
#endif
|
|
|
|
if (pMatch)
|
|
goto FS_DONE;
|
|
|
|
/* Continue search through the text in the consecutive cards. */
|
|
Cards = (LPCARDHEADER) GlobalLock(hCards);
|
|
for (i = 0, iCard = iFirstCard+1; i < cCards-1; i++, iCard++)
|
|
{
|
|
if (iCard >= cCards)
|
|
iCard = 0;
|
|
CardHead = Cards[iCard];
|
|
|
|
/* Stupidly and blindly, ReadCurCardData always
|
|
* creates the object after it reads it. This
|
|
* is unnecessary.
|
|
*/
|
|
ReadCurCardData(&CardHead, &Card, szText);
|
|
if (Card.lpObject)
|
|
PicDelete(&Card);
|
|
|
|
#if !defined(WIN32)
|
|
pMatch = (fCase ? StrStr(szText, szSearch):
|
|
StrStrI(szText, szSearch));
|
|
#else
|
|
pMatch = ForwardScan( szText, szSearch, fCase );
|
|
#endif
|
|
|
|
if (pMatch)
|
|
{
|
|
GlobalUnlock(hCards);
|
|
goto FS_DONE;
|
|
}
|
|
}
|
|
|
|
GlobalUnlock(hCards);
|
|
/* szText has been destroyed, reget the window text */
|
|
iCard = iFirstCard;
|
|
GetWindowText(hEditWnd, szText, CARDTEXTSIZE);
|
|
|
|
/* Continue search from beginning of the text in the current card. */
|
|
|
|
/* Null terminate the string at the last character included in the search */
|
|
pLast = szText + SelStart + lstrlen(szSearch);
|
|
if (fRepeatSearch && SelStart != SelEnd)
|
|
pLast--;
|
|
Len = lstrlen(szText);
|
|
if ((pLast - szText) > Len) /* beyond end of buffer? */
|
|
pLast = szText + Len;
|
|
cHold = *pLast; /* remember this char */
|
|
*pLast = 0; /* replace with NUL */
|
|
|
|
#if !defined(WIN32)
|
|
pMatch = (fCase ? StrStr(szText, szSearch):
|
|
#else
|
|
pMatch = ForwardScan( szText, szSearch, fCase );
|
|
#endif
|
|
|
|
*pLast = cHold; /* restore the char */
|
|
|
|
FS_DONE:
|
|
SetCursor(hOldCursor); /* Restore the old cursor */
|
|
if (pMatch)
|
|
{
|
|
if (iCard != iFirstCard &&
|
|
!ScrollCards(hCardWnd, SB_THUMBPOSITION, iCard))
|
|
{
|
|
MessageBox(hIndexWnd, NotEnoughMem, szCardfile, MB_OK | MB_ICONHAND | MB_SYSTEMMODAL);
|
|
return;
|
|
}
|
|
index = pMatch - szText;
|
|
#if defined(WIN32)
|
|
SendMessage(hEditWnd, EM_SETSEL, (WPARAM)index, (DWORD)(index+lstrlen(szSearch)) );
|
|
#else
|
|
SendMessage(hEditWnd, EM_SETSEL, 0, MAKELONG(index, index+lstrlen(szSearch)));
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
wsprintf(buf, TEXT("\"%s\""), szSearch);
|
|
if( hDlgFind )
|
|
EnableWindow(hDlgFind, FALSE); /* Must disable since it's modeless */
|
|
BuildAndDisplayMsg(ECANTFIND, buf);
|
|
if( hDlgFind )
|
|
{
|
|
EnableWindow(hDlgFind, TRUE);
|
|
SetFocus(hDlgFind);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* Reverse Search for szSearch
|
|
*
|
|
* Start search from start of the current selection if any in the edit control.
|
|
* If not found, search continues through the text in the preceding cards.
|
|
* If still not found, search continues from the end of the text in the
|
|
* current card till the current selection. If still not found,
|
|
* then report failure.
|
|
*/
|
|
void ReverseSearch(
|
|
void)
|
|
{
|
|
int i, index, iCard = iFirstCard;
|
|
int SelStart, SelEnd;
|
|
TCHAR *pStart, *pEnd;
|
|
TCHAR buf[160];
|
|
TCHAR *pMatch;
|
|
CARDHEADER CardHead;
|
|
CARD Card;
|
|
LPCARDHEADER Cards;
|
|
HCURSOR hOldCursor;
|
|
DWORD Sel;
|
|
|
|
hOldCursor = SetCursor(hWaitCurs); /* Putup the Hour glass cursor */
|
|
GetWindowText(hEditWnd, szText, CARDTEXTSIZE);
|
|
/* Get current selection */
|
|
Sel = SendMessage(hEditWnd, EM_GETSEL, 0, 0L);
|
|
SelStart = LOWORD(Sel);
|
|
SelEnd = HIWORD(Sel);
|
|
|
|
/* Compute last char position where we want the string to be found.
|
|
* This position won't be included in the search, so it will find the
|
|
* previous occurrence */
|
|
pEnd = szText + SelStart;
|
|
|
|
#if !defined(WIN32)
|
|
pMatch = (fCase ? StrRStr(szText, pEnd, szSearch):
|
|
StrRStrI(szText, pEnd, szSearch));
|
|
#else
|
|
pMatch = ReverseScan( szText, pEnd, szSearch, fCase );
|
|
#endif
|
|
|
|
if (pMatch)
|
|
goto FS_DONE;
|
|
|
|
/* Continue search through the text in the consecutive cards. */
|
|
Cards = (LPCARDHEADER) GlobalLock(hCards);
|
|
for (i = 0, iCard = iFirstCard-1; i < cCards-1; i++, iCard--)
|
|
{
|
|
if (iCard < 0)
|
|
iCard = cCards - 1;
|
|
CardHead = Cards[iCard];
|
|
|
|
/* Stupidly and blindly, ReadCurCardData always
|
|
* creates the object after it reads it. This
|
|
* is unnecessary.
|
|
*/
|
|
ReadCurCardData(&CardHead, &Card, szText);
|
|
if (Card.lpObject)
|
|
PicDelete(&Card);
|
|
pEnd = szText + lstrlen(szText);
|
|
|
|
#if !defined(WIN32)
|
|
pMatch = (fCase ? StrRStr(szText, pEnd, szSearch):
|
|
StrRStrI(szText, pEnd, szSearch));
|
|
#else
|
|
pMatch = ReverseScan( szText, pEnd, szSearch, fCase );
|
|
#endif
|
|
|
|
if (pMatch)
|
|
{
|
|
GlobalUnlock(hCards);
|
|
goto FS_DONE;
|
|
}
|
|
}
|
|
|
|
GlobalUnlock(hCards);
|
|
/* szText has been destroyed, reget the window text */
|
|
iCard = iFirstCard;
|
|
GetWindowText(hEditWnd, szText, CARDTEXTSIZE);
|
|
|
|
/* Continue search from end of the text in the current card, till the
|
|
* current selection */
|
|
pStart = szText + SelEnd - lstrlen(szSearch) + 1;
|
|
if (pStart < szText)
|
|
pStart = szText;
|
|
pEnd = szText + lstrlen(szText);
|
|
|
|
#if !defined(WIN32)
|
|
pMatch = (fCase ? StrRStr(pStart, pEnd, szSearch):
|
|
StrRStrI(pStart, pEnd, szSearch));
|
|
#else
|
|
pMatch = ReverseScan( pStart, pEnd, szSearch, fCase );
|
|
#endif
|
|
|
|
FS_DONE:
|
|
SetCursor(hOldCursor); /* Restore the old cursor */
|
|
if (pMatch)
|
|
{
|
|
if (iCard != iFirstCard &&
|
|
!ScrollCards(hCardWnd, SB_THUMBPOSITION, iCard))
|
|
{
|
|
MessageBox(hIndexWnd, NotEnoughMem, szCardfile, MB_OK | MB_ICONHAND | MB_SYSTEMMODAL);
|
|
return;
|
|
}
|
|
index = pMatch - szText;
|
|
#if defined( WIN32)
|
|
SendMessage(hEditWnd, EM_SETSEL, (WPARAM)index, (DWORD)(index+lstrlen(szSearch)) );
|
|
#else
|
|
SendMessage(hEditWnd, EM_SETSEL, 0, MAKELONG(index, index+lstrlen(szSearch)));
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
wsprintf(buf, TEXT("\"%s\""), szSearch);
|
|
/* in case of "F3" back search.
|
|
* When not to display "FindDialogBox" because cannot set focus
|
|
* 1992 March t-yoshio
|
|
*/
|
|
if( hDlgFind )
|
|
EnableWindow (hDlgFind, FALSE); /* Disable since it's modeless */
|
|
BuildAndDisplayMsg (ECANTFIND, buf);
|
|
if (hDlgFind)
|
|
{
|
|
EnableWindow (hDlgFind, TRUE);
|
|
SetFocus (hDlgFind);
|
|
}
|
|
}
|
|
}
|
|
|
|
void DoGoto(
|
|
TCHAR *pBuf)
|
|
{
|
|
int i;
|
|
int j;
|
|
LPCARDHEADER Cards;
|
|
int iNextFirst;
|
|
TCHAR buf[160];
|
|
|
|
Cards = (LPCARDHEADER) GlobalLock(hCards);
|
|
for (i = 1, j = iFirstCard+1; i <= cCards; i++, j++)
|
|
{
|
|
if (j >= cCards)
|
|
j = 0;
|
|
iNextFirst = i;
|
|
#if !defined(WIN32)
|
|
if (StrStrI(Cards[j].line, pBuf))
|
|
break;
|
|
#else
|
|
if (ForwardScan(Cards[j].line, pBuf, FALSE))
|
|
break;
|
|
#endif
|
|
}
|
|
GlobalUnlock(hCards);
|
|
|
|
if (i <= cCards) /* found it */
|
|
{
|
|
if (CardPhone == CCARDFILE)
|
|
ScrollCards(hCardWnd, SB_THUMBPOSITION, j);
|
|
else
|
|
SendMessage(hListWnd, LB_SETCURSEL, j, 0L);
|
|
iFirstCard = j;
|
|
}
|
|
else
|
|
{
|
|
wsprintf(buf, TEXT("\"%s\""), pBuf);
|
|
if( hDlgFind )
|
|
EnableWindow(hDlgFind, FALSE); /* Must disable since it's modeless */
|
|
BuildAndDisplayMsg(ECANTFIND, buf);
|
|
if( hDlgFind )
|
|
EnableWindow(hDlgFind, TRUE);
|
|
}
|
|
}
|