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
doxygen
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 << "'; + } 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 << "'; - } else { - out << "/>"; - } - - if (format) - out << '\n'; - else - out << _trailing; - - return out; + out << "\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 << "'; - } 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());