more configuration options:

- show/hide clock
- disable automatic notification icon hiding

svn path=/trunk/; revision=8902
This commit is contained in:
Martin Fuchs 2004-03-28 14:55:18 +00:00
parent 86d212c244
commit bdaa4495d0
13 changed files with 281 additions and 112 deletions

View file

@ -145,8 +145,11 @@ int DesktopSettingsDlg::Command(int id, int code)
TaskbarSettingsDlg::TaskbarSettingsDlg(HWND hwnd) TaskbarSettingsDlg::TaskbarSettingsDlg(HWND hwnd)
: super(hwnd) : super(hwnd),
_cfg_org(g_Globals._cfg)
{ {
CheckDlgButton(hwnd, ID_SHOW_CLOCK, XMLBool(g_Globals.get_cfg("desktopbar"), "options", "show-clock", true)? BST_CHECKED: BST_UNCHECKED);
CheckDlgButton(hwnd, ID_HIDE_INACTIVE_ICONS, XMLBool(g_Globals.get_cfg("notify-icons"), "options", "hide-inactive", true)? BST_CHECKED: BST_UNCHECKED);
} }
int TaskbarSettingsDlg::Command(int id, int code) int TaskbarSettingsDlg::Command(int id, int code)
@ -154,10 +157,30 @@ int TaskbarSettingsDlg::Command(int id, int code)
switch(id) { switch(id) {
case ID_CONFIG_NOTIFYAREA: case ID_CONFIG_NOTIFYAREA:
Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), _hwnd); Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), _hwnd);
return 0; break;
case ID_SHOW_CLOCK:
XMLBoolRef(g_Globals.get_cfg("desktopbar"), "options", "show-clock", true).toggle();
SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0);
PropSheet_Changed(GetParent(_hwnd), _hwnd);
break;
case ID_HIDE_INACTIVE_ICONS:
XMLBoolRef(g_Globals.get_cfg("notify-icons"), "options", "hide-inactive", true).toggle();
SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0);
PropSheet_Changed(GetParent(_hwnd), _hwnd);
break;
case PSN_RESET:
g_Globals._cfg = _cfg_org;
SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0);
break;
default:
return 1;
} }
return 1; return 0;
} }

View file

@ -67,6 +67,9 @@ struct TaskbarSettingsDlg : public PropSheetPageDlg
TaskbarSettingsDlg(HWND hwnd); TaskbarSettingsDlg(HWND hwnd);
virtual int Command(int id, int code); virtual int Command(int id, int code);
protected:
XMLDoc _cfg_org;
}; };

View file

@ -10,6 +10,7 @@
</desktop> </desktop>
<desktopbar> <desktopbar>
<options show-clock="TRUE"/>
<positions> <positions>
<bar name="quicklaunch" left="10" top="2" width="250" height="22"/> <bar name="quicklaunch" left="10" top="2" width="250" height="22"/>
<bar name="taskbar" left="300" top="2" width="400" height="22"/> <bar name="taskbar" left="300" top="2" width="400" height="22"/>
@ -20,7 +21,7 @@
</taskbar> </taskbar>
<notify-icons> <notify-icons>
<option show-hidden="FALSE"/> <options hide-inactive="TRUE" show-hidden="FALSE"/>
<icon name="Volume Control" text="Volume" show="show"/> <icon name="Volume Control" text="Volume" show="show"/>
</notify-icons> </notify-icons>

View file

