X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8907154c1a8a6882c6797d1f16393ddfb23e7f3a..3b2cb4316b4deca34ae451493449e97e4bdb3f3b:/utils/wxrc/wxrc.cpp diff --git a/utils/wxrc/wxrc.cpp b/utils/wxrc/wxrc.cpp index 5414a3f4c2..8ac5aaef2f 100644 --- a/utils/wxrc/wxrc.cpp +++ b/utils/wxrc/wxrc.cpp @@ -27,7 +27,9 @@ #include "wx/filename.h" #include "wx/wfstream.h" #include "wx/utils.h" +#include "wx/hashset.h" +WX_DECLARE_HASH_SET(wxString, wxStringHash, wxStringEqual, StringSet); class XRCWidgetData { @@ -43,13 +45,14 @@ private: #include "wx/arrimpl.cpp" WX_DECLARE_OBJARRAY(XRCWidgetData,ArrayOfXRCWidgetData); -WX_DEFINE_OBJARRAY(ArrayOfXRCWidgetData); +WX_DEFINE_OBJARRAY(ArrayOfXRCWidgetData) class XRCWndClassData { private: wxString m_className; wxString m_parentClassName; + StringSet m_ancestorClassNames; ArrayOfXRCWidgetData m_wdata; void BrowseXmlNode(wxXmlNode* node) @@ -73,9 +76,31 @@ private: } public: - XRCWndClassData(const wxString& className,const wxString& parentClassName, const wxXmlNode* node) : + XRCWndClassData(const wxString& className, + const wxString& parentClassName, + const wxXmlNode* node) : m_className(className) , m_parentClassName(parentClassName) { + if ( className == _T("wxMenu") ) + { + m_ancestorClassNames.insert(_T("wxMenu")); + m_ancestorClassNames.insert(_T("wxMenuBar")); + } + else if ( className == _T("wxMDIChildFrame") ) + { + m_ancestorClassNames.insert(_T("wxMDIParentFrame")); + } + else if( className == _T("wxMenuBar") || + className == _T("wxStatusBar") || + className == _T("wxToolBar") ) + { + m_ancestorClassNames.insert(_T("wxFrame")); + } + else + { + m_ancestorClassNames.insert(_T("wxWindow")); + } + BrowseXmlNode(node->GetChildren()); } @@ -113,8 +138,8 @@ public: _T(" ") + w.GetClass() + _T("* ") + w.GetName() + _T(";\n")); } - file.Write(_T("\nprivate:\n void InitWidgetsFromXRC(){\n") - _T(" wxXmlResource::Get()->LoadObject(this,NULL,_T(\"") + file.Write(_T("\nprivate:\n void InitWidgetsFromXRC(wxWindow *parent){\n") + _T(" wxXmlResource::Get()->LoadObject(this,parent,_T(\"") + m_className + _T("\"), _T(\"") + m_parentClassName @@ -130,25 +155,46 @@ public: + w.GetName() + _T("\",") + w.GetClass() - + _T(");\n") - ); + + _T(");\n")); } file.Write(_T(" }\n")); - file.Write( - _T("public:\n") - + m_className - + _T("::") - + m_className - + _T("(){\n") - + _T(" InitWidgetsFromXRC();\n") - _T(" }\n") - _T("};\n") - ); - }; + file.Write( _T("public:\n")); + + if ( m_ancestorClassNames.size() == 1 ) + { + file.Write + ( + m_className + + _T("(") + + *m_ancestorClassNames.begin() + + _T(" *parent=NULL){\n") + + _T(" InitWidgetsFromXRC((wxWindow *)parent);\n") + _T(" }\n") + _T("};\n") + ); + } + else + { + file.Write(m_className + _T("(){\n") + + _T(" InitWidgetsFromXRC(NULL);\n") + _T(" }\n") + _T("};\n")); + + for ( StringSet::const_iterator it = m_ancestorClassNames.begin(); + it != m_ancestorClassNames.end(); + ++it ) + { + file.Write(m_className + _T("(") + *it + _T(" *parent){\n") + + _T(" InitWidgetsFromXRC((wxWindow *)parent);\n") + _T(" }\n") + _T("};\n")); + } + } + } }; WX_DECLARE_OBJARRAY(XRCWndClassData,ArrayOfXRCWndClassData); -WX_DEFINE_OBJARRAY(ArrayOfXRCWndClassData); +WX_DEFINE_OBJARRAY(ArrayOfXRCWndClassData) class XmlResApp : public wxAppConsole @@ -381,28 +427,30 @@ wxArrayString XmlResApp::PrepareTempFiles() // Does 'node' contain filename information at all? static bool NodeContainsFilename(wxXmlNode *node) { - // Any bitmaps: - if (node->GetName() == _T("bitmap")) + const wxString name = node->GetName(); + + // Any bitmaps (bitmap2 is used for disabled toolbar buttons): + if ( name == _T("bitmap") || name == _T("bitmap2") ) return true; - if (node->GetName() == _T("icon")) + if ( name == _T("icon") ) return true; // URLs in wxHtmlWindow: - if (node->GetName() == _T("url")) + if ( name == _T("url") ) return true; // wxBitmapButton: wxXmlNode *parent = node->GetParent(); if (parent != NULL && parent->GetPropVal(_T("class"), _T("")) == _T("wxBitmapButton") && - (node->GetName() == _T("focus") || - node->GetName() == _T("disabled") || - node->GetName() == _T("selected"))) + (name == _T("focus") || + name == _T("disabled") || + name == _T("selected"))) return true; // wxBitmap or wxIcon toplevel resources: - if (node->GetName() == _T("object")) + if ( name == _T("object") ) { wxString klass = node->GetPropVal(_T("class"), wxEmptyString); if (klass == _T("wxBitmap") || klass == _T("wxIcon")) @@ -502,8 +550,9 @@ static wxString FileToCppArray(wxString filename, int num) wxFFile file(filename, wxT("rb")); wxFileOffset offset = file.Length(); wxASSERT_MSG( offset >= 0 , wxT("Invalid file length") ); - wxASSERT_MSG( offset == wxFileOffset(size_t(offset)) , wxT("Huge file not supported") ); - size_t lng = (size_t)offset; + + const size_t lng = wx_truncate_cast(size_t, offset); + wxASSERT_MSG( lng == offset, wxT("Huge file not supported") ); snum.Printf(_T("%i"), num); output.Printf(_T("static size_t xml_res_size_") + snum + _T(" = %i;\n"), lng); @@ -628,8 +677,9 @@ static wxString FileToPythonArray(wxString filename, int num) wxFFile file(filename, wxT("rb")); wxFileOffset offset = file.Length(); wxASSERT_MSG( offset >= 0 , wxT("Invalid file length") ); - wxASSERT_MSG( offset == wxFileOffset(size_t(offset)) , wxT("Huge file not supported") ); - size_t lng = (size_t)offset; + + const size_t lng = wx_truncate_cast(size_t, offset); + wxASSERT_MSG( offset == lng, wxT("Huge file not supported") ); snum.Printf(_T("%i"), num); output = _T(" xml_res_file_") + snum + _T(" = '''\\\n");