/*
- * Copyright 2003 Martin Fuchs
+ * 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
//
+#include "utility/xmlstorage.h"
+
+using namespace XMLStorage;
+
+#include "taskbar/favorites.h"
+
+
+ /// management of file types
+struct FileTypeInfo {
+ String _classname;
+ String _displayname;
+ bool _neverShowExt;
+};
+
+struct FileTypeManager : public map<String, FileTypeInfo>
+{
+ typedef map<String, FileTypeInfo> super;
+
+ const FileTypeInfo& operator[](String ext);
+
+ static bool is_exe_file(LPCTSTR ext);
+
+ LPCTSTR set_type(struct Entry* entry, bool dont_hide_ext=false);
+};
+
+
+enum ICON_TYPE {
+ IT_STATIC,
+ IT_CACHED,
+ IT_DYNAMIC,
+ IT_SYSCACHE
+};
+
+enum ICON_ID {
+ ICID_UNKNOWN,
+ ICID_NONE,
+
+ ICID_FOLDER,
+ //ICID_DOCUMENT,
+ ICID_APP,
+ ICID_EXPLORER,
+
+ ICID_CONFIG,
+ ICID_DOCUMENTS,
+ ICID_FAVORITES,
+ ICID_INFO,
+ ICID_APPS,
+ ICID_SEARCH,
+ ICID_ACTION,
+ ICID_SEARCH_DOC,
+ ICID_PRINTER,
+ ICID_NETWORK,
+ ICID_COMPUTER,
+ ICID_LOGOFF,
+ ICID_SHUTDOWN,
+ ICID_BOOKMARK,
+ ICID_MINIMIZE,
+ ICID_CONTROLPAN,
+ ICID_DESKSETTING,
+ ICID_NETCONNS,
+ ICID_ADMINISTRATION,
+ ICID_RECENT,
+
+ ICID_DYNAMIC
+};
+
+struct Icon {
+ Icon();
+ Icon(ICON_ID id, UINT nid);
+ Icon(ICON_TYPE itype, int id, HICON hIcon);
+ Icon(ICON_TYPE itype, int id, int sys_idx);
+
+ operator ICON_ID() const {return _id;}
+
+ void draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const;
+ HBITMAP create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const;
+ int add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color=GetSysColor(COLOR_WINDOW), HBRUSH bk_brush=GetSysColorBrush(COLOR_WINDOW)) const;
+
+ int get_sysiml_idx() const {return _itype==IT_SYSCACHE? _sys_idx: -1;}
+ HICON get_hicon() const {return _itype!=IT_SYSCACHE? _hicon: 0;}
+
+ bool destroy() {if (_itype == IT_DYNAMIC) {DestroyIcon(_hicon); return true;} else return false;}
+
+protected:
+ ICON_ID _id;
+ ICON_TYPE _itype;
+ HICON _hicon;
+ int _sys_idx;
+};
+
+struct SysCacheIcon : public Icon {
+ SysCacheIcon(int id, int sys_idx)
+ : Icon(IT_SYSCACHE, id, sys_idx) {}
+};
+
+struct IconCache {
+ IconCache() : _himlSys_small(0) {}
+
+ void init();
+
+ const Icon& extract(LPCTSTR path, ICONCACHE_FLAGS flags=ICF_NORMAL);
+ const Icon& extract(LPCTSTR path, int idx, ICONCACHE_FLAGS flags=ICF_HICON);
+ const Icon& extract(IExtractIcon* pExtract, LPCTSTR path, int idx, ICONCACHE_FLAGS flags=ICF_HICON);
+
+ const Icon& add(HICON hIcon, ICON_TYPE type=IT_DYNAMIC);
+ const Icon& add(int sys_idx/*, ICON_TYPE type=IT_SYSCACHE*/);
+
+ const Icon& get_icon(int icon_id);
+
+ HIMAGELIST get_sys_imagelist() const {return _himlSys_small;}
+
+ void free_icon(int icon_id);
+
+protected:
+ static int s_next_id;
+
+ typedef map<int, Icon> IconMap;
+ IconMap _icons;
+
+ typedef pair<String,int/*ICONCACHE_FLAGS*/> CacheKey;
+ typedef map<CacheKey, ICON_ID> PathCacheMap;
+ PathCacheMap _pathCache;
+
+ typedef pair<String,pair<int,int/*ICONCACHE_FLAGS*/> > IdxCacheKey;
+ typedef map<IdxCacheKey, ICON_ID> IdxCacheMap;
+ IdxCacheMap _idxCache;
+
+ HIMAGELIST _himlSys_small;
+};
+
+
+#define ICON_SIZE_X GetSystemMetrics(large_icons? SM_CXICON: SM_CXSMICON)
+#define ICON_SIZE_Y GetSystemMetrics(large_icons? SM_CYICON: SM_CYSMICON)
+
+
+ /// create a bitmap from an icon
+extern HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, bool large_icons*/);
+
+ /// add icon with alpha channel to imagelist using the specified background color
+extern int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd);
+
+ /// retrieve icon from window
+extern HICON get_window_icon_small(HWND hwnd);
+extern HICON get_window_icon_big(HWND hwnd, bool allow_from_class=true);
+
+
+ /// desktop management
+#ifdef _USE_HDESK
+
+typedef auto_ptr<struct DesktopThread> DesktopThreadPtr;
+
+struct Desktop
+{
+ HDESK _hdesktop;
+// HWINSTA _hwinsta;
+ DesktopThreadPtr _pThread;
+ WindowHandle _hwndDesktop;
+
+ Desktop(HDESK hdesktop=0/*, HWINSTA hwinsta=0*/);
+ ~Desktop();
+};
+
+typedef auto_ptr<Desktop> DesktopPtr;
+typedef DesktopPtr DesktopRef;
+
+ /// Thread class for additional desktops
+struct DesktopThread : public Thread
+{
+ DesktopThread(Desktop& desktop)
+ : _desktop(desktop)
+ {
+ }
+
+ int Run();
+
+protected:
+ Desktop& _desktop;
+};
+
+#else
+
+typedef pair<HWND, DWORD> MinimizeStruct;
+
+struct Desktop
+{
+ set<HWND> _windows;
+ WindowHandle _hwndForeground;
+ list<MinimizeStruct> _minimized;
+};
+typedef Desktop DesktopRef;
+
+#endif
+
+
+#define DESKTOP_COUNT 4
+
+struct Desktops : public vector<DesktopRef>
+{
+ Desktops();
+ ~Desktops();
+
+ void init();
+ void SwitchToDesktop(int idx);
+ void ToggleMinimize();
+
+#ifdef _USE_HDESK
+ DesktopRef& get_current_Desktop() {return (*this)[_current_desktop];}
+#endif
+
+ int _current_desktop;
+};
+
+
+ /// structure containing global variables of Explorer
extern struct ExplorerGlobals
{
ExplorerGlobals();
+ void init(HINSTANCE hInstance);
+
+ void read_persistent();
+ void write_persistent();
+
+ XMLPos get_cfg();
+ XMLPos get_cfg(const char* path);
+
HINSTANCE _hInstance;
- ATOM _hframeClass;
UINT _cfStrFName;
+
+#ifndef ROSSHELL
+ ATOM _hframeClass;
HWND _hMainWnd;
- bool _prescan_nodes;
bool _desktop_mode;
+ bool _prescan_nodes;
+#endif
FILE* _log;
#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
DWORD(STDAPICALLTYPE* _SHRestricted)(RESTRICTIONS);
#endif
-} g_Globals;
-#define LOG(x) if (g_Globals._log) _ftprintf(g_Globals._log, TEXT("%s\n"), (LPCTSTR)(x));
+ FileTypeManager _ftype_mgr;
+ IconCache _icon_cache;
+
+ HWND _hwndDesktopBar;
+ HWND _hwndShellView;
+ HWND _hwndDesktop;
+
+ Desktops _desktops;
+
+ XMLDoc _cfg;
+ String _cfg_dir;
+ String _cfg_path;
+
+ Favorites _favorites;
+ String _favorites_path;
+} g_Globals;
/// convenient loading of string resources
ResString(UINT nid);
};
- ///
+ /// convenient loading of standard (32x32) icon resources
struct ResIcon
{
ResIcon(UINT nid);
- operator HICON() const {return _hIcon;}
+ operator HICON() const {return _hicon;}
protected:
- HICON _hIcon;
+ HICON _hicon;
};
+ /// convenient loading of small (16x16) icon resources
struct SmallIcon
{
SmallIcon(UINT nid);
- operator HICON() const {return _hIcon;}
+ operator HICON() const {return _hicon;}
protected:
- HICON _hIcon;
+ HICON _hicon;
};
+ /// convenient loading of icon resources with specified sizes
struct ResIconEx
{
ResIconEx(UINT nid, int w, int h);
- operator HICON() const {return _hIcon;}
+ operator HICON() const {return _hicon;}
protected:
- HICON _hIcon;
+ HICON _hicon;
};
+ /// set big and small icons out of the resources for a window
extern void SetWindowIcon(HWND hwnd, UINT nid);
+ /// convenient loading of bitmap resources
struct ResBitmap
{
ResBitmap(UINT nid);