@ -81,6 +81,7 @@ void ExplorerGlobals::init(HINSTANCE hInstance)
_icon_cache.init(); _icon_cache.init();
} }
bool ExplorerGlobals::read_cfg() bool ExplorerGlobals::read_cfg()
{ {
// read configuration file // read configuration file
@ -105,6 +106,26 @@ void ExplorerGlobals::write_cfg()
} }
XMLPos ExplorerGlobals::get_cfg()
{
XMLPos pos(&_cfg);
pos.create("explorer-cfg");
return pos;
}
XMLPos ExplorerGlobals::get_cfg(const String& name)
{
XMLPos pos(&_cfg);
pos.create("explorer-cfg");
pos.create(name);
return pos;
}
void _log_(LPCTSTR txt) void _log_(LPCTSTR txt)
{ {
FmtString msg(TEXT("%s\n"), txt); FmtString msg(TEXT("%s\n"), txt);

View file

@ -55,6 +55,7 @@
#define PM_GET_WIDTH (WM_APP+0x18) #define PM_GET_WIDTH (WM_APP+0x18)
#define PM_REFRESH (WM_APP+0x1B) #define PM_REFRESH (WM_APP+0x1B)
#define PM_REFRESH_CONFIG (WM_APP+0x1C)
#define CLASSNAME_FRAME TEXT("CabinetWClass") // same class name for frame window as in MS Explorer #define CLASSNAME_FRAME TEXT("CabinetWClass") // same class name for frame window as in MS Explorer

View file

@ -140,6 +140,8 @@
#define IDC_NOTIFY_HIDE 1021 #define IDC_NOTIFY_HIDE 1021
#define IDC_NOTIFY_AUTOHIDE 1022 #define IDC_NOTIFY_AUTOHIDE 1022
#define IDC_LABEL4 1023 #define IDC_LABEL4 1023
#define ID_HIDE_INACTIVE_ICONS 1025
#define ID_SHOW_CLOCK 1026
#define ID_REFRESH 1704 #define ID_REFRESH 1704
#define ID_ABOUT_WINEFILE 1705 #define ID_ABOUT_WINEFILE 1705
#define IDC_FILETREE 10001 #define IDC_FILETREE 10001
@ -191,7 +193,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 166 #define _APS_NEXT_RESOURCE_VALUE 166
#define _APS_NEXT_COMMAND_VALUE 40019 #define _APS_NEXT_COMMAND_VALUE 40019
#define _APS_NEXT_CONTROL_VALUE 1024 #define _APS_NEXT_CONTROL_VALUE 1026
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101
#endif #endif
#endif #endif

View file

@ -806,6 +806,11 @@ STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Taskbar Properties" CAPTION "Taskbar Properties"
FONT 8, "MS Sans Serif" FONT 8, "MS Sans Serif"
BEGIN BEGIN
CONTROL "show &clock",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,113,52,10
CONTROL "&hide inactive notification icons",
ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,7,135,111,10
PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,133,50,14 PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,133,50,14
END END
@ -821,13 +826,13 @@ STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
WS_SYSMENU | WS_THICKFRAME WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW EXSTYLE WS_EX_APPWINDOW
CAPTION "Configure Notification Icons" CAPTION "Configure Notification Icons"
FONT 8, "MS Sans Serif", 0, 0, 0x1 FONT 8, "MS Sans Serif"
BEGIN BEGIN
CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES |
TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,193,31 TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,193,31
LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8 LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8
EDITTEXT IDC_NOTIFY_TOOLTIP,55,42,145,14,ES_AUTOHSCROLL EDITTEXT IDC_NOTIFY_TOOLTIP,55,42,145,14,ES_AUTOHSCROLL
LTEXT "&Window Title:",IDC_LABEL2,7,63,44,8 LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8
EDITTEXT IDC_NOTIFY_TITLE,55,60,145,14,ES_AUTOHSCROLL EDITTEXT IDC_NOTIFY_TITLE,55,60,145,14,ES_AUTOHSCROLL
LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8 LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8
EDITTEXT IDC_NOTIFY_MODULE,55,78,145,14,ES_AUTOHSCROLL EDITTEXT IDC_NOTIFY_MODULE,55,78,145,14,ES_AUTOHSCROLL
@ -838,9 +843,11 @@ BEGIN
107,29,10 107,29,10
CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button", CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button",
BS_AUTORADIOBUTTON,112,107,43,10 BS_AUTORADIOBUTTON,112,107,43,10
ICON "",IDC_PICTURE,173,100,20,20
CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,7,131,56,10
DEFPUSHBUTTON "&OK",IDOK,91,129,50,14,WS_GROUP DEFPUSHBUTTON "&OK",IDOK,91,129,50,14,WS_GROUP
PUSHBUTTON "&Cancel",IDCANCEL,150,129,50,14 PUSHBUTTON "&Cancel",IDCANCEL,150,129,50,14
ICON "",IDC_PICTURE,173,100,20,20
END END

View file

@ -227,9 +227,13 @@ extern struct ExplorerGlobals
ExplorerGlobals(); ExplorerGlobals();
void init(HINSTANCE hInstance); void init(HINSTANCE hInstance);
bool read_cfg(); bool read_cfg();
void write_cfg(); void write_cfg();
XMLPos get_cfg();
XMLPos get_cfg(const String& name);
HINSTANCE _hInstance; HINSTANCE _hInstance;
ATOM _hframeClass; ATOM _hframeClass;
UINT _cfStrFName; UINT _cfStrFName;

View file

@ -242,6 +242,10 @@ LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
return SendMessage(_hwndTaskBar, nmsg, wparam, lparam); return SendMessage(_hwndTaskBar, nmsg, wparam, lparam);
break; break;
case PM_REFRESH_CONFIG: ///@todo read desktop bar settings
SendMessage(_hwndNotify, PM_REFRESH_CONFIG, 0, 0);
break;
case WM_TIMER: case WM_TIMER:
if (wparam == ID_TRAY_VOLUME) { if (wparam == ID_TRAY_VOLUME) {
KillTimer(_hwnd, wparam); KillTimer(_hwnd, wparam);

View file

@ -31,7 +31,7 @@
#define IDW_QUICKLAUNCHBAR 101 #define IDW_QUICKLAUNCHBAR 101
#define PM_UPDATE_DESKTOP (WM_APP+0x1C) #define PM_UPDATE_DESKTOP (WM_APP+0x23)
#define IDC_FIRST_QUICK_ID 0x4000 #define IDC_FIRST_QUICK_ID 0x4000

View file

@ -177,8 +177,7 @@ NotifyArea::NotifyArea(HWND hwnd)
_clock_width = 0; _clock_width = 0;
_last_icon_count = 0; _last_icon_count = 0;
_show_hidden = false; _show_hidden = false;
_hide_inactive = true;
read_config();
} }
NotifyArea::~NotifyArea() NotifyArea::~NotifyArea()
@ -188,40 +187,68 @@ NotifyArea::~NotifyArea()
write_config(); write_config();
} }
static bool get_hide_clock_from_registry()
{
HKEY hkeyStuckRects = 0;
DWORD buffer[10];
DWORD len = sizeof(buffer);
bool hide_clock = false;
// check if the clock should be hidden
if (!RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StuckRects2"), &hkeyStuckRects) &&
!RegQueryValueEx(hkeyStuckRects, TEXT("Settings"), 0, NULL, (LPBYTE)buffer, &len) &&
len==sizeof(buffer) && buffer[0]==sizeof(buffer))
hide_clock = buffer[2] & 0x08? true: false;
if (hkeyStuckRects)
RegCloseKey(hkeyStuckRects);
return hide_clock;
}
void NotifyArea::read_config() void NotifyArea::read_config()
{ {
// read notification icon settings from XML configuration // read notification icon settings from XML configuration
XMLPos pos(&g_Globals._cfg); XMLPos pos = g_Globals.get_cfg();
if (pos.go_down("explorer-cfg")) {
if (pos.go_down("notify-icons")) {
_show_hidden = XMLBool(pos, "option", "show-hidden");
XMLChildrenFilter icons(pos, "icon");
for(XMLChildrenFilter::iterator it=icons.begin(); it!=icons.end(); ++it) {
const XMLNode& node = **it;
NotifyIconConfig cfg;
cfg._name = node["name"];
cfg._tipText = node["text"];
cfg._windowTitle = node["window"];
cfg._modulePath = node["module"];
const string& mode = node["show"];
if (mode == "show")
cfg._mode = NIM_SHOW;
else if (mode == "hide")
cfg._mode = NIM_HIDE;
else //if (mode == "auto")
cfg._mode = NIM_HIDE;
_cfg.push_back(cfg);
}
#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
if (!g_Globals._SHRestricted || !SHRestricted(REST_HIDECLOCK))
#endif
{
if (pos.go_down("desktopbar")) {
bool show = XMLBoolRef(pos, "options", "show-clock", !get_hide_clock_from_registry());
show_clock(show);
pos.back(); pos.back();
} }
}
if (pos.go_down("notify-icons")) {
_hide_inactive = XMLBool(pos, "options", "hide-inactive", true); ///@todo read default setting from registry
_show_hidden = XMLBool(pos, "options", "show-hidden", false); ///@todo read default setting from registry
XMLChildrenFilter icons(pos, "icon");
for(XMLChildrenFilter::iterator it=icons.begin(); it!=icons.end(); ++it) {
const XMLNode& node = **it;
NotifyIconConfig cfg;
cfg._name = node["name"];
cfg._tipText = node["text"];
cfg._windowTitle = node["window"];
cfg._modulePath = node["module"];
const string& mode = node["show"];
if (mode == "show")
cfg._mode = NIM_SHOW;
else if (mode == "hide")
cfg._mode = NIM_HIDE;
else //if (mode == "auto")
cfg._mode = NIM_HIDE;
_cfg.push_back(cfg);
}
pos.back(); pos.back();
} }
@ -230,12 +257,16 @@ void NotifyArea::read_config()
void NotifyArea::write_config() void NotifyArea::write_config()
{ {
// write notification icon settings to XML configuration file // write notification icon settings to XML configuration file
XMLPos pos(&g_Globals._cfg); XMLPos pos = g_Globals.get_cfg();
pos.create("desktopbar");
XMLBoolRef(pos, "options", "show-clock") = _hwndClock!=0;
pos.back();
pos.create("explorer-cfg");
pos.create("notify-icons"); pos.create("notify-icons");
XMLBoolRef(pos, "option", "show-hidden") = _show_hidden; XMLBoolRef(pos, "options", "hide-inactive") = _hide_inactive;
XMLBoolRef(pos, "options", "show-hidden") = _show_hidden;
for(NotifyIconCfgList::iterator it=_cfg.begin(); it!=_cfg.end(); ++it) { for(NotifyIconCfgList::iterator it=_cfg.begin(); it!=_cfg.end(); ++it) {
NotifyIconConfig& cfg = *it; NotifyIconConfig& cfg = *it;
@ -243,7 +274,7 @@ void NotifyArea::write_config()
// search for the corresponding node using the original name // search for the corresponding node using the original name
pos.create("icon", "name", cfg._name); pos.create("icon", "name", cfg._name);
// refresh name // refresh unique name
cfg.create_name(); cfg.create_name();
pos["name"] = cfg._name; pos["name"] = cfg._name;
@ -254,33 +285,14 @@ void NotifyArea::write_config()
pos.back(); pos.back();
} }
pos.back();
pos.back();
} }
LRESULT NotifyArea::Init(LPCREATESTRUCT pcs) void NotifyArea::show_clock(bool flag)
{ {
if (super::Init(pcs)) bool vis = _hwndClock!=0;
return 1;
#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003) if (vis != flag) {
if (!g_Globals._SHRestricted || !SHRestricted(REST_HIDECLOCK)) if (flag) {
#endif
{
HKEY hkeyStuckRects = 0;
DWORD buffer[10];
DWORD len = sizeof(buffer);
bool hide_clock = false;
// check if the clock should be hidden
if (!RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StuckRects2"), &hkeyStuckRects) &&
!RegQueryValueEx(hkeyStuckRects, TEXT("Settings"), 0, NULL, (LPBYTE)buffer, &len) &&
len==sizeof(buffer) && buffer[0]==sizeof(buffer))
hide_clock = buffer[2] & 0x08? true: false;
if (!hide_clock) {
// create clock window // create clock window
_hwndClock = ClockWindow::Create(_hwnd); _hwndClock = ClockWindow::Create(_hwnd);
@ -288,11 +300,22 @@ LRESULT NotifyArea::Init(LPCREATESTRUCT pcs)
ClientRect clock_size(_hwndClock); ClientRect clock_size(_hwndClock);
_clock_width = clock_size.right; _clock_width = clock_size.right;
} }
} else {
DestroyWindow(_hwndClock);
_hwndClock = 0;
_clock_width = 0;
} }
if (hkeyStuckRects) SendMessage(GetParent(_hwnd), PM_RESIZE_CHILDREN, 0, 0);
RegCloseKey(hkeyStuckRects);
} }
}
LRESULT NotifyArea::Init(LPCREATESTRUCT pcs)
{
if (super::Init(pcs))
return 1;
read_config();
SetTimer(_hwnd, 0, 1000, NULL); SetTimer(_hwnd, 0, 1000, NULL);
@ -344,6 +367,10 @@ LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
case PM_GET_WIDTH: case PM_GET_WIDTH:
return _sorted_icons.size()*NOTIFYICON_DIST + NOTIFYAREA_SPACE + _clock_width; return _sorted_icons.size()*NOTIFYICON_DIST + NOTIFYAREA_SPACE + _clock_width;
case PM_REFRESH_CONFIG:
read_config();
break;
case WM_CONTEXTMENU: { case WM_CONTEXTMENU: {
Point pt(lparam); Point pt(lparam);
ScreenToClient(_hwnd, &pt); ScreenToClient(_hwnd, &pt);
@ -629,11 +656,12 @@ void NotifyArea::Refresh(bool update)
case NIM_AUTO: case NIM_AUTO:
// automatically hide icons after long periods of inactivity // automatically hide icons after long periods of inactivity
if (!(entry._dwState & NIS_HIDDEN)) if (_hide_inactive)
if (now-entry._lastChange > ICON_AUTOHIDE_SECONDS*1000) { if (!(entry._dwState & NIS_HIDDEN))
entry._dwState |= NIS_HIDDEN; if (now-entry._lastChange > ICON_AUTOHIDE_SECONDS*1000) {
++update; entry._dwState |= NIS_HIDDEN;
} ++update;
}
break; break;
} }
} }
@ -746,6 +774,7 @@ TrayNotifyDlg::TrayNotifyDlg(HWND hwnd)
_icon_states_org[it->first] = IconStatePair(it->second._mode, it->second._dwState); _icon_states_org[it->first] = IconStatePair(it->second._mode, it->second._dwState);
_cfg_org = _pNotifyArea->_cfg; _cfg_org = _pNotifyArea->_cfg;
_show_hidden_org = _pNotifyArea->_show_hidden;
} }
SetWindowIcon(hwnd, IDI_REACTOS/*IDI_SEARCH*/); SetWindowIcon(hwnd, IDI_REACTOS/*IDI_SEARCH*/);
@ -777,6 +806,7 @@ TrayNotifyDlg::TrayNotifyDlg(HWND hwnd)
_resize_mgr.Add(IDC_NOTIFY_AUTOHIDE,MOVE_Y); _resize_mgr.Add(IDC_NOTIFY_AUTOHIDE,MOVE_Y);
_resize_mgr.Add(IDC_PICTURE, MOVE); _resize_mgr.Add(IDC_PICTURE, MOVE);
_resize_mgr.Add(ID_SHOW_HIDDEN_ICONS,MOVE_Y);
_resize_mgr.Add(IDOK, MOVE); _resize_mgr.Add(IDOK, MOVE);
_resize_mgr.Add(IDCANCEL, MOVE); _resize_mgr.Add(IDCANCEL, MOVE);
@ -871,7 +901,7 @@ void TrayNotifyDlg::Refresh()
DestroyIcon(hicon); DestroyIcon(hicon);
} }
// insert new configuration entry CheckDlgButton(_hwnd, ID_SHOW_HIDDEN_ICONS, _pNotifyArea->_show_hidden? BST_CHECKED: BST_UNCHECKED);
} }
TreeView_Expand(_tree_ctrl, _hitemCurrent_visible, TVE_EXPAND); TreeView_Expand(_tree_ctrl, _hitemCurrent_visible, TVE_EXPAND);
@ -956,6 +986,11 @@ int TrayNotifyDlg::Command(int id, int code)
SetIconMode(NIM_AUTO); SetIconMode(NIM_AUTO);
break; break;
case ID_SHOW_HIDDEN_ICONS:
if (_pNotifyArea)
SendMessage(*_pNotifyArea, WM_COMMAND, MAKEWPARAM(id,code), 0);
break;
case IDOK: case IDOK:
EndDialog(_hwnd, id); EndDialog(_hwnd, id);
break; break;
@ -965,6 +1000,7 @@ int TrayNotifyDlg::Command(int id, int code)
if (_pNotifyArea) { if (_pNotifyArea) {
// restore original icon states and configuration data // restore original icon states and configuration data
_pNotifyArea->_cfg = _cfg_org; _pNotifyArea->_cfg = _cfg_org;
_pNotifyArea->_show_hidden = _show_hidden_org;
for(IconStateMap::const_iterator it=_icon_states_org.begin(); it!=_icon_states_org.end(); ++it) { for(IconStateMap::const_iterator it=_icon_states_org.begin(); it!=_icon_states_org.end(); ++it) {
NotifyInfo& info = _pNotifyArea->_icon_map[it->first]; NotifyInfo& info = _pNotifyArea->_icon_map[it->first];

View file

@ -143,6 +143,7 @@ protected:
NotifyHook _hook; NotifyHook _hook;
bool _show_hidden; bool _show_hidden;
bool _hide_inactive;
LRESULT Init(LPCREATESTRUCT pcs); LRESULT Init(LPCREATESTRUCT pcs);
LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam); LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
@ -160,7 +161,8 @@ protected:
void read_config(); void read_config();
void write_config(); void write_config();
public: // for TrayNotifyDlg friend struct TrayNotifyDlg;
NotifyIconCfgList _cfg; NotifyIconCfgList _cfg;
map<HWND, String> _window_modules; map<HWND, String> _window_modules;
@ -169,6 +171,8 @@ public: // for TrayNotifyDlg
NotifyIconSet _sorted_icons; NotifyIconSet _sorted_icons;
int _next_idx; int _next_idx;
size_t _last_icon_count; size_t _last_icon_count;
void show_clock(bool flag);
}; };
@ -191,6 +195,7 @@ protected:
NotifyIconCfgList _cfg_org; NotifyIconCfgList _cfg_org;
IconStateMap _icon_states_org; IconStateMap _icon_states_org;
bool _show_hidden_org;
HTREEITEM _hitemCurrent; HTREEITEM _hitemCurrent;
HTREEITEM _hitemCurrent_visible; HTREEITEM _hitemCurrent_visible;

View file

@ -241,6 +241,15 @@ struct XMLNode : public String
{ {
} }
XMLNode(const XMLNode& other)
: _content(other._content),
_trailing(other._trailing),
_attributes(other._attributes)
{
for(Children::const_iterator it=other._children.begin(); it!=other._children.end(); ++it)
_children.push_back(new XMLNode(**it));
}
~XMLNode() ~XMLNode()
{ {
while(!_children.empty()) { while(!_children.empty()) {
@ -272,6 +281,30 @@ struct XMLNode : public String
return ""; return "";
} }
/// convenient value access in children node
String value(const String& name, const String& attr_name) const
{
XMLNode* node = find_first(name);
if (node)
return (*node)[attr_name];
else
return "";
}
/// convenient storage of distinct values in children node
String& value(const String& name, const String& attr_name)
{
XMLNode* node = find_first(name);
if (!node) {
node = new XMLNode(name);
add_child(node);
}
return (*node)[attr_name];
}
const Children& get_children() const const Children& get_children() const
{ {
return _children; return _children;
@ -470,6 +503,12 @@ struct XMLPos
: _root(root), : _root(root),
_cur(root) _cur(root)
{ {
}
XMLPos(const XMLPos& other)
: _root(other._root),
_cur(other._cur)
{ // don't copy _stack
} }
/// access to current node /// access to current node
@ -556,28 +595,6 @@ struct XMLPos
} }
} }
String& value(const String& name, const String& attr_name)
{
XMLNode* node = _cur->find_first(name);
if (!node) {
node = new XMLNode(name);
_cur->add_child(node);
}
return (*node)[attr_name];
}
String value(const String& name, const String& attr_name) const
{
XMLNode* node = _cur->find_first(name);
if (node)
return (*node)[attr_name];
else
return "";
}
protected: protected:
XMLNode* _root; XMLNode* _root;
XMLNode* _cur; XMLNode* _cur;
@ -599,14 +616,22 @@ struct XMLBool
{ {
} }
XMLBool(LPCTSTR value) XMLBool(LPCTSTR value, bool def=false)
{ {
_value = !_tcsicmp(value, TEXT("TRUE")); if (value && *value)
_value = !_tcsicmp(value, TEXT("TRUE"));
else
_value = def;
} }
XMLBool(XMLPos& pos, const String& name, const String& attr_name) XMLBool(XMLNode* node, const String& name, const String& attr_name, bool def=false)
{ {
_value = !_tcsicmp(pos.value(name, attr_name), TEXT("TRUE")); const String& value = node->value(name, attr_name);
if (!value.empty())
_value = !_tcsicmp(value, TEXT("TRUE"));
else
_value = def;
} }
operator bool() const operator bool() const
@ -628,18 +653,35 @@ private:
struct XMLBoolRef struct XMLBoolRef
{ {
XMLBoolRef(XMLPos& pos, const String& name, const String& attr_name) XMLBoolRef(XMLNode* node, const String& name, const String& attr_name, bool def=false)
: _ref(pos.value(name, attr_name)) : _ref(node->value(name, attr_name))
{ {
if (_ref.empty())
assign(def);
}
operator bool() const
{
return !_tcsicmp(_ref, TEXT("TRUE"));
} }
XMLBoolRef& operator=(bool value) XMLBoolRef& operator=(bool value)
{ {
_ref.assign(value? TEXT("TRUE"): TEXT("FALSE")); assign(value);
return *this; return *this;
} }
void assign(bool value)
{
_ref.assign(value? TEXT("TRUE"): TEXT("FALSE"));
}
void toggle()
{
assign(!operator bool());
}
protected: protected:
String& _ref; String& _ref;
}; };
@ -652,14 +694,22 @@ struct XMLNumber
{ {
} }
XMLNumber(LPCTSTR value) XMLNumber(LPCTSTR value, int def=0)
{ {
_value = _ttoi(value); if (value && *value)
_value = _ttoi(value);
else
_value = def;
} }
XMLNumber(XMLPos& pos, const String& name, const String& attr_name) XMLNumber(XMLNode* node, const String& name, const String& attr_name, int def=0)
{ {
_value = _ttoi(pos.value(name, attr_name)); const String& value = node->value(name, attr_name);
if (!value.empty())
_value = _ttoi(node->value(name, attr_name));
else
_value = def;
} }
operator int() const operator int() const
@ -683,19 +733,31 @@ private:
struct XMLNumberRef struct XMLNumberRef
{ {
XMLNumberRef(XMLPos& pos, const String& name, const String& attr_name) XMLNumberRef(XMLNode* node, const String& name, const String& attr_name, int def=0)
: _ref(pos.value(name, attr_name)) : _ref(node->value(name, attr_name))
{ {
if (_ref.empty())
assign(def);
} }
XMLNumberRef& operator=(int value) XMLNumberRef& operator=(int value)
{
assign(value);
return *this;
}
operator int() const
{
return _ttoi(_ref);
}
void assign(int value)
{ {
TCHAR buffer[32]; TCHAR buffer[32];
_stprintf(buffer, TEXT("%d"), value); _stprintf(buffer, TEXT("%d"), value);
_ref.assign(buffer); _ref.assign(buffer);
return *this;
} }
protected: protected: