bool TemplateParser::ParseWxParent() { PObjectBase wxparent( GetWxParent() ); if ( wxparent ) { PProperty property = GetRelatedProperty( wxparent ); //m_out << PropertyToCode(property); if (wxparent->GetClassName() == wxT("wxStaticBoxSizer")) { // We got a wxStaticBoxSizer as parent, use the special PT_WXPARENT_SB type to // generate code to get its static box m_out << ValueToCode(PT_WXPARENT_SB, property->GetValue()); } else { m_out << ValueToCode(PT_WXPARENT, property->GetValue()); } } else { ignore_whitespaces(); ParsePropertyName(); m_out << RootWxParentToCode(); } return true; }
bool TemplateParser::ParseForEach() { // Whitespaces at the very start are ignored ignore_whitespaces(); // parsing the property if (GetNextToken() == TOK_PROPERTY) { wxString propname = ParsePropertyName(); wxString inner_template = ExtractInnerTemplate(); PProperty property = m_obj->GetProperty(propname); wxString propvalue = property->GetValue(); // Property value must be an string using ',' as separator. // The template will be generated nesting as many times as // tokens were found in the property value. if (property->GetType() == PT_INTLIST || property->GetType() == PT_UINTLIST) { // For doing that we will use wxStringTokenizer class from wxWidgets wxStringTokenizer tkz( propvalue, wxT(",")); int i = 0; while (tkz.HasMoreTokens()) { wxString token; token = tkz.GetNextToken(); token.Trim(true); token.Trim(false); // Parsing the internal template { wxString code; PTemplateParser parser = CreateParser( this, inner_template ); parser->SetPredefined( token, wxString::Format( wxT("%i"), i++ ) ); code = parser->ParseTemplate(); m_out << wxT("\n") << code; } } } else if (property->GetType() == PT_STRINGLIST) { wxArrayString array = property->GetValueAsArrayString(); for ( unsigned int i = 0 ; i < array.Count(); i++ ) { wxString code; PTemplateParser parser = CreateParser(this,inner_template); parser->SetPredefined( ValueToCode( PT_WXSTRING_I18N, array[i] ), wxString::Format( wxT("%i"), i ) ); code = parser->ParseTemplate(); m_out << wxT("\n") << code; } } else wxLogError(wxT("Property type not compatible with \"foreach\" macro")); } return true; }
wxString TemplateParser::PropertyToCode(PProperty property) { if ( property ) { return ValueToCode(property->GetType(), property->GetValue()); } else { return wxEmptyString; } }
void TemplateParser::ParseClass() { PProperty subclass_prop = m_obj->GetProperty( wxT("subclass") ); if ( subclass_prop ) { wxString subclass = subclass_prop->GetChildFromParent( wxT("name") ); if ( !subclass.empty() ) { m_out << subclass; return; } } m_out << ValueToCode( PT_CLASS, m_obj->GetClassName() ); }
/** * Convert the value of the property to C++ code */ wxString CppTemplateParser::ValueToCode( PropertyType type, wxString value ) { wxString result; switch ( type ) { case PT_WXSTRING: { result << wxT("wxT(\"") << CppCodeGenerator::ConvertCppString( value ) << wxT("\")"); break; } case PT_WXSTRING_I18N: { if ( m_i18n ) { result << wxT("_(\"") << CppCodeGenerator::ConvertCppString(value) << wxT("\")"); } else { result << wxT("wxT(\"") << CppCodeGenerator::ConvertCppString(value) << wxT("\")"); } break; } case PT_MACRO: case PT_TEXT: case PT_OPTION: case PT_FLOAT: { result = value; break; } case PT_BITLIST: { result = ( value.empty() ? wxT("0") : value ); break; } case PT_WXPOINT: { if ( value.empty() ) { result = wxT("wxDefaultPosition"); } else { result << wxT("wxPoint( ") << value << wxT(" )"); } break; } case PT_WXSIZE: { if ( value.empty() ) { result = wxT("wxDefaultSize"); } else { result << wxT("wxSize( ") << value << wxT(" )"); } break; } case PT_BOOL: { result = ( value == wxT("0") ? wxT("false") : wxT("true") ); break; } case PT_WXFONT: { if ( !value.empty() ) { wxFont font = TypeConv::StringToFont( value ); result = wxString::Format( wxT("wxFont( %i, %i, %i, %i, %s, wxT(\"%s\") )" ), font.GetPointSize(), font.GetFamily(), font.GetStyle(), font.GetWeight(), ( font.GetUnderlined() ? wxT("true") : wxT("false") ), font.GetFaceName().c_str() ); } else { result = wxT("wxFont()"); } break; } case PT_WXCOLOUR: { if ( !value.empty() ) { if ( value.find_first_of( wxT("wx") ) == 0 ) { // System Colour result << wxT("wxSystemSettings::GetColour( ") << value << wxT(" )"); } else { wxColour colour = TypeConv::StringToColour( value ); result = wxString::Format( wxT("wxColour( %i, %i, %i )"), colour.Red(), colour.Green(), colour.Blue() ); } } else { result = wxT("wxColour()"); } break; } case PT_BITMAP: { // Splitting bitmap resource property value - it is of the form "path; source" size_t semicolonIndex = value.find_first_of( wxT(";") ); wxString path; wxString source; if ( semicolonIndex != value.npos ) { path = value.substr( 0, semicolonIndex ); source = value.substr( semicolonIndex + 2 ); // Separated by "; " } else { path = value; source = wxT("Load From File"); } if ( path.empty() ) { // Empty path, generate Null Bitmap result = wxT("wxNullBitmap"); break; } if ( source == wxT("Load From File") ) { wxString absPath = TypeConv::MakeAbsolutePath( path, GlobalData()->GetProjectPath() ); wxString file = ( m_useRelativePath ? TypeConv::MakeRelativePath( absPath, m_basePath ) : absPath ); wxString cppString = CppCodeGenerator::ConvertCppString( file ); wxFileName bmpFileName( path ); if ( bmpFileName.GetExt().Upper() == wxT("XPM") ) { // If the bitmap is an XPM we will embed it in the code, otherwise it will be loaded from the file at run time. result << wxT("wxBitmap( ") << CppCodeGenerator::ConvertXpmName( path ) << wxT(" )"); } else { result << wxT("wxBitmap( wxT(\"") << cppString << wxT("\"), wxBITMAP_TYPE_ANY )"); } } else if ( source == wxT("Load From Resource") ) { result << wxT("wxBitmap( wxT(\"") << path << wxT("\"), wxBITMAP_TYPE_RESOURCE )"); } else if ( source == wxT("Load From Icon Resource") ) { result << wxT("wxICON( ") << path << wxT(" )"); } break; } case PT_STRINGLIST: { // Stringlists are generated like a sequence of wxString separated by ', '. wxArrayString array = TypeConv::StringToArrayString( value ); if ( array.Count() > 0 ) { result = ValueToCode( PT_WXSTRING_I18N, array[0] ); } for ( size_t i = 1; i < array.Count(); i++ ) { result << wxT(", ") << ValueToCode( PT_WXSTRING_I18N, array[i] ); } break; } default: break; } return result; }
/** * Convert the value of the property to PHP code */ wxString PHPTemplateParser::ValueToCode( PropertyType type, wxString value ) { wxString result; switch ( type ) { case PT_WXPARENT: { result = wxT("$this->") + value; break; } case PT_WXPARENT_SB: { result = wxT("$") + value + wxT("->GetStaticBox()"); break; } case PT_WXSTRING: case PT_FILE: case PT_PATH: { if ( value.empty() ) { result << wxT("wxEmptyString"); } else { result << wxT("\"") << PHPCodeGenerator::ConvertPHPString( value ) << wxT("\""); } break; } case PT_WXSTRING_I18N: { if ( value.empty() ) { result << wxT("wxEmptyString"); } else { if ( m_i18n ) { result << wxT("_(\"") << PHPCodeGenerator::ConvertPHPString(value) << wxT("\")"); } else { result << wxT("\"") << PHPCodeGenerator::ConvertPHPString(value) << wxT("\""); } } break; } case PT_CLASS: case PT_MACRO: case PT_OPTION: case PT_EDIT_OPTION: { result = value; break; } case PT_TEXT: case PT_FLOAT: case PT_INT: case PT_UINT: { result = value; break; } case PT_BITLIST: { result = ( value.empty() ? wxT("0") : value ); wxString pred, bit; wxStringTokenizer bits( result, wxT("|"), wxTOKEN_STRTOK ); while( bits.HasMoreTokens() ) { bit = bits.GetNextToken(); pred = m_predModulePrefix[bit]; /*if( bit.Contains( wxT("wx") ) ) { if( !pred.empty() ) result.Replace( bit, pred + bit.AfterFirst('x') ); else result.Replace( bit, wxT("wx") + bit.AfterFirst('x') ); }*/ } break; } case PT_WXPOINT: { if ( value.empty() ) { result = wxT("wxDefaultPosition"); } else { result << wxT("new wxPoint( ") << value << wxT(" )"); } break; } case PT_WXSIZE: { if ( value.empty() ) { result = wxT("wxDefaultSize"); } else { result << wxT("new wxSize( ") << value << wxT(" )"); } break; } case PT_BOOL: { result = ( value == wxT("0") ? wxT("false") : wxT("true") ); break; } case PT_WXFONT: { if ( !value.empty() ) { wxFontContainer fontContainer = TypeConv::StringToFont( value ); wxFont font = fontContainer.GetFont(); const int pointSize = fontContainer.GetPointSize(); result = wxString::Format( "new wxFont( %s, %s, %s, %s, %s, %s )", ((pointSize <= 0) ? "wxC2D(wxNORMAL_FONT)->GetPointSize()" : (wxString() << pointSize)), TypeConv::FontFamilyToString( fontContainer.GetFamily() ), font.GetStyleString(), font.GetWeightString(), ( fontContainer.GetUnderlined() ? "true" : "false" ), ( fontContainer.m_faceName.empty() ? "wxEmptyString" : ("\"" + fontContainer.m_faceName + "\"") ) ); } else { result = "wxC2D(wxNORMAL_FONT)"; } break; } case PT_WXCOLOUR: { if ( !value.empty() ) { if ( value.find_first_of( wxT("wx") ) == 0 ) { // System Colour result << wxT("wxSystemSettings::GetColour( ") << ValueToCode( PT_OPTION, value ) << wxT(" )"); } else { wxColour colour = TypeConv::StringToColour( value ); result = wxString::Format( wxT("new wxColour( %i, %i, %i )"), colour.Red(), colour.Green(), colour.Blue() ); } } else { result = wxT("new wxColour()"); } break; } case PT_BITMAP: { wxString path; wxString source; wxSize icoSize; TypeConv::ParseBitmapWithResource( value, &path, &source, &icoSize ); if ( path.empty() ) { // Empty path, generate Null Bitmap result = wxT("wxNullBitmap"); break; } if ( path.StartsWith( wxT("file:") ) ) { wxLogWarning( wxT("PHP code generation does not support using URLs for bitmap properties:\n%s"), path.c_str() ); result = wxT("wxNullBitmap"); break; } if ( source == wxT("Load From File") ) { wxString absPath; try { absPath = TypeConv::MakeAbsolutePath( path, AppData()->GetProjectPath() ); } catch( wxFBException& ex ) { wxLogError( ex.what() ); result = wxT( "wxNullBitmap" ); break; } wxString file = ( m_useRelativePath ? TypeConv::MakeRelativePath( absPath, m_basePath ) : absPath ); result << wxT("new wxBitmap( \"") << PHPCodeGenerator::ConvertPHPString( file ) << wxT("\", wxBITMAP_TYPE_ANY )"); } else if ( source == _("Load From Embedded File") ) { result << wxT( "wxNullBitmap /* embedded files aren't supported */" ); } else if ( source == wxT("Load From Resource") ) { result << wxT("new wxBitmap( \"") << path << wxT("\", wxBITMAP_TYPE_RESOURCE )"); } else if ( source == wxT("Load From Icon Resource") ) { if ( wxDefaultSize == icoSize ) { result << wxT("new wxICON( ") << path << wxT(" )"); } else { result.Printf( wxT("new wxIcon( \"%s\", wxBITMAP_TYPE_ICO_RESOURCE, %i, %i )"), path.c_str(), icoSize.GetWidth(), icoSize.GetHeight() ); } } else if ( source == _("Load From Art Provider") ) { wxString rid = path.BeforeFirst( wxT(':') ); if( rid.StartsWith( wxT("gtk-") ) ) rid = wxT("wxT(\"") + rid + wxT("\")"); result = wxT("wxArtProvider::GetBitmap( ") + rid + wxT(", ") + path.AfterFirst( wxT(':') ) + wxT(" )"); } break; break; } case PT_STRINGLIST: { // Stringlists are generated like a sequence of wxString separated by ', '. wxArrayString array = TypeConv::StringToArrayString( value ); if ( array.Count() > 0 ) { result = ValueToCode( PT_WXSTRING_I18N, array[0] ); } for ( size_t i = 1; i < array.Count(); i++ ) { result << wxT(", ") << ValueToCode( PT_WXSTRING_I18N, array[i] ); } break; } default: break; } return result; }