PObject * PObjectBroker::MakeObject(const char *type, BMessage *msg) { if (!type) return NULL; if (pApp && BString(type).ICompare("PApplication") == 0) return pApp; PObjectInfo *info = NULL; for (int32 i = 0; i < fObjInfoList->CountItems(); i++) { PObjectInfo *temp = fObjInfoList->ItemAt(i); if (temp->type.ICompare(type) == 0) { info = temp; break; } } if (info) { PObject *obj = msg ? (PObject*)info->arcfunc(msg) : info->createfunc(); fObjectList->AddItem(obj); if (!pApp && obj->GetType().Compare("PApplication") == 0) pApp = obj; return obj; } return NULL; }
void CppCodeGenerator::GenSettings(PObjectInfo info, PObjectBase obj) { string _template; PCodeInfo code_info = info->GetCodeInfo("C++"); if (!code_info) return; _template = code_info->GetTemplate("settings"); if (_template != "") { CppTemplateParser parser(obj,_template); string code = parser.ParseTemplate(); if (code != "") m_source->WriteLn(code); } // procedemos recursivamente con las clases base for (unsigned int i=0; i< info->GetBaseClassCount(); i++) { PObjectInfo base_info = info->GetBaseClass(i); GenSettings(base_info,obj); } }
void PHPCodeGenerator::GenBaseIncludes( PObjectInfo info, PObjectBase obj, std::vector< wxString >* includes, std::set< wxString >* templates ) { if ( !info ) { return; } // Process all the base classes recursively for ( unsigned int i = 0; i < info->GetBaseClassCount(); i++ ) { PObjectInfo base_info = info->GetBaseClass( i ); GenBaseIncludes( base_info, obj, includes, templates ); } PCodeInfo code_info = info->GetCodeInfo( wxT("PHP") ); if ( code_info ) { PHPTemplateParser parser( obj, code_info->GetTemplate( wxT("include") ), m_i18n, m_useRelativePath, m_basePath ); wxString include = parser.ParseTemplate(); if ( !include.empty() ) { if ( templates->insert( include ).second ) { AddUniqueIncludes( include, includes ); } } } }
void PHPCodeGenerator::GenDefinedEventHandlers( PObjectInfo info, PObjectBase obj ) { PCodeInfo code_info = info->GetCodeInfo( wxT( "PHP" ) ); if ( code_info ) { wxString _template = code_info->GetTemplate( wxT("generated_event_handlers") ); if ( !_template.empty() ) { PHPTemplateParser parser( obj, _template, m_i18n, m_useRelativePath, m_basePath ); wxString code = parser.ParseTemplate(); if ( !code.empty() ) { m_source->WriteLn(code); } } } // Proceeding recursively with the base classes for ( unsigned int i = 0; i < info->GetBaseClassCount(); i++ ) { PObjectInfo base_info = info->GetBaseClass( i ); GenDefinedEventHandlers( base_info, obj ); } }
void PHPCodeGenerator::GetAddToolbarCode( PObjectInfo info, PObjectBase obj, wxArrayString& codelines ) { wxString _template; PCodeInfo code_info = info->GetCodeInfo( wxT( "PHP" ) ); if ( !code_info ) return; _template = code_info->GetTemplate( wxT( "toolbar_add" ) ); if ( !_template.empty() ) { PHPTemplateParser parser( obj, _template, m_i18n, m_useRelativePath, m_basePath ); wxString code = parser.ParseTemplate(); if ( !code.empty() ) { if( codelines.Index( code ) == wxNOT_FOUND ) codelines.Add( code ); } } // Proceeding recursively with the base classes for ( unsigned int i = 0; i < info->GetBaseClassCount(); i++ ) { PObjectInfo base_info = info->GetBaseClass( i ); GetAddToolbarCode( base_info, obj, codelines ); } }
bool ObjectInfo::IsSubclassOf(wxString classname) { bool found = false; if (GetClassName() == classname) found = true; else for (unsigned int i=0; !found && i < GetBaseClassCount() ; i++) { PObjectInfo base = GetBaseClass(i); found = base->IsSubclassOf(classname); } return found; }
bool PHPCodeGenerator::GenEventEntry( PObjectBase obj, PObjectInfo obj_info, const wxString& templateName, const wxString& handlerName, bool disconnect ) { wxString _template; PCodeInfo code_info = obj_info->GetCodeInfo( wxT("PHP") ); if ( code_info ) { _template = code_info->GetTemplate( wxString::Format( wxT("evt_%s%s"), disconnect ? wxT("dis") : wxT(""), templateName.c_str() ) ); if ( disconnect && _template.empty() ) { _template = code_info->GetTemplate( wxT("evt_") + templateName ); _template.Replace( wxT("Connect"), wxT("Disconnect"), true ); } if ( !_template.empty() ) { if( disconnect ) { if( m_disconnecMode == wxT("handler_name")) _template.Replace( wxT("#handler"), wxT("handler = array(@$this, \"") + handlerName + wxT("\")") ); else if(m_disconnecMode == wxT("source_name")) _template.Replace( wxT("#handler"), wxT("null") ); //wxT("$this->") + obj->GetProperty(wxT("name"))->GetValueAsString() ); } else _template.Replace( wxT("#handler"), wxT("array(@$this, \"") + handlerName + wxT("\")") ); PHPTemplateParser parser( obj, _template, m_i18n, m_useRelativePath, m_basePath ); m_source->WriteLn( parser.ParseTemplate() ); return true; } } for ( unsigned int i = 0; i < obj_info->GetBaseClassCount(); i++ ) { PObjectInfo base_info = obj_info->GetBaseClass( i ); if ( GenEventEntry( obj, base_info, templateName, handlerName, disconnect ) ) { return true; } } return false; }
void wxFbPalette::PopulateToolbar( PObjectPackage pkg, wxToolBar *toolbar ) #endif { unsigned int j = 0; while ( j < pkg->GetObjectCount() ) { PObjectInfo info = pkg->GetObjectInfo( j ); if ( info->IsStartOfGroup() ) { toolbar->AddSeparator(); } if ( NULL == info->GetComponent() ) { #if wxVERSION_NUMBER < 2900 LogDebug( _( "Missing Component for Class \"%s\" of Package \"%s\"." ), info->GetClassName().c_str(), pkg->GetPackageName().c_str() ); #else LogDebug(_("Missing Component for Class \"" + info->GetClassName() + "\" of Package \"" + pkg->GetPackageName() + "\".") ); #endif } else { wxString widget( info->GetClassName() ); wxBitmap icon = info->GetIconFile(); #ifdef __WXMAC__ wxBitmapButton* button = new wxBitmapButton( toolbar, nextId++, icon ); button->SetToolTip( widget ); toolbar->AddControl( button ); #else toolbar->AddTool(nextId++, widget, icon, widget); #endif toolbar->Realize(); } j++; } }
PObjectBase XrcLoader::GetObject( ticpp::Element *xrcObj, PObjectBase parent ) { // First, create the object by the name, the modify the properties std::string className = xrcObj->GetAttribute( "class" ); if ( parent->GetObjectTypeName() == wxT( "project" ) ) { if ( className == "wxBitmap" ) { PProperty bitmapsProp = parent->GetProperty( _( "bitmaps" ) ); if ( bitmapsProp ) { wxString value = bitmapsProp->GetValue(); wxString text = _WXSTR( xrcObj->GetText() ); text.Replace( wxT( "\'" ), wxT( "\'\'" ), true ); value << wxT( "\'" ) << text << wxT( "\' " ); bitmapsProp->SetValue( value ); return PObjectBase(); } } if ( className == "wxIcon" ) { PProperty iconsProp = parent->GetProperty( _( "icons" ) ); if ( iconsProp ) { wxString value = iconsProp->GetValue(); wxString text = _WXSTR( xrcObj->GetText() ); text.Replace( wxT( "\'" ), wxT( "\'\'" ), true ); value << wxT( "\'" ) << text << wxT( "\' " ); iconsProp->SetValue( value ); return PObjectBase(); } } // Forms wxPanel, wxFrame, wxDialog are stored internally as Panel, Frame, and Dialog // to prevent conflicts with wxPanel as a container className = className.substr( 2, className.size() - 2 ); } // Well, this is not nice. wxMenu class name is ambiguous, so we'll get the // correct class by the context. If the parent of a wxMenu is another wxMenu // then the class name will be "submenu" else if ( className == "wxMenu" && ( parent->GetClassName() == wxT( "wxMenu" ) || parent->GetClassName() == wxT( "submenu" ) ) ) { className = "submenu"; } // "separator" is also ambiguous - could be a toolbar separator or a menu separator else if ( className == "separator" ) { if ( parent->GetClassName() == wxT( "wxToolBar" ) ) { className = "toolSeparator"; } } // replace "spacer" with "sizeritem" so it will be imported as a "sizeritem" // "sizeritem" is ambiguous - could also be a grid bag sizeritem else if ( className == "spacer" || className == "sizeritem" ) { if ( parent->GetClassName() == wxT( "wxGridBagSizer" ) ) { className = "gbsizeritem"; } else { className = "sizeritem"; } } PObjectBase object; PObjectInfo objInfo = m_objDb->GetObjectInfo( _WXSTR( className ) ); if ( objInfo ) { IComponent *comp = objInfo->GetComponent(); if ( !comp ) { wxLogError( _("No component found for class \"%s\", found on line %i."), _WXSTR( className ).c_str(), xrcObj->Row() ); } else { ticpp::Element *fbObj = comp->ImportFromXrc( xrcObj ); if ( !fbObj ) { wxLogError( _("ImportFromXrc returned NULL for class \"%s\", found on line %i."), _WXSTR( className ).c_str(), xrcObj->Row() ); } else { object = m_objDb->CreateObject( fbObj, parent ); if ( !object ) { // Unable to create the object and add it to the parent - probably needs a sizer PObjectBase newsizer = m_objDb->CreateObject( "wxBoxSizer", parent ); if ( newsizer ) { // It is possible the CreateObject returns an "item" containing the object, e.g. SizerItem or SplitterItem // If that is the case, reassign "object" to the actual object PObjectBase sizer = newsizer; if ( sizer->GetChildCount() > 0 ) { sizer = sizer->GetChild( 0 ); } if ( sizer ) { object = m_objDb->CreateObject( fbObj, sizer ); if ( object ) { parent->AddChild( newsizer ); newsizer->SetParent( parent ); } } } } if ( !object ) { wxLogError( wxT( "CreateObject failed for class \"%s\", with parent \"%s\", found on line %i" ), _WXSTR( className ).c_str(), parent->GetClassName().c_str(), xrcObj->Row() ); } else { // It is possible the CreateObject returns an "item" containing the object, e.g. SizerItem or SplitterItem // If that is the case, reassign "object" to the actual object if ( object && object->GetChildCount() > 0 ) object = object->GetChild( 0 ); if ( object ) { // Recursively import the children ticpp::Element *element = xrcObj->FirstChildElement( "object", false ); while ( element ) { GetObject( element, object ); element = element->NextSiblingElement( "object", false ); } } } } } } else { // Create a wxPanel to represent unknown classes object = m_objDb->CreateObject( "wxPanel", parent ); if ( object ) { parent->AddChild( object ); object->SetParent( parent ); wxLogError( wxT( "Unknown class \"%s\" found on line %i, replaced with a wxPanel" ), _WXSTR( className ).c_str(), xrcObj->Row() ); } else { wxString msg( wxString::Format( wxT( "Unknown class \"%s\" found on line %i, and could not replace with a wxPanel as child of \"%s:%s\"" ), _WXSTR( className ).c_str(), xrcObj->Row(), parent->GetPropertyAsString( wxT( "name" ) ).c_str(), parent->GetClassName().c_str() ) ); wxLogError( msg ); } } return object; }
void PHPCodeGenerator::GenSubclassSets( PObjectBase obj, std::set< wxString >* subclasses, std::vector< wxString >* headerIncludes ) { // Call GenSubclassForwardDeclarations on all children as well for ( unsigned int i = 0; i < obj->GetChildCount(); i++ ) { GenSubclassSets( obj->GetChild( i ), subclasses, headerIncludes ); } // Fill the set PProperty subclass = obj->GetProperty( wxT("subclass") ); if ( subclass ) { std::map< wxString, wxString > children; subclass->SplitParentProperty( &children ); std::map< wxString, wxString >::iterator name; name = children.find( wxT("name") ); if ( children.end() == name ) { // No name, so do nothing return; } wxString nameVal = name->second; if ( nameVal.empty() ) { // No name, so do nothing return; } // Now get the header std::map< wxString, wxString >::iterator header; header = children.find( wxT("header") ); if ( children.end() == header ) { // No header, so do nothing return; } wxString headerVal = header->second; if ( headerVal.empty() ) { // No header, so do nothing return; } // Got a header PObjectInfo info = obj->GetObjectInfo(); if ( !info ) { return; } PObjectPackage pkg = info->GetPackage(); if ( !pkg ) { return; } wxString include = wxT("include_once ") + headerVal + wxT(";"); std::vector< wxString >::iterator it = std::find( headerIncludes->begin(), headerIncludes->end(), include ); if ( headerIncludes->end() == it ) { headerIncludes->push_back( include ); } } }
void PHPCodeGenerator::GenConstruction(PObjectBase obj, bool is_widget ) { wxString type = obj->GetObjectTypeName(); PObjectInfo info = obj->GetObjectInfo(); if ( ObjectDatabase::HasCppProperties( type ) ) { m_source->WriteLn( GetCode( obj, wxT("construction") ) ); GenSettings( obj->GetObjectInfo(), obj ); bool isWidget = !info->IsSubclassOf( wxT("sizer") ); for ( unsigned int i = 0; i < obj->GetChildCount(); i++ ) { PObjectBase child = obj->GetChild( i ); GenConstruction( child, isWidget ); if ( type == wxT("toolbar") ) { GenAddToolbar(child->GetObjectInfo(), child); } } if ( !isWidget ) // sizers { wxString afterAddChild = GetCode( obj, wxT( "after_addchild" ) ); if ( !afterAddChild.empty() ) { m_source->WriteLn( afterAddChild ); } m_source->WriteLn(); if (is_widget) { // the parent object is not a sizer. There is no template for // this so we'll make it manually. // It's not a good practice to embed templates into the source code, // because you will need to recompile... wxString _template = wxT("#wxparent $name->SetSizer( @$$name ); #nl") wxT("#wxparent $name->Layout();") wxT("#ifnull #parent $size") wxT("@{ #nl @$$name->Fit( #wxparent $name ); @}"); PHPTemplateParser parser( obj, _template, m_i18n, m_useRelativePath, m_basePath ); m_source->WriteLn(parser.ParseTemplate()); } } else if ( type == wxT("splitter") ) { // Generating the split switch ( obj->GetChildCount() ) { case 1: { PObjectBase sub1 = obj->GetChild(0)->GetChild(0); wxString _template = wxT("@$this->$name->Initialize( "); _template = _template + wxT("@$this->") + sub1->GetProperty( wxT("name") )->GetValue() + wxT(" );"); PHPTemplateParser parser( obj, _template, m_i18n, m_useRelativePath, m_basePath ); m_source->WriteLn(parser.ParseTemplate()); break; } case 2: { PObjectBase sub1,sub2; sub1 = obj->GetChild(0)->GetChild(0); sub2 = obj->GetChild(1)->GetChild(0); wxString _template; if ( obj->GetProperty( wxT("splitmode") )->GetValue() == wxT("wxSPLIT_VERTICAL") ) { _template = wxT("@$this->$name->SplitVertically( "); } else { _template = wxT("@$this->$name->SplitHorizontally( "); } _template = _template + wxT("@$this->") + sub1->GetProperty( wxT("name") )->GetValue() + wxT(", @$this->") + sub2->GetProperty( wxT("name") )->GetValue() + wxT(", $sashpos );"); PHPTemplateParser parser( obj, _template, m_i18n, m_useRelativePath, m_basePath ); m_source->WriteLn(parser.ParseTemplate()); break; } default: wxLogError( wxT("Missing subwindows for wxSplitterWindow widget.") ); break; } } else if ( type == wxT("menubar") || type == wxT("menu") || type == wxT("submenu") || type == wxT("toolbar") || type == wxT("ribbonbar") || type == wxT("listbook") || type == wxT("simplebook") || type == wxT("notebook") || type == wxT("auinotebook") || type == wxT("treelistctrl") || type == wxT("flatnotebook") || type == wxT("wizard") ) { wxString afterAddChild = GetCode( obj, wxT("after_addchild") ); if ( !afterAddChild.empty() ) { m_source->WriteLn( afterAddChild ); } m_source->WriteLn(); } } else if ( info->IsSubclassOf( wxT("sizeritembase") ) ) { // The child must be added to the sizer having in mind the // child object type (there are 3 different routines) GenConstruction( obj->GetChild(0), false ); PObjectInfo childInfo = obj->GetChild(0)->GetObjectInfo(); wxString temp_name; if ( childInfo->IsSubclassOf( wxT("wxWindow") ) || wxT("CustomControl") == childInfo->GetClassName() ) { temp_name = wxT("window_add"); } else if ( childInfo->IsSubclassOf( wxT("sizer") ) ) { temp_name = wxT("sizer_add"); } else if ( childInfo->GetClassName() == wxT("spacer") ) { temp_name = wxT("spacer_add"); } else { LogDebug( wxT("SizerItem child is not a Spacer and is not a subclass of wxWindow or of sizer.") ); return; } m_source->WriteLn( GetCode( obj, temp_name ) ); } else if ( type == wxT("notebookpage") || type == wxT("flatnotebookpage") || type == wxT("listbookpage") || type == wxT("simplebookpage") || type == wxT("choicebookpage") || type == wxT("auinotebookpage") ) { GenConstruction( obj->GetChild( 0 ), false ); m_source->WriteLn( GetCode( obj, wxT("page_add") ) ); GenSettings( obj->GetObjectInfo(), obj ); } else if ( type == wxT("treelistctrlcolumn") ) { m_source->WriteLn( GetCode( obj, wxT("column_add") ) ); GenSettings( obj->GetObjectInfo(), obj ); } else if ( type == wxT("tool") ) { // If loading bitmap from ICON resource, and size is not set, set size to toolbars bitmapsize // So hacky, yet so useful ... wxSize toolbarsize = obj->GetParent()->GetPropertyAsSize( _("bitmapsize") ); if ( wxDefaultSize != toolbarsize ) { PProperty prop = obj->GetProperty( _("bitmap") ); if ( prop ) { wxString oldVal = prop->GetValueAsString(); wxString path, source; wxSize toolsize; TypeConv::ParseBitmapWithResource( oldVal, &path, &source, &toolsize ); if ( wxT("Load From Icon Resource") == source && wxDefaultSize == toolsize ) { prop->SetValue( wxString::Format( wxT("%s; %s [%i; %i]"), path.c_str(), source.c_str(), toolbarsize.GetWidth(), toolbarsize.GetHeight() ) ); m_source->WriteLn( GetCode( obj, wxT("construction") ) ); prop->SetValue( oldVal ); return; } } } m_source->WriteLn( GetCode( obj, wxT("construction") ) ); } else { // Generate the children for ( unsigned int i = 0; i < obj->GetChildCount(); i++ ) { GenConstruction( obj->GetChild( i ), false ); } } }