]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/utils/convertrc/wxr2xml.cpp
added rc2xml and wxr2xml convertor (no makefiles yet)
[wxWidgets.git] / contrib / utils / convertrc / wxr2xml.cpp
diff --git a/contrib/utils/convertrc/wxr2xml.cpp b/contrib/utils/convertrc/wxr2xml.cpp
new file mode 100644 (file)
index 0000000..a6e9d0d
--- /dev/null
@@ -0,0 +1,694 @@
+// 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("<?xml version=\"1.0\" ?>\n");
+m_xmlfile.Write("<resource>\n");
+result=ParseResources();
+m_xmlfile.Write("</resource>\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("      <panel");
+PanelStuff(res);
+WriteControlInfo(res);
+m_xmlfile.Write("\n"); 
+m_xmlfile.Write("      <children>\n");
+ParseControls(res);
+m_xmlfile.Write("      </children>\n");
+
+m_xmlfile.Write("      </panel>\n");
+}
+
+
+void wxWxr2Xml::ParseDialog(wxItemResource *res)
+{
+PanelStuff(res);
+m_xmlfile.Write("      <dialog");
+WriteControlInfo(res);
+m_xmlfile.Write(GetTitle(res));
+
+    
+m_xmlfile.Write("\n"); 
+m_xmlfile.Write("      <children>\n");
+ParseControls(res);
+m_xmlfile.Write("      </children>\n");
+m_xmlfile.Write("      </dialog>\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<<" <size>"<<res->GetWidth()<<","<<res->GetHeight()<<"d</size>";
+else
+       msg<<" <size>"<<res->GetWidth()<<","<<res->GetHeight()<<"</size>";
+return msg;
+}
+
+wxString wxWxr2Xml::GetPosition(wxItemResource *res)
+{
+wxString msg;
+if (m_dlgunits)
+       msg<<" <pos>"<<res->GetX()<<","<<res->GetY()<<"d</pos>";
+else
+       msg<<" <pos>"<<res->GetX()<<","<<res->GetY()<<"</pos>";
+return msg;
+}
+
+void wxWxr2Xml::ParseButton(wxItemResource *res)
+{
+m_xmlfile.Write("              <button");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+m_xmlfile.Write("</button>\n");
+}
+
+void wxWxr2Xml::ParseTextCtrl(wxItemResource *res)
+{
+m_xmlfile.Write("              <textctrl");
+WriteControlInfo(res);
+m_xmlfile.Write(GetValue4(res));
+m_xmlfile.Write("</textctrl>\n");
+
+}
+
+wxString wxWxr2Xml::GetTitle(wxItemResource *res)
+{
+wxString msg;
+msg=_T(" <title>"+res->GetTitle()+"</title>");
+return msg;
+}
+
+wxString wxWxr2Xml::GetValue4(wxItemResource *res)
+{
+wxString msg;
+msg=_T(" <value>"+res->GetValue4()+"</value>");
+return msg;
+}
+
+void wxWxr2Xml::ParseCheckBox(wxItemResource *res)
+{
+m_xmlfile.Write("              <checkbox");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+m_xmlfile.Write(GetCheckStatus(res));
+m_xmlfile.Write("</checkbox>\n");
+}
+
+wxString wxWxr2Xml::GetLabel(wxItemResource *res)
+{
+return _T(" <label>"+res->GetTitle()+"</label>");
+}
+
+void wxWxr2Xml::ParseRadioBox(wxItemResource *res)
+{
+m_xmlfile.Write("              <radiobox");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+//Add radio box items
+WriteStringList(res);
+//Value1
+m_xmlfile.Write(GetDimension(res));
+m_xmlfile.Write("\n                    </radiobox>\n");
+}
+
+void wxWxr2Xml::ParseListBox(wxItemResource *res)
+{
+m_xmlfile.Write("              <listbox");
+WriteControlInfo(res);
+WriteStringList(res);
+m_xmlfile.Write("</listbox>\n");
+}
+
+void wxWxr2Xml::ParseStaticText(wxItemResource *res)
+{
+m_xmlfile.Write("              <statictext");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+m_xmlfile.Write("</statictext>\n");
+}
+
+void wxWxr2Xml::ParseStaticBox(wxItemResource *res)
+{
+m_xmlfile.Write("              <staticbox");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+m_xmlfile.Write("</staticbox>\n");
+}
+
+void wxWxr2Xml::WriteStringList(wxItemResource *res)
+{
+m_xmlfile.Write("\n                    <content>");
+for ( wxStringListNode *node = res->GetStringValues().GetFirst(); node; 
+       node = node->GetNext() )
+    {
+        const wxString s1 = node->GetData();
+        m_xmlfile.Write("\n                    <item>"+s1+"</item>");
+    }
+       m_xmlfile.Write("\n                     </content>");
+}
+
+void wxWxr2Xml::ParseChoice(wxItemResource *res)
+{
+m_xmlfile.Write("              <choice");
+WriteControlInfo(res);
+//Add choice items
+WriteStringList(res);
+m_xmlfile.Write("\n            </choice>\n");
+}
+
+void wxWxr2Xml::ParseGauge(wxItemResource *res)
+{
+m_xmlfile.Write("              <gauge");
+WriteControlInfo(res);
+m_xmlfile.Write(GetValue1(res));
+m_xmlfile.Write(GetRange(res));
+m_xmlfile.Write("\n                    </gauge>\n");
+}
+
+
+wxString wxWxr2Xml::GetValue1(wxItemResource *res)
+{
+wxString msg;
+msg<<" <value>"<<res->GetValue1()<<"</value>";
+return msg;
+}
+
+wxString wxWxr2Xml::GetRange(wxItemResource *res)
+{
+wxString msg;
+msg<<" <range>"<<res->GetValue2()<<"</range>";
+return msg;
+}
+
+void wxWxr2Xml::ParseSlider(wxItemResource *res)
+{
+m_xmlfile.Write("              <slider");
+WriteControlInfo(res);
+m_xmlfile.Write(GetValue1(res));
+m_xmlfile.Write(GetMax(res));
+m_xmlfile.Write(GetMin(res));
+m_xmlfile.Write("\n                    </slider>\n");
+}
+
+wxString wxWxr2Xml::GetMax(wxItemResource *res)
+{
+wxString msg;
+msg<<" <max>"<<res->GetValue3()<<"</max>";
+return msg;
+}
+
+wxString wxWxr2Xml::GetMin(wxItemResource *res)
+{
+wxString msg;
+msg<<" <min>"<<res->GetValue2()<<"</min>";
+return msg;
+}
+
+void wxWxr2Xml::ParseComboBox(wxItemResource *res)
+{
+m_xmlfile.Write("              <combobox");
+WriteControlInfo(res);
+//Add combo items
+WriteStringList(res);
+m_xmlfile.Write("\n            </combobox>\n");
+}
+
+void wxWxr2Xml::ParseRadioButton(wxItemResource *res)
+{
+m_xmlfile.Write("              <radiobutton");
+WriteControlInfo(res);
+m_xmlfile.Write(GetLabel(res));
+
+wxString msg;
+m_xmlfile.Write(GetValue1(res));
+m_xmlfile.Write(GetCheckStatus(res));
+m_xmlfile.Write("\n                    </radiobutton>\n");
+}
+
+void wxWxr2Xml::ParseScrollBar(wxItemResource *res)
+{
+m_xmlfile.Write("              <scrollbar");
+WriteControlInfo(res);
+//TODO learn more about XML scrollbar format
+m_xmlfile.Write("\n                    </scrollbar>\n");
+} 
+
+wxString wxWxr2Xml::GetCheckStatus(wxItemResource *res)
+{
+wxString msg;
+msg<<" <checked>"<<res->GetValue1()<<"</checked>";
+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="<style>";
+
+//Common styles for all controls
+if (style&wxSIMPLE_BORDER)
+               s+="wxSIMPLE_BORDER|";
+if (style&wxSUNKEN_BORDER)
+               s+="wxSUNKEN_BORDER|";
+if (style&wxSIMPLE_BORDER)
+               s+="wxSIMPLE_BORDER|";
+if (style&wxDOUBLE_BORDER)
+               s+="wxDOUBLE_BORDER|";
+if (style&wxRAISED_BORDER)
+               s+="wxRAISED_BORDER|";
+if (style&wxTRANSPARENT_WINDOW)
+               s+="wxTRANSPARENT_WINDOW|";
+if (style&wxWANTS_CHARS)
+               s+="wxWANTS_CHARS|";
+if (style&wxNO_FULL_REPAINT_ON_RESIZE)
+               s+="wxNO_FULL_REPAINT_ON_RESIZE|";
+           
+if (restype=="wxDialog")
+{
+       if (style&wxDIALOG_MODAL)
+               s+="wxDIALOG_MODAL|";
+       if (style&wxDEFAULT_DIALOG_STYLE)
+               s+="wxDEFAULT_DIALOG_STYLE|";
+       if (style&wxDIALOG_MODELESS)
+               s+="wxDIALOG_MODELESS|";
+       if (style&wxNO_3D)
+               s+="wxNO_3D|";
+       if (style&wxTAB_TRAVERSAL)
+               s+="wxTAB_TRAVERSAL|";
+       if (style&wxWS_EX_VALIDATE_RECURSIVELY)
+               s+="wxWS_EX_VALIDATE_RECURSIVELY|";
+       if (style&wxSTAY_ON_TOP)
+               s+="wxSTAY_ON_TOP|";
+       if (style&wxCAPTION)
+               s+="wxCAPTION|";
+       if (style&wxTHICK_FRAME)
+               s+="wxTHICK_FRAME|";
+       if (style&wxRESIZE_BOX)
+               s+="wxRESIZE_BOX|";
+       if (style&wxRESIZE_BORDER)
+               s+="wxRESIZE_BORDER|";
+       if (style&wxSYSTEM_MENU)
+               s+="wxSYSTEM_MENU|";
+       if (style&wxCLIP_CHILDREN)
+               s+="wxCLIP_CHILDREN|";
+       
+       
+}
+    
+
+    
+if (restype=="wxPanel")
+{
+       if (style&wxCLIP_CHILDREN)
+               s+="wxCLIP_CHILDREN|";
+       if (style&wxNO_3D)
+               s+="wxNO_3D|";
+       if (style&wxTAB_TRAVERSAL)
+               s+="wxTAB_TRAVERSAL|";
+       if (style&wxWS_EX_VALIDATE_RECURSIVELY)
+               s+="wxWS_EX_VALIDATE_RECURSIVELY|";
+}
+
+if (restype=="wxComboBox")
+{
+       if (style&wxCB_SORT)
+               s+="wxCB_SORT|";
+       if (style&wxCB_SIMPLE)
+               s+="wxCB_SIMPLE|";
+       if (style&wxCB_READONLY)
+               s+="wxCB_READONLY|";
+       if (style&wxCB_DROPDOWN)
+               s+="wxCB_DROPDOWN|";
+}
+
+if (restype=="wxGauge")
+{
+       if (style&wxGA_HORIZONTAL)
+               s+="wxGA_HORIZONTAL|";
+       if (style&wxGA_VERTICAL)
+               s+="wxGA_VERTICAL|";
+       if (style&wxGA_PROGRESSBAR)
+               s+="wxGA_PROGRESSBAR|";
+       // windows only
+       if (style&wxGA_SMOOTH)
+               s+="wxGA_SMOOTH|";
+}
+
+if (restype=="wxRadioButton")
+{
+       if (style&wxRB_GROUP)
+               s+="wxRB_GROUP|";
+}
+
+if (restype=="wxStaticText")
+{
+       if (style&wxST_NO_AUTORESIZE)
+               s+="wxST_NO_AUTORESIZEL|";
+}
+
+if (restype=="wxRadioBox")
+       {
+       if (style&wxRA_HORIZONTAL)
+               s+="wxRA_HORIZONTAL|";
+       if (style&wxRA_SPECIFY_COLS)
+               s+="wxRA_SPECIFY_COLS|";
+       if (style&wxRA_SPECIFY_ROWS)
+               s+="wxRA_SPECIFY_ROWS|";
+       if (style&wxRA_VERTICAL)
+               s+="wxRA_VERTICAL|";
+       }
+
+if (restype=="wxListBox")
+{
+       if (style&wxLB_SINGLE)
+               s+="wxLB_SINGLE|";
+       if (style&wxLB_MULTIPLE)
+               s+="wxLB_MULTIPLE|";
+       if (style&wxLB_EXTENDED)
+               s+="wxLB_EXTENDED|";
+       if (style&wxLB_HSCROLL)
+               s+="wxLB_HSCROLL|";
+       if (style&wxLB_ALWAYS_SB)
+               s+="wxLB_ALWAYS_SB|";
+       if (style&wxLB_NEEDED_SB)
+               s+="wxLB_NEEDED_SB|";
+       if (style&wxLB_SORT)
+               s+="wxLB_SORT|";
+}
+       
+if (restype=="wxTextCtrl")
+{
+       if (style&wxTE_PROCESS_ENTER)
+               s+="wxTE_PROCESS_ENTER|";
+       if (style&wxTE_PROCESS_TAB)
+               s+="wxTE_PROCESS_TAB|";
+       if (style&wxTE_MULTILINE)
+               s+="wxTE_MULTILINE|";
+       if (style&wxTE_PASSWORD)
+               s+="wxTE_PASSWORD|";
+       if (style&wxTE_READONLY)
+               s+="wxTE_READONLY|";
+       if (style&wxHSCROLL)
+               s+="wxHSCROLL|";
+}
+
+int l;
+l=s.Length();
+//No styles defined
+if (l==7)
+       return _T("");
+//Trim off last |
+s=s.Truncate(l-1);
+
+s+="</style>";
+return s;      
+}
+
+wxString wxWxr2Xml::GetDimension(wxItemResource *res)
+{
+wxString msg;
+msg<<" <dimension>"<<res->GetValue1()<<"</dimension>";
+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("<menubar ");
+       m_xmlfile.Write(GenerateName(res));
+       m_xmlfile.Write(">\n");
+       m_xmlfile.Write("       <children>\n");
+    while (node)
+    {
+               child= (wxItemResource *)node->Data();
+               ParseMenu(child);
+        node = node->Next();
+       }
+
+       m_xmlfile.Write("       </children>\n");
+       m_xmlfile.Write("</menubar> \n");
+}
+
+
+void wxWxr2Xml::ParseMenu(wxItemResource *res)
+{
+       wxItemResource *child;
+       wxNode *node = res->GetChildren().First();
+       //Get Menu 
+       m_xmlfile.Write("       <menu ");
+       wxString menuname;
+       menuname<<"name = \"menu_"<<res->GetValue1()<<"\"";
+       m_xmlfile.Write(menuname);
+       m_xmlfile.Write(">\n");
+       m_xmlfile.Write("               <label>"
+               +FixMenuString(res->GetTitle())+"</label>\n");
+       if (res->GetValue4()!="")
+               m_xmlfile.Write("               <help>"+res->GetValue4()+"</help>\n");
+       m_xmlfile.Write("               <children>\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("              </children>\n");
+m_xmlfile.Write("      </menu> \n");
+}
+
+void wxWxr2Xml::ParseMenuItem(wxItemResource *res)
+{
+       //Get Menu Item or Separator
+if (res->GetTitle()=="")
+       {
+       m_xmlfile.Write("               <separator/>\n");
+       }
+else
+       {
+       m_xmlfile.Write("               <menuitem ");
+       wxString menuname;
+       menuname<<"name = \"menuitem_"<<res->GetValue1()<<"\"";
+       m_xmlfile.Write(menuname);
+       m_xmlfile.Write(">\n");
+       m_xmlfile.Write("                       <label>"
+               +FixMenuString(res->GetTitle())+"</label>\n");
+       if (res->GetValue4()!="")
+               m_xmlfile.Write("                       <help>"+res->GetValue4()+"</help>\n");
+       if (res->GetValue2())
+               m_xmlfile.Write("                       <checkable>1</checkable>\n");
+       m_xmlfile.Write("               </menuitem> \n");
+       }
+}
+
+wxString wxWxr2Xml::FixMenuString(wxString phrase)
+{
+phrase.Replace("&","$");
+return phrase;
+}
+
+void wxWxr2Xml::ParseStaticBitmap(wxItemResource *res)
+{
+m_xmlfile.Write("              <staticbitmap");
+WriteControlInfo(res);
+//value4 holds bitmap name
+wxString bitmapname;
+bitmapname=res->GetValue4();
+wxBitmap bitmap;
+bitmap= wxResourceCreateBitmap(bitmapname,&m_table);
+bitmapname+=_T(".bmp");
+bitmap.SaveFile(bitmapname,wxBITMAP_TYPE_BMP);
+m_xmlfile.Write("\n            <bitmap>"+bitmapname+"</bitmap>");
+m_xmlfile.Write("</staticbitmap>\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;
+
+}