📄 filemon.c
字号:
/******************************************************************************
*
* FUNCTION: CCHookProc
*
* PURPOSE: We use a hook procedure to force the stupid color
* selection dialog to do what we want, including preview
* the highlight text.
*
*****************************************************************************/
UINT CALLBACK CCHookProc( HWND hDlg,
UINT uiMsg, WPARAM wParam,
LPARAM lParam )
{
static HWND sample;
static DWORD newFg, newBg;
static UINT colorOkString, setRgbString;
switch( uiMsg ) {
case WM_INITDIALOG:
sample = GetDlgItem( hDlg, IDC_SAMPLE );
newFg = HighlightFg;
newBg = HighlightBg;
colorOkString = RegisterWindowMessage( COLOROKSTRING );
setRgbString = RegisterWindowMessage( SETRGBSTRING );
CheckRadioButton( hDlg, IDC_RADIOFG, IDC_RADIOBG, IDC_RADIOFG );
SendMessage(hDlg, setRgbString, 0, newFg);
SetFocus( GetDlgItem( hDlg, IDC_DONE ));
break;
case WM_CTLCOLORSTATIC:
if( (HWND) lParam == sample ) {
SetBkColor(GET_WM_CTLCOLOR_HDC(wParam, lParam, msg),
newBg);
SetTextColor(GET_WM_CTLCOLOR_HDC(wParam, lParam, msg),
newFg);
return (BOOL)GetStockObject(WHITE_BRUSH);
}
break;
case WM_COMMAND:
if( wParam == IDC_DONE ) {
HighlightFg = newFg;
HighlightBg = newBg;
PostMessage( hDlg, WM_COMMAND, IDABORT, 0 );
return FALSE;
}
break;
default:
if( uiMsg == colorOkString ) {
if( !IsDlgButtonChecked( hDlg, IDC_RADIOBG )) {
newFg = ((LPCHOOSECOLOR) lParam)->rgbResult;
InvalidateRect( sample, NULL, TRUE );
SendMessage(hDlg, setRgbString, 0, newBg);
return TRUE;
} else {
newBg = ((LPCHOOSECOLOR) lParam)->rgbResult;
InvalidateRect( sample, NULL, TRUE );
SendMessage(hDlg, setRgbString, 0, newFg);
return TRUE;
}
}
break;
}
return 0;
}
/******************************************************************************
*
* FUNCTION: SelectHighlightColors
*
* PURPOSE: Let's the user pick the highlight foreground and background
* colors.
*
*****************************************************************************/
VOID SelectHighlightColors( HWND hWnd )
{
DWORD dwColor;
DWORD dwCustClrs [16];
BOOL fSetColor = FALSE;
int i;
CHOOSECOLOR chsclr;
for (i = 0; i < 15; i++)
dwCustClrs [i] = RGB (255, 255, 255);
dwColor = RGB (0, 0, 0);
chsclr.lStructSize = sizeof (CHOOSECOLOR);
chsclr.hwndOwner = hWnd;
chsclr.hInstance = (HANDLE) hInst;
chsclr.rgbResult = dwColor;
chsclr.lpCustColors = (LPDWORD)dwCustClrs;
chsclr.lCustData = 0L;
chsclr.rgbResult = HighlightFg;
chsclr.lpTemplateName = "CHOOSECOLORFG";
chsclr.lpfnHook = (LPCCHOOKPROC)(FARPROC)CCHookProc;
chsclr.Flags = CC_RGBINIT|CC_PREVENTFULLOPEN|
CC_ENABLEHOOK|CC_ENABLETEMPLATE;
ChooseColor (&chsclr);
// Redraw to apply
InvalidateRect( hWndList, NULL, TRUE );
}
/******************************************************************************
*
* FUNCTION: FindInListview:
*
* PURPOSE: Searches for a string in the listview. Note: its okay if
* items are being added to the list view or the list view
* is cleared while this search is in progress - the effect
* is harmless.
*
*****************************************************************************/
BOOLEAN FindInListview(HWND hWnd, LPFINDREPLACE FindInfo )
{
int currentItem, clearItem;
DWORD i;
int subitem, numItems;
TCHAR fieldtext[MAXITEMLENGTH];
BOOLEAN match = FALSE;
TCHAR errmsg[MAX_PATH];
BOOLEAN goUp;
// get the search direction
goUp = ((FindInfo->Flags & FR_DOWN) == FR_DOWN);
// initialize stuff
if( !(numItems = ListView_GetItemCount( hWndList ))) {
MessageBox( hWnd, TEXT("No items to search"), TEXT(APPNAME),
MB_OK|MB_ICONWARNING );
if( hWndFind ) SetForegroundWindow( hWndFind );
return FALSE;
}
// find the item with the focus
currentItem = ListView_GetNextItem( hWndList, -1, LVNI_SELECTED );
// if no current item, start at the top or the bottom
if( currentItem == -1 ) {
if( goUp )
currentItem = 0;
else {
if( PrevMatch ) {
sprintf(errmsg, TEXT("Cannot find string \"%s\""), FindInfo->lpstrFindWhat );
MessageBox( hWnd, errmsg, TEXT(APPNAME), MB_OK|MB_ICONWARNING );
if( hWndFind ) SetForegroundWindow( hWndFind );
else SetFocus( hWndList );
return FALSE;
}
currentItem = numItems;
}
}
// if we're continuing a search, start with the next item
if( PrevMatch && !strcmp( FindString, PrevMatchString ) ) {
if( goUp ) currentItem++;
else currentItem--;
if( (!goUp && currentItem < 0) ||
(goUp && currentItem >= numItems )) {
sprintf(errmsg, TEXT("Cannot find string \"%s\""), FindInfo->lpstrFindWhat );
MessageBox( hWnd, errmsg, TEXT(APPNAME), MB_OK|MB_ICONWARNING );
if( hWndFind ) SetForegroundWindow( hWndFind );
else SetFocus( hWndList );
return FALSE;
}
}
// loop through each item looking for the string
while( 1 ) {
// get the item text
for( subitem = 0; subitem < NUMCOLUMNS; subitem++ ) {
fieldtext[0] = 0;
ListView_GetItemText( hWndList, currentItem, subitem, fieldtext, 256 );
// make sure enought string for a match
if( strlen( fieldtext ) < strlen( FindInfo->lpstrFindWhat ))
continue;
// do a scan all the way through for the substring
if( FindInfo->Flags & FR_WHOLEWORD ) {
i = 0;
while( fieldtext[i] ) {
while( fieldtext[i] && fieldtext[i] != ' ' ) i++;
if( FindInfo->Flags & FR_MATCHCASE )
match = !strcmp( fieldtext, FindInfo->lpstrFindWhat );
else
match = !stricmp( fieldtext, FindInfo->lpstrFindWhat );
if( match) break;
i++;
}
} else {
for( i = 0; i < strlen( fieldtext ) - strlen(FindInfo->lpstrFindWhat)+1; i++ ) {
if( FindInfo->Flags & FR_MATCHCASE )
match = !strncmp( &fieldtext[i], FindInfo->lpstrFindWhat,
strlen(FindInfo->lpstrFindWhat) );
else
match = !strnicmp( &fieldtext[i], FindInfo->lpstrFindWhat,
strlen(FindInfo->lpstrFindWhat) );
if( match ) break;
}
}
if( match ) {
strcpy( PrevMatchString, FindInfo->lpstrFindWhat );
PrevMatch = TRUE;
// Clear all previously-selected items
while( (clearItem = ListView_GetNextItem( hWndList, -1, LVNI_SELECTED )) != -1 ) {
ListView_SetItemState( hWndList, clearItem, 0, LVIS_SELECTED|LVIS_FOCUSED );
}
ListView_SetItemState( hWndList, currentItem,
LVIS_SELECTED|LVIS_FOCUSED,
LVIS_SELECTED|LVIS_FOCUSED );
ListView_EnsureVisible( hWndList, currentItem, FALSE );
SetFocus( hWndList );
return TRUE;
}
}
currentItem = currentItem + (goUp ? 1:-1);
if( currentItem <= 0 || currentItem == numItems+1 ) {
// end of the road
break;
}
}
sprintf(errmsg, TEXT("Cannot find string \"%s\""), FindInfo->lpstrFindWhat );
MessageBox( hWnd, errmsg, TEXT(APPNAME), MB_OK|MB_ICONWARNING );
if( hWndFind ) SetForegroundWindow( hWndFind );
else SetFocus( hWndList );
return FALSE;
}
/******************************************************************************
*
* FUNCTION: PopFindDialog:
*
* PURPOSE: Calls the find message dialog box.
*
*****************************************************************************/
void PopFindDialog(HWND hWnd)
{
_tcscpy( FindString, PrevMatchString );
FindTextInfo.lStructSize = sizeof( FindTextInfo );
FindTextInfo.hwndOwner = hWnd;
FindTextInfo.hInstance = hInst;
FindTextInfo.lpstrFindWhat = FindString;
FindTextInfo.lpstrReplaceWith = NULL;
FindTextInfo.wFindWhatLen = sizeof(FindString);
FindTextInfo.wReplaceWithLen = 0;
FindTextInfo.lCustData = 0;
FindTextInfo.Flags = FindFlags;
FindTextInfo.lpfnHook = (LPFRHOOKPROC)(FARPROC)NULL;
FindTextInfo.lpTemplateName = NULL;
if ((hWndFind = FindText(&FindTextInfo)) == NULL)
MessageBox( hWnd, _T("Unable to create Find dialog"), APPNAME, MB_OK|MB_ICONERROR );
}
/****************************************************************************
*
* FUNCTION: MatchOkay
*
* PURPOSE: Only thing left after compare is more mask. This routine makes
* sure that its a valid wild card ending so that its really a match.
*
****************************************************************************/
BOOLEAN MatchOkay( PCHAR Pattern )
{
// If pattern isn't empty, it must be a wildcard
if( *Pattern && *Pattern != '*' ) {
return FALSE;
}
// Matched
return TRUE;
}
/****************************************************************************
*
* FUNCTION: MatchWithPattern
*
* PURPOSE: Performs nifty wildcard comparison.
*
****************************************************************************/
BOOLEAN MatchWithPattern( PCHAR Pattern, PCHAR Name )
{
char matchchar;
// End of pattern?
if( !*Pattern ) {
return FALSE;
}
// If we hit a wild card, do recursion
if( *Pattern == '*' ) {
Pattern++;
while( *Name && *Pattern ) {
matchchar = *Name;
if( matchchar >= 'a' &&
matchchar <= 'z' ) {
matchchar -= 'a' - 'A';
}
// See if this substring matches
if( *Pattern == matchchar ) {
if( MatchWithPattern( Pattern+1, Name+1 )) {
return TRUE;
}
}
// Try the next substring
Name++;
}
// See if match condition was met
return MatchOkay( Pattern );
}
// Do straight compare until we hit a wild card
while( *Name && *Pattern != '*' ) {
matchchar = *Name;
if( matchchar >= 'a' &&
matchchar <= 'z' ) {
matchchar -= 'a' - 'A';
}
if( *Pattern == matchchar ) {
Pattern++;
Name++;
} else {
return FALSE;
}
}
// If not done, recurse
if( *Name ) {
return MatchWithPattern( Pattern, Name );
}
// Make sure its a match
return MatchOkay( Pattern );
}
/****************************************************************************
*
* FUNCTION: MatchWithHighlightPattern
*
* PURPOSE: Converts strings to upper-case before calling core
* comparison routine.
*
****************************************************************************/
BOOLEAN MatchWithHighlightPattern( PCHAR String )
{
char *filterPtr;
char curFilterBuf[MAXFILTERLEN];
char curMatchTest[MAXFILTERLEN];
char *curFilter, *endFilter;
// Is there a highlight filter?
if( !HighlightString[0] ||
(HighlightString[0] == ' ' && !HighlightString[1] )) return FALSE;
// see if its in an highlight
filterPtr = HighlightString;
curFilter = curFilterBuf;
while( 1 ) {
endFilter = strchr( filterPtr, ';' );
if( !endFilter )
curFilter = filterPtr;
else {
strncpy( curFilter, filterPtr, (int) (endFilter - filterPtr ) );
curFilter[ (int) (endFilter - filterPtr ) ] = 0;
}
// Now do the comparison
sprintf( curMatchTest, "%s%s%s",
*curFilter == '*' ? "" : "*",
curFilter,
curFilter[ strlen(curFilter)-1] == '*' ? "" : "*" );
if( MatchWithPattern( curMatchTest, String ) ) {
return TRUE;
}
if( endFilter ) filterPtr = endFilter+1;
else break;
}
return FALSE;
}
/****************************************************************************
*
* FUNCTION: FilterProc
*
* PURPOSE: Processes messages for "Filter" dialog box
*
****************************************************************************/
BOOL APIENTRY FilterProc( HWND hDlg, UINT message, UINT wParam, LONG lParam )
{
char newFilter[MAXFILTERLEN];
char newExFilter[MAXFILTERLEN];
char newHiFilter[MAXFILTERLEN], oldHighlight[MAXFILTERLEN];
int i, j, nb;
static HWND hInFilter;
static HWND hExFilter;
static HWND hHiFilter;
switch ( message ) {
case WM_INITDIALOG:
// initialize the controls to reflect the current filter
// We use a ' ' as a placeholder in the filter strings to represent no filter ("")
hInFilter = GetDlgItem( hDlg, IDC_FILTERSTRING );
for( i = 0; i < NUMRECENTFILTERS; i++ ) {
if( RecentInFilters[i][0] ) {
SendMessage( hInFilter, CB_ADDSTRING, 0,
(LPARAM ) (strcmp( RecentInFilters[i], " ") ?
RecentInFilters[i] : ""));
}
}
hExFilter = GetDlgItem( hDlg, IDC_EXFILTERSTRING );
for( i = 0; i < NUMRECENTFILTERS; i++ ) {
if( RecentExFilters[i][0] ) {
SendMessage( hExFilter, CB_ADDSTRING, 0,
(LPARAM ) (strcmp( RecentExFilters[i], " ") ?
RecentExFilters[i] : ""));
}
}
hHiFilter = GetDlgItem( hDlg, IDC_HIFILTERSTRING );
for( i = 0; i < NUMRECENTFILTERS; i++ ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -