From 4e3fd5f3c3ed0f5c1fc22f87a94b403b734ae842 Mon Sep 17 00:00:00 2001 From: Martin Fuchs Date: Sun, 29 May 2005 20:05:29 +0000 Subject: [PATCH] Implement file filtering (matching of file name patterns and file types). --- programs/winefile/Cs.rc | 2 +- programs/winefile/De.rc | 27 +++- programs/winefile/En.rc | 25 +++- programs/winefile/Es.rc | 2 +- programs/winefile/Fr.rc | 2 +- programs/winefile/Hu.rc | 2 +- programs/winefile/It.rc | 2 +- programs/winefile/Makefile.in | 2 +- programs/winefile/Nl.rc | 2 +- programs/winefile/Pl.rc | 2 +- programs/winefile/Pt.rc | 4 +- programs/winefile/Ru.rc | 2 +- programs/winefile/Si.rc | 2 +- programs/winefile/Sv.rc | 2 +- programs/winefile/Zh.rc | 2 +- programs/winefile/resource.h | 9 ++ programs/winefile/winefile.c | 246 ++++++++++++++++++++++++++++------ 17 files changed, 277 insertions(+), 58 deletions(-) diff --git a/programs/winefile/Cs.rc b/programs/winefile/Cs.rc index 31bc7372497..280c2ba4ca3 100644 --- a/programs/winefile/Cs.rc +++ b/programs/winefile/Cs.rc @@ -98,7 +98,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Tøídit dle Velikost&i" , 406 MENUITEM "Tøídit dle &data" , 407 MENUITEM SEPARATOR - MENUITEM "Tøídit dle &..." , 409 + MENUITEM "Tøídit dle &..." , ID_VIEW_FILTER } POPUP "&Nastavení" { diff --git a/programs/winefile/De.rc b/programs/winefile/De.rc index 6bdb21a47d7..4864792ef3d 100644 --- a/programs/winefile/De.rc +++ b/programs/winefile/De.rc @@ -2,7 +2,7 @@ * Winefile * German Language Support * - * Copyright 2000 Martin Fuchs + * Copyright 2000, 2005 Martin Fuchs * Copyright 2002 Steven Edwards * Copyright 2002 Alexandre Julliard * @@ -98,7 +98,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Nach &Größe" , ID_VIEW_SORT_SIZE MENUITEM "Nach &Datum" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Angaben ausw&ählen..." , 409 + MENUITEM "Angaben ausw&ählen..." , ID_VIEW_FILTER } POPUP "&Optionen" { @@ -178,6 +178,29 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Durchsuchen" , 254, 158, 43, 47, 14 } +IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Angaben auswählen" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "&Name:",-1,7,8,22,10 + EDITTEXT IDC_VIEW_PATTERN,31,7,63,12,ES_AUTOHSCROLL + GROUPBOX "Dateityp",-1,7,23,87,56 + CONTROL "&Verzeichnisse",IDC_VIEW_TYPE_DIRECTORIES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 + CONTROL "&Programme",IDC_VIEW_TYPE_PROGRAMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 + CONTROL "&Dokumente",IDC_VIEW_TYPE_DOCUMENTS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 + CONTROL "&Andere Dateien",IDC_VIEW_TYPE_OTHERS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 + CONTROL "Vers&teckte/Systemdateien anzeigen",IDC_VIEW_TYPE_HIDDEN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,106,9 + DEFPUSHBUTTON "OK",IDOK,104,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,104,24,50,14 +END + + STRINGTABLE { IDS_FONT_SEL_DLG_NAME "Anwenden der Schriftarteinstellung" diff --git a/programs/winefile/En.rc b/programs/winefile/En.rc index 8eb19bd2ff6..72457f9c8b6 100644 --- a/programs/winefile/En.rc +++ b/programs/winefile/En.rc @@ -97,7 +97,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Sort by Si&ze" , ID_VIEW_SORT_SIZE MENUITEM "Sort by &Date" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Filter by &..." , 409 + MENUITEM "Filter by &..." , ID_VIEW_FILTER } POPUP "&Options" { @@ -178,6 +178,29 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Browse" , 254, 158, 43, 47, 14 } +IDD_DIALOG_VIEW_TYPE DIALOG DISCARDABLE 15, 13, 161, 97 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "By File Type" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "&Name:",-1,7,8,22,10 + EDITTEXT IDC_VIEW_PATTERN,31,7,63,12,ES_AUTOHSCROLL + GROUPBOX "File Type",-1,7,23,87,56 + CONTROL "&Directories",IDC_VIEW_TYPE_DIRECTORIES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 + CONTROL "&Programs",IDC_VIEW_TYPE_PROGRAMS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 + CONTROL "Docu&ments",IDC_VIEW_TYPE_DOCUMENTS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 + CONTROL "&Other files",IDC_VIEW_TYPE_OTHERS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 + CONTROL "Show Hidden/&System Files",IDC_VIEW_TYPE_HIDDEN, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,106,9 + DEFPUSHBUTTON "OK",IDOK,104,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,104,24,50,14 +END + + STRINGTABLE { IDS_FONT_SEL_DLG_NAME "Applying font settings" diff --git a/programs/winefile/Es.rc b/programs/winefile/Es.rc index 99517df07c6..fb6c70695ef 100644 --- a/programs/winefile/Es.rc +++ b/programs/winefile/Es.rc @@ -95,7 +95,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Ordenar por t&amaño" , ID_VIEW_SORT_SIZE MENUITEM "Ordenar por &fecha" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Ordenar por &..." , 409 + MENUITEM "Ordenar por &..." , ID_VIEW_FILTER } POPUP "&Opciones" { diff --git a/programs/winefile/Fr.rc b/programs/winefile/Fr.rc index 16481b60b73..b52733227b3 100644 --- a/programs/winefile/Fr.rc +++ b/programs/winefile/Fr.rc @@ -98,7 +98,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Trier par Ta&ille" , ID_VIEW_SORT_SIZE MENUITEM "Trier par Dat&e" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Trier par &..." , 409 + MENUITEM "Trier par &..." , ID_VIEW_FILTER } POPUP "&Options" { diff --git a/programs/winefile/Hu.rc b/programs/winefile/Hu.rc index c87da932895..951f9201e0f 100644 --- a/programs/winefile/Hu.rc +++ b/programs/winefile/Hu.rc @@ -98,7 +98,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Rendezés &méret szerint" , ID_VIEW_SORT_SIZE MENUITEM "Rendezés &dátum szerint" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Egyedi rendezés &..." , 409 + MENUITEM "Egyedi rendezés &..." , ID_VIEW_FILTER } POPUP "&Beállítások" { diff --git a/programs/winefile/It.rc b/programs/winefile/It.rc index db7ab6e37fa..c115ab73ebb 100644 --- a/programs/winefile/It.rc +++ b/programs/winefile/It.rc @@ -98,7 +98,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Ordina per Dimensione" , ID_VIEW_SORT_SIZE MENUITEM "&Ordina per Data" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Ordina per &..." , 409 + MENUITEM "Ordina per &..." , ID_VIEW_FILTER } POPUP "&Opzioni" { diff --git a/programs/winefile/Makefile.in b/programs/winefile/Makefile.in index 49dfed2dd04..da71816fcf5 100644 --- a/programs/winefile/Makefile.in +++ b/programs/winefile/Makefile.in @@ -5,7 +5,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = winefile.exe APPMODE = -mwindows -IMPORTS = shell32 comdlg32 comctl32 ole32 user32 gdi32 kernel32 mpr +IMPORTS = shell32 comdlg32 comctl32 ole32 mpr user32 gdi32 advapi32 kernel32 EXTRALIBS = -luuid C_SRCS = \ diff --git a/programs/winefile/Nl.rc b/programs/winefile/Nl.rc index f851db78269..4fe8b3b4098 100644 --- a/programs/winefile/Nl.rc +++ b/programs/winefile/Nl.rc @@ -94,7 +94,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Sorteer op &grootte" , ID_VIEW_SORT_SIZE MENUITEM "Sorteer op &datum" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Sorteer op &..." , 409 + MENUITEM "Sorteer op &..." , ID_VIEW_FILTER } POPUP "&Opties" { diff --git a/programs/winefile/Pl.rc b/programs/winefile/Pl.rc index f6cf3e85e10..8db5aa47e20 100644 --- a/programs/winefile/Pl.rc +++ b/programs/winefile/Pl.rc @@ -98,7 +98,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Rozmieœæ &po wielkoœci" , 406 MENUITEM "&Sortuj po dacie" , 407 MENUITEM SEPARATOR - MENUITEM "Sortuj po &..." , 409 + MENUITEM "Sortuj po &..." , ID_VIEW_FILTER } POPUP "&Opcje" { diff --git a/programs/winefile/Pt.rc b/programs/winefile/Pt.rc index 3f193ccf508..5ed5054326a 100644 --- a/programs/winefile/Pt.rc +++ b/programs/winefile/Pt.rc @@ -97,7 +97,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Cl&assificar por tamanho" , ID_VIEW_SORT_SIZE MENUITEM "Cla&ssificar por &data" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Classificar &por..." , 409 + MENUITEM "Classificar &por..." , ID_VIEW_FILTER } POPUP "&Opções" { @@ -224,7 +224,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Cl&assificar por tamanho" , ID_VIEW_SORT_SIZE MENUITEM "Cla&ssificar por &data" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Classificar &por..." , 409 + MENUITEM "Classificar &por..." , ID_VIEW_FILTER } POPUP "&Opções" { diff --git a/programs/winefile/Ru.rc b/programs/winefile/Ru.rc index 4aab5dc2099..0e2cddac65b 100644 --- a/programs/winefile/Ru.rc +++ b/programs/winefile/Ru.rc @@ -94,7 +94,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Ñîðòèðîâàòü ïî &ðàçìåðó" , ID_VIEW_SORT_SIZE MENUITEM "Ñîðòèðîâàòü ïî ä&àòå" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Ñîðòèðîâàòü ïî &..." , 409 + MENUITEM "Ñîðòèðîâàòü ïî &..." , ID_VIEW_FILTER } POPUP "&Íàñòðîéêè" { diff --git a/programs/winefile/Si.rc b/programs/winefile/Si.rc index 2dd9053af46..f8f4a54fe86 100644 --- a/programs/winefile/Si.rc +++ b/programs/winefile/Si.rc @@ -95,7 +95,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Sort by Si&ze" , ID_VIEW_SORT_SIZE MENUITEM "Sort by &Date" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Filter by &..." , 409 + MENUITEM "Filter by &..." , ID_VIEW_FILTER } POPUP "&Options" { diff --git a/programs/winefile/Sv.rc b/programs/winefile/Sv.rc index 2381482684c..dfab1d4b8b5 100644 --- a/programs/winefile/Sv.rc +++ b/programs/winefile/Sv.rc @@ -98,7 +98,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Sortera efter st&orlek", ID_VIEW_SORT_SIZE MENUITEM "Sortera efter &datum", ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "Sortera efter &...", 409 + MENUITEM "Sortera efter &...", ID_VIEW_FILTER } POPUP "&Inställningar" { diff --git a/programs/winefile/Zh.rc b/programs/winefile/Zh.rc index 5d3f076621f..25dc30e708b 100644 --- a/programs/winefile/Zh.rc +++ b/programs/winefile/Zh.rc @@ -95,7 +95,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "°´´óСÅÅÐò£¨&Z£©" , ID_VIEW_SORT_SIZE MENUITEM "°´ÈÕÆÚÅÅÐò£¨&D£©" , ID_VIEW_SORT_DATE MENUITEM SEPARATOR - MENUITEM "¶¨ÖÆÅÅÐò..." , 409 + MENUITEM "¶¨ÖÆÅÅÐò..." , ID_VIEW_FILTER } POPUP "Ñ¡Ï&O£©" { diff --git a/programs/winefile/resource.h b/programs/winefile/resource.h index 9df21210ecd..5faf1e8c148 100644 --- a/programs/winefile/resource.h +++ b/programs/winefile/resource.h @@ -33,6 +33,7 @@ #define IDD_EXECUTE 103 #define IDD_SELECT_DESTINATION 104 +#define IDD_DIALOG_VIEW_TYPE 105 /* control ids */ @@ -51,6 +52,7 @@ #define ID_VIEW_SORT_TYPE 405 #define ID_VIEW_SORT_SIZE 406 #define ID_VIEW_SORT_DATE 407 +#define ID_VIEW_FILTER 409 #define ID_VIEW_SPLIT 414 #define ID_SELECT_FONT 510 #define ID_VIEW_TOOL_BAR 508 @@ -69,6 +71,13 @@ #define ID_HELP_USING 0xE144 #define ID_HELP 0xE146 +#define IDC_VIEW_PATTERN 1000 +#define IDC_VIEW_TYPE_DIRECTORIES 1001 +#define IDC_VIEW_TYPE_PROGRAMS 1002 +#define IDC_VIEW_TYPE_DOCUMENTS 1003 +#define IDC_VIEW_TYPE_OTHERS 1004 +#define IDC_VIEW_TYPE_HIDDEN 1005 + /* winefile extensions */ #define ID_ABOUT_WINE 0x8000 diff --git a/programs/winefile/winefile.c b/programs/winefile/winefile.c index 9644cdc372a..8aaae98f575 100644 --- a/programs/winefile/winefile.c +++ b/programs/winefile/winefile.c @@ -157,6 +157,8 @@ typedef struct { BOOL header_wdths_ok; TCHAR path[MAX_PATH]; + TCHAR filter_pattern[MAX_PATH]; + int filter_flags; Root root; SORT_ORDER sortOrder; @@ -1330,10 +1332,22 @@ static Entry* read_tree(Root* root, LPCTSTR path, LPITEMIDLIST pidl, LPTSTR drv, } +/* flags to filter different file types */ +enum TYPE_FILTER { + TF_DIRECTORIES = 0x01, + TF_PROGRAMS = 0x02, + TF_DOCUMENTS = 0x04, + TF_OTHERS = 0x08, + TF_HIDDEN = 0x10, + TF_ALL = 0x1F +}; + + static ChildWnd* alloc_child_window(LPCTSTR path, LPITEMIDLIST pidl, HWND hwnd) { TCHAR drv[_MAX_DRIVE+1], dir[_MAX_DIR], name[_MAX_FNAME], ext[_MAX_EXT]; TCHAR b1[BUFFER_LEN]; + const static TCHAR sAsterics[] = {'*', '\0'}; ChildWnd* child = (ChildWnd*) malloc(sizeof(ChildWnd)); Root* root = &child->root; @@ -1371,6 +1385,9 @@ static ChildWnd* alloc_child_window(LPCTSTR path, LPITEMIDLIST pidl, HWND hwnd) _tsplitpath(path, drv, dir, name, ext); } + _tcscpy(child->filter_pattern, sAsterics); + child->filter_flags = TF_ALL; + root->entry.level = 0; entry = read_tree(root, path, pidl, drv, child->sortOrder, hwnd); @@ -1592,7 +1609,6 @@ struct ExecuteDialog { int cmdshow; }; - static INT_PTR CALLBACK ExecuteDialogWndProg(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) { static struct ExecuteDialog* dlg; @@ -1619,6 +1635,7 @@ static INT_PTR CALLBACK ExecuteDialogWndProg(HWND hwnd, UINT nmsg, WPARAM wparam return 0; } + static INT_PTR CALLBACK DestinationDlgProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) { TCHAR b1[BUFFER_LEN], b2[BUFFER_LEN]; @@ -1656,6 +1673,53 @@ static INT_PTR CALLBACK DestinationDlgProc(HWND hwnd, UINT nmsg, WPARAM wparam, } +struct FilterDialog { + TCHAR pattern[MAX_PATH]; + int flags; +}; + +static INT_PTR CALLBACK FilterDialogDlgProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam) +{ + static struct FilterDialog* dlg; + + switch(nmsg) { + case WM_INITDIALOG: + dlg = (struct FilterDialog*) lparam; + SetWindowText(GetDlgItem(hwnd, IDC_VIEW_PATTERN), dlg->pattern); + Button_SetCheck(GetDlgItem(hwnd,IDC_VIEW_TYPE_DIRECTORIES), (dlg->flags&TF_DIRECTORIES? BST_CHECKED: BST_UNCHECKED)); + Button_SetCheck(GetDlgItem(hwnd,IDC_VIEW_TYPE_PROGRAMS), dlg->flags&TF_PROGRAMS? BST_CHECKED: BST_UNCHECKED); + Button_SetCheck(GetDlgItem(hwnd,IDC_VIEW_TYPE_DOCUMENTS), dlg->flags&TF_DOCUMENTS? BST_CHECKED: BST_UNCHECKED); + Button_SetCheck(GetDlgItem(hwnd,IDC_VIEW_TYPE_OTHERS), dlg->flags&TF_OTHERS? BST_CHECKED: BST_UNCHECKED); + Button_SetCheck(GetDlgItem(hwnd,IDC_VIEW_TYPE_HIDDEN), dlg->flags&TF_HIDDEN? BST_CHECKED: BST_UNCHECKED); + return 1; + + case WM_COMMAND: { + int id = (int)wparam; + + if (id == IDOK) { + int flags = 0; + + GetWindowText(GetDlgItem(hwnd, IDC_VIEW_PATTERN), dlg->pattern, MAX_PATH); + + flags |= Button_GetCheck(GetDlgItem(hwnd,IDC_VIEW_TYPE_DIRECTORIES))&BST_CHECKED? TF_DIRECTORIES: 0; + flags |= Button_GetCheck(GetDlgItem(hwnd,IDC_VIEW_TYPE_PROGRAMS))&BST_CHECKED? TF_PROGRAMS: 0; + flags |= Button_GetCheck(GetDlgItem(hwnd,IDC_VIEW_TYPE_DOCUMENTS))&BST_CHECKED? TF_DOCUMENTS: 0; + flags |= Button_GetCheck(GetDlgItem(hwnd,IDC_VIEW_TYPE_OTHERS))&BST_CHECKED? TF_OTHERS: 0; + flags |= Button_GetCheck(GetDlgItem(hwnd,IDC_VIEW_TYPE_HIDDEN))&BST_CHECKED? TF_HIDDEN: 0; + + dlg->flags = flags; + + EndDialog(hwnd, id); + } else if (id == IDCANCEL) + EndDialog(hwnd, id); + + return 1;} + } + + return 0; +} + + #ifndef _NO_EXTENSIONS static struct FullScreenParameters { @@ -2377,9 +2441,46 @@ static void calc_single_width(Pane* pane, int col) } +static BOOL pattern_match(LPCTSTR str, LPCTSTR pattern) +{ + for( ; *str&&*pattern; str++,pattern++) { + if (*pattern == '*') { + do pattern++; + while(*pattern == '*'); + + if (!*pattern) + return TRUE; + + for(; *str; str++) + if (_totupper(*str)==_totupper(*pattern) && pattern_match(str, pattern)) + return TRUE; + + return FALSE; + } + else if (_totupper(*str)!=_totupper(*pattern) && *pattern!='?') + return FALSE; + } + + if (*str || *pattern) + if (*pattern!='*' || pattern[1]!='\0') + return FALSE; + + return TRUE; +} + + +enum FILE_TYPE { + FT_OTHER = 0, + FT_EXECUTABLE = 1, + FT_DOCUMENT = 2 +}; + +static enum FILE_TYPE get_file_type(LPCTSTR filename); + + /* insert listbox entries after index idx */ -static int insert_entries(Pane* pane, Entry* dir, int idx) +static int insert_entries(Pane* pane, Entry* dir, LPCTSTR pattern, int filter_flags, int idx) { Entry* entry = dir; @@ -2394,15 +2495,47 @@ static int insert_entries(Pane* pane, Entry* dir, int idx) continue; #endif - /* don't display entries "." and ".." in the left pane */ - if (pane->treePane && (entry->data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) - && entry->data.cFileName[0]==TEXT('.')) - if ( + if (entry->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + /* don't display entries "." and ".." in the left pane */ + if (pane->treePane && entry->data.cFileName[0]==TEXT('.')) + if ( #ifndef _NO_EXTENSIONS - entry->data.cFileName[1]==TEXT('\0') || + entry->data.cFileName[1]==TEXT('\0') || #endif - (entry->data.cFileName[1]==TEXT('.') && entry->data.cFileName[2]==TEXT('\0'))) + (entry->data.cFileName[1]==TEXT('.') && entry->data.cFileName[2]==TEXT('\0'))) + continue; + + /* filter directories in right pane */ + if (!pane->treePane && !(filter_flags&TF_DIRECTORIES)) continue; + } + + /* filter using the file name pattern */ + if (pattern) + if (!pattern_match(entry->data.cFileName, pattern)) + continue; + + /* filter system and hidden files */ + if (!(filter_flags&TF_HIDDEN) && (entry->data.dwFileAttributes&(FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))) + continue; + + /* filter looking at the file type */ + if ((filter_flags&(TF_PROGRAMS|TF_DOCUMENTS|TF_OTHERS)) != (TF_PROGRAMS|TF_DOCUMENTS|TF_OTHERS)) + switch(get_file_type(entry->data.cFileName)) { + case FT_EXECUTABLE: + if (!(filter_flags & TF_PROGRAMS)) + continue; + break; + + case FT_DOCUMENT: + if (!(filter_flags & TF_DOCUMENTS)) + continue; + break; + + default: /* TF_OTHERS */ + if (!(filter_flags & TF_OTHERS)) + continue; + } if (idx != -1) idx++; @@ -2410,7 +2543,7 @@ static int insert_entries(Pane* pane, Entry* dir, int idx) ListBox_InsertItemData(pane->hwnd, idx, entry); if (pane->treePane && entry->expanded) - idx = insert_entries(pane, entry->down, idx); + idx = insert_entries(pane, entry->down, pattern, filter_flags, idx); } ShowWindow(pane->hwnd, SW_SHOW); @@ -2455,7 +2588,7 @@ static void set_space_status() static WNDPROC g_orgTreeWndProc; -static void create_tree_window(HWND parent, Pane* pane, int id, int id_header) +static void create_tree_window(HWND parent, Pane* pane, int id, int id_header, LPCTSTR pattern, int filter_flags) { const static TCHAR sListBox[] = {'L','i','s','t','B','o','x','\0'}; @@ -2473,7 +2606,7 @@ static void create_tree_window(HWND parent, Pane* pane, int id, int id_header) /* insert entries into listbox */ if (entry) - insert_entries(pane, entry, -1); + insert_entries(pane, entry, pattern, filter_flags, -1); /* calculate column widths */ if (!s_init) { @@ -2491,8 +2624,8 @@ static void create_tree_window(HWND parent, Pane* pane, int id, int id_header) static void InitChildWindow(ChildWnd* child) { - create_tree_window(child->hwnd, &child->left, IDW_TREE_LEFT, IDW_HEADER_LEFT); - create_tree_window(child->hwnd, &child->right, IDW_TREE_RIGHT, IDW_HEADER_RIGHT); + create_tree_window(child->hwnd, &child->left, IDW_TREE_LEFT, IDW_HEADER_LEFT, NULL, TF_ALL); + create_tree_window(child->hwnd, &child->right, IDW_TREE_RIGHT, IDW_HEADER_RIGHT, child->filter_pattern, child->filter_flags); } @@ -2617,7 +2750,7 @@ static void output_number(Pane* pane, LPDRAWITEMSTRUCT dis, int col, LPCTSTR str } -static int is_exe_file(LPCTSTR ext) +static BOOL is_exe_file(LPCTSTR ext) { static const TCHAR executable_extensions[][4] = { {'C','O','M','\0'}, @@ -2641,17 +2774,33 @@ static int is_exe_file(LPCTSTR ext) d++; for(p=executable_extensions; (*p)[0]; p++) - if (!_tcscmp(ext_buffer, *p)) - return 1; + if (!_tcsicmp(ext_buffer, *p)) + return TRUE; - return 0; + return FALSE; } -static int is_registered_type(LPCTSTR ext) +static BOOL is_registered_type(LPCTSTR ext) { - /* TODO */ + /* check if there exists a classname for this file extension in the registry */ + if (!RegQueryValue(HKEY_CLASSES_ROOT, ext, NULL, NULL)) + return TRUE; - return 1; + return FALSE; +} + +static enum FILE_TYPE get_file_type(LPCTSTR filename) +{ + LPCTSTR ext = _tcsrchr(filename, '.'); + if (!ext) + ext = sEmpty; + + if (is_exe_file(ext)) + return FT_EXECUTABLE; + else if (is_registered_type(ext)) + return FT_DOCUMENT; + else + return FT_OTHER; } @@ -2687,16 +2836,11 @@ static void draw_item(Pane* pane, LPDRAWITEMSTRUCT dis, Entry* entry, int calcWi else img = IMG_FOLDER; } else { - LPCTSTR ext = _tcsrchr(entry->data.cFileName, '.'); - if (!ext) - ext = sEmpty; - - if (is_exe_file(ext)) - img = IMG_EXECUTABLE; - else if (is_registered_type(ext)) - img = IMG_DOCUMENT; - else - img = IMG_FILE; + switch(get_file_type(entry->data.cFileName)) { + case FT_EXECUTABLE: img = IMG_EXECUTABLE; break; + case FT_DOCUMENT: img = IMG_DOCUMENT; break; + default: img = IMG_FILE; + } } } else { attrs = 0; @@ -3198,7 +3342,7 @@ static void scan_entry(ChildWnd* child, Entry* entry, int idx, HWND hwnd) } /* insert found entries in right pane */ - insert_entries(&child->right, entry->down, -1); + insert_entries(&child->right, entry->down, child->filter_pattern, child->filter_flags, -1); calc_widths(&child->right, FALSE); #ifndef _NO_EXTENSIONS set_header(&child->right); @@ -3239,7 +3383,7 @@ static BOOL expand_entry(ChildWnd* child, Entry* dir) dir->expanded = TRUE; /* insert entries in left pane */ - insert_entries(&child->left, p, idx); + insert_entries(&child->left, p, NULL, TF_ALL, idx); if (!child->header_wdths_ok) { if (calc_widths(&child->left, FALSE)) { @@ -3278,6 +3422,17 @@ static void collapse_entry(Pane* pane, Entry* dir) } +static void refresh_right_pane(ChildWnd* child) +{ + ListBox_ResetContent(child->right.hwnd); + insert_entries(&child->right, child->right.root, child->filter_pattern, child->filter_flags, -1); + calc_widths(&child->right, FALSE); + +#ifndef _NO_EXTENSIONS + set_header(&child->right); +#endif +} + static void set_curdir(ChildWnd* child, Entry* entry, int idx, HWND hwnd) { TCHAR path[MAX_PATH]; @@ -3285,19 +3440,14 @@ static void set_curdir(ChildWnd* child, Entry* entry, int idx, HWND hwnd) path[0] = '\0'; child->left.cur = entry; + child->right.root = entry->down? entry->down: entry; child->right.cur = entry; if (!entry->scanned) scan_entry(child, entry, idx, hwnd); - else { - ListBox_ResetContent(child->right.hwnd); - insert_entries(&child->right, entry->down, -1); - calc_widths(&child->right, FALSE); -#ifndef _NO_EXTENSIONS - set_header(&child->right); -#endif - } + else + refresh_right_pane(child); get_path(entry, path); lstrcpy(child->path, path); @@ -3326,7 +3476,7 @@ static void refresh_child(ChildWnd* child) entry = read_tree(&child->root, path, NULL, drv, child->sortOrder, child->hwnd); - insert_entries(&child->left, child->root.entry.down, 0); + insert_entries(&child->left, child->root.entry.down, NULL, TF_ALL, 0); set_curdir(child, entry, 0, child->hwnd); @@ -3924,6 +4074,20 @@ LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam set_sort_order(child, SORT_DATE); break; + case ID_VIEW_FILTER: { + struct FilterDialog dlg; + + memset(&dlg, 0, sizeof(struct FilterDialog)); + _tcscpy(dlg.pattern, child->filter_pattern); + dlg.flags = child->filter_flags; + + if (DialogBoxParam(Globals.hInstance, MAKEINTRESOURCE(IDD_DIALOG_VIEW_TYPE), hwnd, FilterDialogDlgProc, (LPARAM)&dlg) == IDOK) { + _tcscpy(child->filter_pattern, dlg.pattern); + child->filter_flags = dlg.flags; + refresh_right_pane(child); + } + break;} + case ID_VIEW_SPLIT: { last_split = child->split_pos; #ifdef _NO_EXTENSIONS