reactos/modules/rosapps/applications/explorer-old/shell/entries.h

163 lines
3.7 KiB
C++

/*
* Copyright 2003, 2004 Martin Fuchs
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
//
// Explorer clone
//
// entries.h
//
// Martin Fuchs, 23.07.2003
//
enum ENTRY_TYPE {
ET_UNKNOWN,
#ifndef _NO_WIN_FS
ET_WINDOWS,
#endif
#ifdef __WINE__
ET_UNIX,
#endif
ET_SHELL,
ET_NTOBJS,
ET_REGISTRY,
ET_FAT,
ET_WEB
};
enum SORT_ORDER {
SORT_NONE,
SORT_NAME,
SORT_EXT,
SORT_SIZE,
SORT_DATE
};
enum SCAN_FLAGS {
SCAN_DONT_EXTRACT_ICONS = 1,
SCAN_DONT_ACCESS = 2,
SCAN_NO_FILESYSTEM = 4
};
#ifndef ATTRIBUTE_SYMBOLIC_LINK
#define ATTRIBUTE_LONGNAME 0x08000000
#define ATTRIBUTE_VOLNAME 0x10000000
#define ATTRIBUTE_ERASED 0x20000000
#define ATTRIBUTE_SYMBOLIC_LINK 0x40000000
#define ATTRIBUTE_EXECUTABLE 0x80000000
#endif
enum ICONCACHE_FLAGS {
ICF_NORMAL = 0,
ICF_MIDDLE = 1,
ICF_LARGE = 2,
ICF_OPEN = 4,
ICF_OVERLAYS = 8,
ICF_HICON = 16,
ICF_SYSCACHE = 32
};
#ifndef SHGFI_ADDOVERLAYS // missing in MinGW (as of 28.12.2005)
#define SHGFI_ADDOVERLAYS 0x000000020
#endif
/// base of all file and directory entries
struct Entry
{
protected:
Entry(ENTRY_TYPE etype);
Entry(Entry* parent, ENTRY_TYPE etype);
Entry(const Entry&);
public:
virtual ~Entry();
Entry* _next;
Entry* _down;
Entry* _up;
bool _expanded;
bool _scanned;
int _level;
WIN32_FIND_DATA _data;
SFGAOF _shell_attribs;
LPTSTR _display_name;
LPTSTR _type_name;
LPTSTR _content;
ENTRY_TYPE _etype;
int /*ICON_ID*/ _icon_id;
BY_HANDLE_FILE_INFORMATION _bhfi;
bool _bhfi_valid;
void free_subentries();
void read_directory_base(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0);
Entry* read_tree(const void* path, SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0);
void sort_directory(SORT_ORDER sortOrder);
void smart_scan(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0);
int extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL);
int safe_extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL);
virtual void read_directory(int scan_flags=0) {}
virtual const void* get_next_path_component(const void*) const {return NULL;}
virtual Entry* find_entry(const void*) {return NULL;}
virtual bool get_path(PTSTR path, size_t path_count) const = 0;
virtual ShellPath create_absolute_pidl() const {return (LPCITEMIDLIST)NULL;}
virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut);
virtual ShellFolder get_shell_folder() const;
virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL);
virtual HRESULT do_context_menu(HWND hwnd, const POINT& pos, CtxMenuInterfaces& cm_ifs);
protected:
bool get_path_base(PTSTR path, size_t path_count, ENTRY_TYPE etype) const;
};
/// base for all directory entries
struct Directory {
protected:
Directory() : _path(NULL) {}
virtual ~Directory() {}
void* _path;
};
/// root entry for file system trees
struct Root {
Root();
~Root();
Entry* _entry;
TCHAR _path[MAX_PATH];
TCHAR _volname[_MAX_FNAME];
TCHAR _fs[_MAX_DIR];
DWORD _drive_type;
DWORD _fs_flags;
SORT_ORDER _sort_order;
Entry* read_tree(LPCTSTR path, int scan_flags=0);
Entry* read_tree(LPCITEMIDLIST pidl, int scan_flags=0);
};