X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/be575a01602461b291a47e178272aaf0c673c818..084ad0c2424aa998a640c151f8fa762435364449:/utils/wxrc/wxrc.cpp diff --git a/utils/wxrc/wxrc.cpp b/utils/wxrc/wxrc.cpp index b487d6bd17..8ac5aaef2f 100644 --- a/utils/wxrc/wxrc.cpp +++ b/utils/wxrc/wxrc.cpp @@ -8,11 +8,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(__APPLE__) - #pragma implementation - #pragma interface -#endif - // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" @@ -32,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 { @@ -48,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) @@ -78,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()); } @@ -118,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 @@ -135,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 @@ -197,21 +238,21 @@ int XmlResApp::OnRun() { { wxCMD_LINE_SWITCH, _T("h"), _T("help"), _T("show help message"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, - { wxCMD_LINE_SWITCH, _T("v"), _T("verbose"), _T("be verbose") }, - { wxCMD_LINE_SWITCH, _T("e"), _T("extra-cpp-code"), _T("output C++ header file with XRC derived classes") }, - { wxCMD_LINE_SWITCH, _T("c"), _T("cpp-code"), _T("output C++ source rather than .rsc file") }, - { wxCMD_LINE_SWITCH, _T("p"), _T("python-code"), _T("output wxPython source rather than .rsc file") }, - { wxCMD_LINE_SWITCH, _T("g"), _T("gettext"), _T("output list of translatable strings (to stdout or file if -o used)") }, - { wxCMD_LINE_OPTION, _T("n"), _T("function"), _T("C++/Python function name (with -c or -p) [InitXmlResource]") }, - { wxCMD_LINE_OPTION, _T("o"), _T("output"), _T("output file [resource.xrs/cpp]") }, + { wxCMD_LINE_SWITCH, _T("v"), _T("verbose"), _T("be verbose"), (wxCmdLineParamType)0, 0 }, + { wxCMD_LINE_SWITCH, _T("e"), _T("extra-cpp-code"), _T("output C++ header file with XRC derived classes"), (wxCmdLineParamType)0, 0 }, + { wxCMD_LINE_SWITCH, _T("c"), _T("cpp-code"), _T("output C++ source rather than .rsc file"), (wxCmdLineParamType)0, 0 }, + { wxCMD_LINE_SWITCH, _T("p"), _T("python-code"), _T("output wxPython source rather than .rsc file"), (wxCmdLineParamType)0, 0 }, + { wxCMD_LINE_SWITCH, _T("g"), _T("gettext"), _T("output list of translatable strings (to stdout or file if -o used)"), (wxCmdLineParamType)0, 0 }, + { wxCMD_LINE_OPTION, _T("n"), _T("function"), _T("C++/Python function name (with -c or -p) [InitXmlResource]"), (wxCmdLineParamType)0, 0 }, + { wxCMD_LINE_OPTION, _T("o"), _T("output"), _T("output file [resource.xrs/cpp]"), (wxCmdLineParamType)0, 0 }, #if 0 // not yet implemented - { wxCMD_LINE_OPTION, _T("l"), _T("list-of-handlers", _T("output list of neccessary handlers to this file" }, + { wxCMD_LINE_OPTION, _T("l"), _T("list-of-handlers"), _T("output list of necessary handlers to this file"), (wxCmdLineParamType)0, 0 }, #endif { wxCMD_LINE_PARAM, NULL, NULL, _T("input file(s)"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_OPTION_MANDATORY }, - { wxCMD_LINE_NONE } + { wxCMD_LINE_NONE, NULL, NULL, NULL, (wxCmdLineParamType)0, 0 } }; wxCmdLineParser parser(cmdLineDesc, argc, argv); @@ -386,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")) @@ -507,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); @@ -633,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");