Implement file filtering (matching of file name patterns and file

types).
This commit is contained in:
Martin Fuchs 2005-05-29 20:05:29 +00:00 committed by Alexandre Julliard
parent 98b2e381f6
commit 4e3fd5f3c3
17 changed files with 277 additions and 58 deletions

View File

@ -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í" {

View File

@ -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"

View File

@ -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"

View File

@ -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" {

View File

@ -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" {

View File

@ -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" {

View File

@ -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" {

View File

@ -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 = \

View File

@ -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" {

View File

@ -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" {

View File

@ -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" {

View File

@ -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 "&Íàñòðîéêè" {

View File

@ -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" {

View File

@ -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" {

View File

@ -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" {

View File

@ -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

View File

@ -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