X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0a0be6d5a807d9295065cf9b40cd0dd5946c82be..37a4035b5fc118632ada28932d74a91ee0ce4cb3:/utils/wxrc/wxrc.cpp diff --git a/utils/wxrc/wxrc.cpp b/utils/wxrc/wxrc.cpp index 7b74deabc6..92be406592 100644 --- a/utils/wxrc/wxrc.cpp +++ b/utils/wxrc/wxrc.cpp @@ -1,7 +1,7 @@ ///////////////////////////////////////////////////////////////////////////// // Name: wxrc.cpp // Purpose: XML resource compiler -// Author: Vaclav Slavik +// Author: Vaclav Slavik, Eduardo Marques // Created: 2000/03/05 // RCS-ID: $Id$ // Copyright: (c) 2000 Vaclav Slavik @@ -20,10 +20,10 @@ #pragma hdrstop #endif -// for all others, include the necessary headers (this file is usually all you -// need because it includes almost all "standard" wxWindows headers +// for all others, include the necessary headers #ifndef WX_PRECOMP - #include "wx/wx.h" + #include "wx/app.h" + #include "wx/log.h" #endif #include "wx/cmdline.h" @@ -33,16 +33,132 @@ #include "wx/wfstream.h" +class XRCWidgetData +{ +public: + XRCWidgetData(const wxString& vname,const wxString& vclass) + : m_class(vclass), m_name(vname) {} + const wxString& GetName() const { return m_name; } + const wxString& GetClass() const { return m_class; } +private: + wxString m_class; + wxString m_name; +}; +#include "wx/arrimpl.cpp" +WX_DECLARE_OBJARRAY(XRCWidgetData,ArrayOfXRCWidgetData); +WX_DEFINE_OBJARRAY(ArrayOfXRCWidgetData); + +class XRCWndClassData +{ +private: + wxString m_className; + wxString m_parentClassName; + ArrayOfXRCWidgetData m_wdata; + + void BrowseXmlNode(wxXmlNode* node) + { + wxString classValue; + wxString nameValue; + wxXmlNode* children; + while (node) + { + if (node->GetName() == _T("object") + && node->GetPropVal(_T("class"),&classValue) + && node->GetPropVal(_T("name"),&nameValue)) + { + m_wdata.Add(XRCWidgetData(nameValue,classValue)); + } + children = node->GetChildren(); + if (children) + BrowseXmlNode(children); + node = node->GetNext(); + } + } + +public: + XRCWndClassData(const wxString& className,const wxString& parentClassName, const wxXmlNode* node) : + m_className(className) , m_parentClassName(parentClassName) { + + BrowseXmlNode(node->GetChildren()); + + } + + const ArrayOfXRCWidgetData& GetWidgetData(){ + return m_wdata; + } + + bool IsRealClass(const wxString& name) + { + if (name == _T("tool") || name == _T("unknown") || + name == _T("notebookpage") || name == _T("separator") || + name == _T("sizeritem") || + name == _T("wxMenuItem")) + { + return false; + } + return true; + } + + void GenerateHeaderCode(wxFFile& file) + { + + file.Write(_T("class ") + m_className + _T(" : public ") + m_parentClassName + + _T(" {\nprotected:\n")); + size_t i; + for(i=0;iLoadObject(this,NULL,\"") + + m_className + + _T("\",\"") + + m_parentClassName + + _T("\");\n")); + for(i=0;iGetChildren(); + wxString classValue,nameValue; + while(node){ + if(node->GetName() == _T("object") + && node->GetPropVal(_T("class"),&classValue) + && node->GetPropVal(_T("name"),&nameValue)){ + + aXRCWndClassData.Add( + XRCWndClassData(nameValue,classValue,node) + ); + } + node = node -> GetNext(); + } + } wxString internalName = GetInternalFileName(parFiles[i], flist); - + doc.Save(parOutputPath + wxFILE_SEP_PATH + internalName); flist.Add(internalName); } - + return flist; } @@ -254,30 +398,30 @@ static bool NodeContainsFilename(wxXmlNode *node) { // Any bitmaps: if (node->GetName() == _T("bitmap")) - return TRUE; + return true; // URLs in wxHtmlWindow: if (node->GetName() == _T("url")) - return TRUE; - + return true; + // wxBitmapButton: wxXmlNode *parent = node->GetParent(); - if (parent != NULL && + if (parent != NULL && parent->GetPropVal(_T("class"), _T("")) == _T("wxBitmapButton") && - (node->GetName() == _T("focus") || + (node->GetName() == _T("focus") || node->GetName() == _T("disabled") || node->GetName() == _T("selected"))) - return TRUE; - + return true; + // wxBitmap or wxIcon toplevel resources: if (node->GetName() == _T("object")) { wxString klass = node->GetPropVal(_T("class"), wxEmptyString); if (klass == _T("wxBitmap") || klass == _T("wxIcon")) - return TRUE; + return true; } - - return FALSE; + + return false; } // find all files mentioned in structure, e.g. filename @@ -293,7 +437,7 @@ void XmlResApp::FindFilesInXML(wxXmlNode *node, wxArrayString& flist, const wxSt while (n) { if (containsFilename && - (n->GetType() == wxXML_TEXT_NODE || + (n->GetType() == wxXML_TEXT_NODE || n->GetType() == wxXML_CDATA_SECTION_NODE)) { wxString fullname; @@ -302,7 +446,7 @@ void XmlResApp::FindFilesInXML(wxXmlNode *node, wxArrayString& flist, const wxSt else fullname = inputPath + wxFILE_SEP_PATH + n->GetContent(); - if (flagVerbose) + if (flagVerbose) wxPrintf(_T("adding ") + fullname + _T("...\n")); wxString filename = GetInternalFileName(n->GetContent(), flist); @@ -337,19 +481,19 @@ void XmlResApp::DeleteTempFiles(const wxArrayString& flist) void XmlResApp::MakePackageZIP(const wxArrayString& flist) { wxString files; - + for (size_t i = 0; i < flist.Count(); i++) files += flist[i] + _T(" "); files.RemoveLast(); - - if (flagVerbose) + + if (flagVerbose) wxPrintf(_T("compressing ") + parOutput + _T("...\n")); - + wxString cwd = wxGetCwd(); wxSetWorkingDirectory(parOutputPath); - int execres = wxExecute(_T("zip -9 -j ") + - wxString(flagVerbose ? _T("") : _T("-q ")) + - parOutput + _T(" ") + files, TRUE); + int execres = wxExecute(_T("zip -9 -j ") + + wxString(flagVerbose ? _T("") : _T("-q ")) + + parOutput + _T(" ") + files, true); wxSetWorkingDirectory(cwd); if (execres == -1) { @@ -362,7 +506,6 @@ void XmlResApp::MakePackageZIP(const wxArrayString& flist) - static wxString FileToCppArray(wxString filename, int num) { wxString output; @@ -370,16 +513,16 @@ static wxString FileToCppArray(wxString filename, int num) wxString snum; wxFFile file(filename, wxT("rb")); size_t lng = file.Length(); - + snum.Printf(_T("%i"), num); output.Printf(_T("static size_t xml_res_size_") + snum + _T(" = %i;\n"), lng); output += _T("static unsigned char xml_res_file_") + snum + _T("[] = {\n"); // we cannot use string literals because MSVC is dumb wannabe compiler // with arbitrary limitation to 2048 strings :( - + unsigned char *buffer = new unsigned char[lng]; file.Read(buffer, lng); - + for (size_t i = 0, linelng = 0; i < lng; i++) { tmp.Printf(_T("%i"), buffer[i]); @@ -392,11 +535,11 @@ static wxString FileToCppArray(wxString filename, int num) output << tmp; linelng += tmp.Length()+1; } - + delete[] buffer; - + output += _T("};\n\n"); - + return output; } @@ -406,9 +549,9 @@ void XmlResApp::MakePackageCPP(const wxArrayString& flist) wxFFile file(parOutput, wxT("wt")); size_t i; - if (flagVerbose) + if (flagVerbose) wxPrintf(_T("creating C++ source file ") + parOutput + _T("...\n")); - + file.Write(_T("") _T("//\n") _T("// This file was automatically generated by wxrc, do not edit by hand.\n") @@ -432,7 +575,7 @@ _T("\n")); for (i = 0; i < flist.Count(); i++) file.Write( FileToCppArray(parOutputPath + wxFILE_SEP_PATH + flist[i], i)); - + file.Write(_T("") _T("void ") + parFuncname + wxT("()\n") _T("{\n") @@ -461,12 +604,34 @@ _T("\n")); file.Write(_T(" wxXmlResource::Get()->Load(wxT(\"memory:XRC_resource/") + GetInternalFileName(parFiles[i], flist) + _T("\"));\n")); } - + file.Write(_T("}\n")); } +void XmlResApp::GenCPPHeader() +{ + wxString fileSpec = ((parOutput.BeforeLast('.')).AfterLast('/')).AfterLast('\\'); + wxString heaFileName = fileSpec + _T(".h"); + + wxFFile file(heaFileName, wxT("wt")); + file.Write( +_T("//\n") +_T("// This file was automatically generated by wxrc, do not edit by hand.\n") +_T("//\n\n") +_T("#ifndef __") + fileSpec + _T("_h__\n") +_T("#define __") + fileSpec + _T("_h__\n") +); + for(size_t i=0;iGetChildren(); - + while (n) { if ((node->GetType() == wxXML_ELEMENT_NODE) && // parent is an element, i.e. has subnodes... - (n->GetType() == wxXML_TEXT_NODE || + (n->GetType() == wxXML_TEXT_NODE || n->GetType() == wxXML_CDATA_SECTION_NODE) && // ...it is textnode... ( @@ -652,16 +819,20 @@ wxArrayString XmlResApp::FindStrings(wxXmlNode *node) )) // ...and known to contain translatable string { - arr.Add(ConvertText(n->GetContent())); + if (!flagGettext || + node->GetPropVal(_T("translate"), _T("1")) != _T("0")) + { + arr.Add(ConvertText(n->GetContent())); + } } - + // subnodes: if (n->GetType() == wxXML_ELEMENT_NODE) { wxArrayString a2 = FindStrings(n); WX_APPEND_ARRAY(arr, a2); } - + n = n->GetNext(); } return arr;