// wxr2xml.cpp: implementation of the wxWxr2Xml class. // 8/30/00 Brian Gavin // only tested on wxMSW so far ////////////////////////////////////////////////////////////////////// /* TODO port to wxGTK should be very easy support fonts add unsupported controls when XML format adds them */ #ifdef __GNUG__ #pragma implementation "wxr2xml.h" #endif // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "wxr2xml.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// wxWxr2Xml::wxWxr2Xml() { } wxWxr2Xml::~wxWxr2Xml() { } bool wxWxr2Xml::Convert(wxString wxrfile, wxString xmlfile) { bool result; result=m_xmlfile.Open(xmlfile.c_str(),"w+t"); wxASSERT_MSG(result,"Couldn't create XML file"); if (!result) return FALSE; result=m_table.ParseResourceFile(wxrfile); wxASSERT_MSG(result,"Couldn't Load WXR file"); if (!result) return FALSE; //Write basic xml header m_xmlfile.Write("\n"); m_xmlfile.Write("\n"); result=ParseResources(); m_xmlfile.Write("\n"); m_xmlfile.Close(); return result; } bool wxWxr2Xml::ParseResources() { m_table.BeginFind(); wxNode *node; while ((node = m_table.Next())) { wxItemResource *res = (wxItemResource *)node->Data(); wxString resType(res->GetType()); if (resType=="wxDialog") ParseDialog(res); else if (resType=="wxPanel") ParsePanel(res); else if (resType=="wxPanel") ParsePanel(res); else if (resType=="wxMenu") ParseMenuBar(res); else if (resType=="wxBitmap") ParseBitmap(res); else wxLogError("Found unsupported resource "+resType); } return TRUE; } void wxWxr2Xml::ParsePanel(wxItemResource *res) { m_xmlfile.Write(" \n"); ParseControls(res); m_xmlfile.Write(" \n"); m_xmlfile.Write(" \n"); } void wxWxr2Xml::ParseDialog(wxItemResource *res) { PanelStuff(res); m_xmlfile.Write(" \n"); ParseControls(res); m_xmlfile.Write(" \n"); m_xmlfile.Write(" \n"); } void wxWxr2Xml::ParseControls(wxItemResource *res) { wxNode *node = res->GetChildren().First(); while (node) { wxItemResource *res = (wxItemResource *)node->Data(); wxString resType(res->GetType()); if (resType=="wxButton") ParseButton(res); else if ((resType=="wxTextCtrl")|(resType=="wxText") |(resType=="wxMultiText")) ParseTextCtrl(res); else if (resType=="wxCheckBox") ParseCheckBox(res); else if (resType=="wxRadioBox") ParseRadioBox(res); else if (resType=="wxListBox") ParseListBox(res); else if ((resType=="wxStaticText")|(resType=="wxMessage")) ParseStaticText(res); else if (resType=="wxChoice") ParseChoice(res); else if (resType=="wxGauge") ParseGauge(res); else if (resType=="wxSlider") ParseSlider(res); else if (resType=="wxComboBox") ParseComboBox(res); else if (resType=="wxRadioButton") ParseRadioButton(res); else if (resType=="wxStaticBitmap") ParseStaticBitmap(res); else if (resType=="wxScrollBar") wxLogError("wxScrollBar unsupported"); else if ((resType=="wxStaticBox")|(resType=="wxGroupBox")) wxLogError("wxStaticBox unsupported"); else if (resType=="wxBitmapButton") wxLogError("wxBitmapButton unsupported"); else wxLogError("Found unsupported resource "+resType); node = node->Next(); } } //Write out basic stuff every control has // name,position,size,bg,fg void wxWxr2Xml::WriteControlInfo(wxItemResource *res) { m_xmlfile.Write(GenerateName(res)); m_xmlfile.Write(">\n"); m_xmlfile.Write(GetPosition(res)); m_xmlfile.Write(GetSize(res)); m_xmlfile.Write(GetStyles(res)); } wxString wxWxr2Xml::GetSize(wxItemResource *res) { wxString msg; if (m_dlgunits) msg<<" "<GetWidth()<<","<GetHeight()<<"d"; else msg<<" "<GetWidth()<<","<GetHeight()<<""; return msg; } wxString wxWxr2Xml::GetPosition(wxItemResource *res) { wxString msg; if (m_dlgunits) msg<<" "<GetX()<<","<GetY()<<"d"; else msg<<" "<GetX()<<","<GetY()<<""; return msg; } void wxWxr2Xml::ParseButton(wxItemResource *res) { m_xmlfile.Write(" \n"); } void wxWxr2Xml::ParseTextCtrl(wxItemResource *res) { m_xmlfile.Write(" \n"); } wxString wxWxr2Xml::GetTitle(wxItemResource *res) { wxString msg; msg=_T(" "+res->GetTitle()+""); return msg; } wxString wxWxr2Xml::GetValue4(wxItemResource *res) { wxString msg; msg=_T(" "+res->GetValue4()+""); return msg; } void wxWxr2Xml::ParseCheckBox(wxItemResource *res) { m_xmlfile.Write(" \n"); } wxString wxWxr2Xml::GetLabel(wxItemResource *res) { return _T(" "); } void wxWxr2Xml::ParseRadioBox(wxItemResource *res) { m_xmlfile.Write(" \n"); } void wxWxr2Xml::ParseListBox(wxItemResource *res) { m_xmlfile.Write(" \n"); } void wxWxr2Xml::ParseStaticText(wxItemResource *res) { m_xmlfile.Write(" \n"); } void wxWxr2Xml::ParseStaticBox(wxItemResource *res) { m_xmlfile.Write(" \n"); } void wxWxr2Xml::WriteStringList(wxItemResource *res) { m_xmlfile.Write("\n "); for ( wxStringListNode *node = res->GetStringValues().GetFirst(); node; node = node->GetNext() ) { const wxString s1 = node->GetData(); m_xmlfile.Write("\n "+s1+""); } m_xmlfile.Write("\n "); } void wxWxr2Xml::ParseChoice(wxItemResource *res) { m_xmlfile.Write(" \n"); } void wxWxr2Xml::ParseGauge(wxItemResource *res) { m_xmlfile.Write(" \n"); } wxString wxWxr2Xml::GetValue1(wxItemResource *res) { wxString msg; msg<<" "<GetValue1()<<""; return msg; } wxString wxWxr2Xml::GetRange(wxItemResource *res) { wxString msg; msg<<" "<GetValue2()<<""; return msg; } void wxWxr2Xml::ParseSlider(wxItemResource *res) { m_xmlfile.Write(" \n"); } wxString wxWxr2Xml::GetMax(wxItemResource *res) { wxString msg; msg<<" "<GetValue3()<<""; return msg; } wxString wxWxr2Xml::GetMin(wxItemResource *res) { wxString msg; msg<<" "<GetValue2()<<""; return msg; } void wxWxr2Xml::ParseComboBox(wxItemResource *res) { m_xmlfile.Write(" \n"); } void wxWxr2Xml::ParseRadioButton(wxItemResource *res) { m_xmlfile.Write(" \n"); } void wxWxr2Xml::ParseScrollBar(wxItemResource *res) { m_xmlfile.Write(" \n"); } wxString wxWxr2Xml::GetCheckStatus(wxItemResource *res) { wxString msg; msg<<" "<GetValue1()<<""; return msg; } wxString wxWxr2Xml::GetStyles(wxItemResource *res) { //Very crude way to get styles long style; wxString s,restype; restype=res->GetType(); style=res->GetStyle(); s=""; return s; } wxString wxWxr2Xml::GetDimension(wxItemResource *res) { wxString msg; msg<<" "<GetValue1()<<""; return msg; } wxString wxWxr2Xml::GenerateName(wxItemResource *res) { wxString name; name=_T(" name=\""); switch (res->GetId()) { case wxID_OK: name+=_T("wxID_OK"); break; case wxID_CANCEL: name+=_T("wxID_CANCEL"); break; default: name+=res->GetName(); } name+="\""; return name; } void wxWxr2Xml::ParseMenuBar(wxItemResource *res) { wxItemResource *child; wxNode *node = res->GetChildren().First(); //Get Menu Bar Name m_xmlfile.Write("\n"); m_xmlfile.Write(" \n"); while (node) { child= (wxItemResource *)node->Data(); ParseMenu(child); node = node->Next(); } m_xmlfile.Write(" \n"); m_xmlfile.Write(" \n"); } void wxWxr2Xml::ParseMenu(wxItemResource *res) { wxItemResource *child; wxNode *node = res->GetChildren().First(); //Get Menu m_xmlfile.Write(" GetValue1()<<"\""; m_xmlfile.Write(menuname); m_xmlfile.Write(">\n"); m_xmlfile.Write(" \n"); if (res->GetValue4()!="") m_xmlfile.Write(" "+res->GetValue4()+"\n"); m_xmlfile.Write(" \n"); //Read in menu items and additional menus while (node) { child= (wxItemResource *)node->Data(); if (!child->GetChildren().First()) ParseMenuItem(child); else ParseMenu(child); node = node->Next(); } m_xmlfile.Write(" \n"); m_xmlfile.Write(" \n"); } void wxWxr2Xml::ParseMenuItem(wxItemResource *res) { //Get Menu Item or Separator if (res->GetTitle()=="") { m_xmlfile.Write(" \n"); } else { m_xmlfile.Write(" GetValue1()<<"\""; m_xmlfile.Write(menuname); m_xmlfile.Write(">\n"); m_xmlfile.Write(" \n"); if (res->GetValue4()!="") m_xmlfile.Write(" "+res->GetValue4()+"\n"); if (res->GetValue2()) m_xmlfile.Write(" 1\n"); m_xmlfile.Write(" \n"); } } wxString wxWxr2Xml::FixMenuString(wxString phrase) { phrase.Replace("&","$"); return phrase; } void wxWxr2Xml::ParseStaticBitmap(wxItemResource *res) { m_xmlfile.Write(" GetValue4(); wxBitmap bitmap; bitmap= wxResourceCreateBitmap(bitmapname,&m_table); bitmapname+=_T(".bmp"); bitmap.SaveFile(bitmapname,wxBITMAP_TYPE_BMP); m_xmlfile.Write("\n "+bitmapname+""); m_xmlfile.Write("\n"); //bitmap5 } void wxWxr2Xml::ParseBitmap(wxItemResource *res) { } void wxWxr2Xml::PanelStuff(wxItemResource *res) { if ((res->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS) != 0) m_dlgunits=TRUE; else m_dlgunits=FALSE; //If this is true ignore fonts, background color and use system //defaults instead if ((res->GetResourceStyle() & wxRESOURCE_USE_DEFAULTS) != 0) m_systemdefaults=TRUE; else m_systemdefaults=FALSE; }