diff --git a/reactos/subsys/system/explorer/doxy-footer.html b/reactos/subsys/system/explorer/doxy-footer.html
index 1552db4afb1..451e0f066b6 100644
--- a/reactos/subsys/system/explorer/doxy-footer.html
+++ b/reactos/subsys/system/explorer/doxy-footer.html
@@ -3,7 +3,7 @@
ROS Explorer Source Code Documentation
- generated on 27.03.2004 by
+ generated on 28.03.2004 by
|
diff --git a/reactos/subsys/system/explorer/explorer-cfg-template.xml b/reactos/subsys/system/explorer/explorer-cfg-template.xml
index feddd349456..98feb73007b 100644
--- a/reactos/subsys/system/explorer/explorer-cfg-template.xml
+++ b/reactos/subsys/system/explorer/explorer-cfg-template.xml
@@ -20,6 +20,7 @@
+
diff --git a/reactos/subsys/system/explorer/taskbar/traynotify.cpp b/reactos/subsys/system/explorer/taskbar/traynotify.cpp
index c788b71117d..d964514e8f4 100644
--- a/reactos/subsys/system/explorer/taskbar/traynotify.cpp
+++ b/reactos/subsys/system/explorer/taskbar/traynotify.cpp
@@ -195,6 +195,8 @@ void NotifyArea::read_config()
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) {
@@ -227,13 +229,14 @@ void NotifyArea::read_config()
void NotifyArea::write_config()
{
- // write notification icon settings to XML configuration
+ // write notification icon settings to XML configuration file
XMLPos pos(&g_Globals._cfg);
- ///@todo pos.create("\\explorer-cfg\\startmenu");
pos.create("explorer-cfg");
pos.create("notify-icons");
+ XMLBoolRef(pos, "option", "show-hidden") = _show_hidden;
+
for(NotifyIconCfgList::iterator it=_cfg.begin(); it!=_cfg.end(); ++it) {
NotifyIconConfig& cfg = *it;
diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.cpp b/reactos/subsys/system/explorer/utility/xmlstorage.cpp
index 2acf857b160..5f995d0a4ed 100644
--- a/reactos/subsys/system/explorer/utility/xmlstorage.cpp
+++ b/reactos/subsys/system/explorer/utility/xmlstorage.cpp
@@ -133,14 +133,33 @@ std::string XMLString(LPCTSTR s)
}
- /// write node with children tree to output stream
-std::ostream& XMLNode::write_worker(std::ostream& out, WRITE_MODE mode, int indent)
+ /// write node with children tree to output stream using original white space
+void XMLNode::write_worker(std::ostream& out, WRITE_MODE mode, int indent) const
{
- bool format = mode==FORMAT_PRETTY;
+ out << '<' << XMLString(*this);
- if (format)
- for(int i=indent; i--; )
- out << XML_INDENT_SPACE;
+ for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it)
+ out << ' ' << XMLString(it->first) << "=\"" << XMLString(it->second) << "\"";
+
+ if (!_children.empty() || !_content.empty()) {
+ out << '>' << _content;
+
+ for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
+ (*it)->write_worker(out, mode, indent+1);
+
+ out << "" << XMLString(*this) << '>';
+ } else
+ out << "/>";
+
+ out << _trailing;
+}
+
+
+ /// pretty print node with children tree to output stream
+void XMLNode::pretty_write_worker(std::ostream& out, WRITE_MODE mode, int indent) const
+{
+ for(int i=indent; i--; )
+ out << XML_INDENT_SPACE;
out << '<' << XMLString(*this);
@@ -148,36 +167,23 @@ std::ostream& XMLNode::write_worker(std::ostream& out, WRITE_MODE mode, int inde
out << ' ' << XMLString(it->first) << "=\"" << XMLString(it->second) << "\"";
if (!_children.empty() || !_content.empty()) {
- out << '>';
-
- if (format)
- out << '\n';
- else
- out << _content;
+ out << ">\n";
for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
- (*it)->write_worker(out, mode, indent+1);
+ (*it)->pretty_write_worker(out, mode, indent+1);
- if (format)
- for(int i=indent; i--; )
- out << XML_INDENT_SPACE;
+ for(int i=indent; i--; )
+ out << XML_INDENT_SPACE;
- out << "" << XMLString(*this) << '>';
- } else {
- out << "/>";
- }
-
- if (format)
- out << '\n';
- else
- out << _trailing;
-
- return out;
+ out << "" << XMLString(*this) << ">\n";
+ } else
+ out << "/>\n";
}
+
/// write node with children tree to output stream using smart formating
-std::ostream& XMLNode::smart_write_worker(std::ostream& out, int indent, bool& next_format)
+bool XMLNode::smart_write_worker(std::ostream& out, int indent, bool next_format) const
{
bool format_pre, format_mid, format_post;
@@ -208,7 +214,7 @@ std::ostream& XMLNode::smart_write_worker(std::ostream& out, int indent, bool& n
next_format = (*it)->_content.empty() && (*it)->_trailing.empty();
for(; it!=_children.end(); ++it)
- (*it)->smart_write_worker(out, indent+1, next_format);
+ next_format = (*it)->smart_write_worker(out, indent+1, next_format);
}
if (next_format)
@@ -216,18 +222,15 @@ std::ostream& XMLNode::smart_write_worker(std::ostream& out, int indent, bool& n
out << XML_INDENT_SPACE;
out << "" << XMLString(*this) << '>';
- } else {
+ } else
out << "/>";
- }
if (format_post)
out << '\n';
else
out << _trailing;
- next_format = format_post;
-
- return out;
+ return format_post;
}
diff --git a/reactos/subsys/system/explorer/utility/xmlstorage.h b/reactos/subsys/system/explorer/utility/xmlstorage.h
index ac2df696293..41378e149a1 100644
--- a/reactos/subsys/system/explorer/utility/xmlstorage.h
+++ b/reactos/subsys/system/explorer/utility/xmlstorage.h
@@ -289,15 +289,22 @@ struct XMLNode : public String
};
/// write node with children tree to output stream
- std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART, int indent=0)
+ std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART, int indent=0) const
{
- if (mode) {
- return write_worker(out, mode, indent);
- } else { // FORMAT_SMART
- bool next_format = _content.empty() && _trailing.empty();
+ switch(mode) {
+ case FORMAT_PRETTY:
+ pretty_write_worker(out, mode, indent);
+ break;
- return smart_write_worker(out, indent, next_format);
+ case FORMAT_ORIGINAL:
+ write_worker(out, mode, indent);
+ break;
+
+ default: // FORMAT_SMART
+ smart_write_worker(out, indent, _content.empty() && _trailing.empty());
}
+
+ return out;
}
protected:
@@ -352,8 +359,9 @@ protected:
_children.back()->_trailing.append(s, l);
}
- std::ostream& write_worker(std::ostream& out, WRITE_MODE mode, int indent);
- std::ostream& smart_write_worker(std::ostream& out, int indent, bool& next_format);
+ void write_worker(std::ostream& out, WRITE_MODE mode, int indent) const;
+ void pretty_write_worker(std::ostream& out, WRITE_MODE mode, int indent) const;
+ bool smart_write_worker(std::ostream& out, int indent, bool next_format) const;
};
@@ -520,6 +528,9 @@ struct XMLPos
return false;
}
+ /// move X-Path like to position in XML tree
+ bool go(const char* path);
+
/// create node if not already existing and move to it
void create(const String& name)
{
@@ -545,7 +556,27 @@ struct XMLPos
}
}
- bool go(const char* path);
+ 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:
XMLNode* _root;
@@ -561,6 +592,117 @@ protected:
};
+struct XMLBool
+{
+ XMLBool(bool value)
+ : _value(value)
+ {
+ }
+
+ XMLBool(LPCTSTR value)
+ {
+ _value = !_tcsicmp(value, TEXT("TRUE"));
+ }
+
+ XMLBool(XMLPos& pos, const String& name, const String& attr_name)
+ {
+ _value = !_tcsicmp(pos.value(name, attr_name), TEXT("TRUE"));
+ }
+
+ operator bool() const
+ {
+ return _value;
+ }
+
+ operator LPCTSTR() const
+ {
+ return _value? TEXT("TRUE"): TEXT("FALSE");
+ }
+
+protected:
+ bool _value;
+
+private:
+ void operator=(const XMLBool&); // disallow assignment operations
+};
+
+struct XMLBoolRef
+{
+ XMLBoolRef(XMLPos& pos, const String& name, const String& attr_name)
+ : _ref(pos.value(name, attr_name))
+ {
+ }
+
+ XMLBoolRef& operator=(bool value)
+ {
+ _ref.assign(value? TEXT("TRUE"): TEXT("FALSE"));
+
+ return *this;
+ }
+
+protected:
+ String& _ref;
+};
+
+
+struct XMLNumber
+{
+ XMLNumber(int value)
+ : _value(value)
+ {
+ }
+
+ XMLNumber(LPCTSTR value)
+ {
+ _value = _ttoi(value);
+ }
+
+ XMLNumber(XMLPos& pos, const String& name, const String& attr_name)
+ {
+ _value = _ttoi(pos.value(name, attr_name));
+ }
+
+ operator int() const
+ {
+ return _value;
+ }
+
+ operator String() const
+ {
+ TCHAR buffer[32];
+ _stprintf(buffer, TEXT("%d"), _value);
+ return buffer;
+ }
+
+protected:
+ int _value;
+
+private:
+ void operator=(const XMLBool&); // disallow assignment operations
+};
+
+struct XMLNumberRef
+{
+ XMLNumberRef(XMLPos& pos, const String& name, const String& attr_name)
+ : _ref(pos.value(name, attr_name))
+ {
+ }
+
+ XMLNumberRef& operator=(int value)
+ {
+ TCHAR buffer[32];
+
+ _stprintf(buffer, TEXT("%d"), value);
+ _ref.assign(buffer);
+
+ return *this;
+ }
+
+protected:
+ String& _ref;
+};
+
+
#ifdef _MSC_VER
#pragma warning(disable: 4355)
#endif
@@ -672,7 +814,7 @@ struct XMLDoc : public XMLNode
/// write XML stream preserving previous white space and comments
std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART,
- const std::string& xml_version="1.0", const std::string& encoding="UTF-8")
+ const std::string& xml_version="1.0", const std::string& encoding="UTF-8") const
{
out << "\n";
@@ -683,20 +825,20 @@ struct XMLDoc : public XMLNode
}
/// write XML stream with formating
- std::ostream& write_formating(std::ostream& out)
+ std::ostream& write_formating(std::ostream& out) const
{
return write(out, FORMAT_PRETTY);
}
void write(const std::string& path, WRITE_MODE mode=FORMAT_SMART,
- const std::string& xml_version="1.0", const std::string& encoding="UTF-8")
+ const std::string& xml_version="1.0", const std::string& encoding="UTF-8") const
{
std::ofstream out(path.c_str());
write(out, mode, xml_version, encoding);
}
- void write_formating(const std::string& path)
+ void write_formating(const std::string& path) const
{
std::ofstream out(path.c_str());