Files
wxWidgets/contrib/utils/convertrc/wxr2xml.cpp
2000-09-17 19:17:13 +00:00

695 lines
15 KiB
C++

// 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;
}