void WizardsPlugin::DoCreateNewPlugin() { //Load the wizard PluginWizard wiz(wxTheApp->GetTopWindow()); NewPluginData data; if (wiz.Run(data)) { //load the template file and replace all variables with the //actual values provided by user wxString filename(m_mgr->GetStartupDirectory() + wxT("/templates/gizmos/liteeditor-plugin.project.wizard")); wxString content; if (!ReadFileWithConversion(filename, content)) { return; } // Convert the paths provided by user to relative paths wxFileName fn(data.GetCodelitePath(), ""); if ( !fn.MakeRelativeTo( wxFileName(data.GetProjectPath()).GetPath()) ) { wxLogMessage(wxT("Warning: Failed to convert paths to relative path.")); } #ifdef __WXMSW__ wxString dllExt(wxT("dll")); #else wxString dllExt(wxT("so")); #endif wxString clpath = fn.GetFullPath(); fn.Normalize(); // Remove all .. and . from the path if ( clpath.EndsWith("/") || clpath.EndsWith("\\") ) { clpath.RemoveLast(); } content.Replace(wxT("$(CodeLitePath)"), clpath); content.Replace(wxT("$(DllExt)"), dllExt); content.Replace(wxT("$(PluginName)"), data.GetPluginName()); wxString baseFileName = data.GetPluginName(); baseFileName.MakeLower(); content.Replace(wxT("$(BaseFileName)"), baseFileName); content.Replace(wxT("$(ProjectName)"), data.GetPluginName()); //save the file to the disk wxString projectFileName; projectFileName << data.GetProjectPath(); { wxLogNull noLog; ::wxMkdir( wxFileName(data.GetProjectPath()).GetPath() ); } wxFFile file; if (!file.Open(projectFileName, wxT("w+b"))) { return; } file.Write(content); file.Close(); //Create the plugin source and header files wxFileName srcFile(wxFileName(data.GetProjectPath()).GetPath(), baseFileName); srcFile.SetExt("cpp"); wxFileName headerFile(wxFileName(data.GetProjectPath()).GetPath(), baseFileName); headerFile.SetExt("h"); //--------------------------------------------------------------- //write the content of the file based on the file template //--------------------------------------------------------------- //Generate the source files filename = m_mgr->GetStartupDirectory() + wxT("/templates/gizmos/plugin.cpp.wizard"); content.Clear(); if (!ReadFileWithConversion(filename, content)) { wxMessageBox(_("Failed to load wizard's file 'plugin.cpp.wizard'"), _("CodeLite"), wxICON_WARNING | wxOK); return; } // Expand macros content.Replace(wxT("$(PluginName)"), data.GetPluginName()); content.Replace(wxT("$(BaseFileName)"), baseFileName); content.Replace(wxT("$(PluginShortName)"), data.GetPluginName()); content.Replace(wxT("$(PluginLongName)"), data.GetPluginDescription()); content.Replace(wxT("$(UserName)"), wxGetUserName().c_str()); // Notify the formatter plugin to format the plugin source files clSourceFormatEvent evtFormat(wxEVT_FORMAT_STRING); evtFormat.SetInputString( content ); EventNotifier::Get()->ProcessEvent( evtFormat ); content = evtFormat.GetFormattedString(); // Write it down file.Open(srcFile.GetFullPath(), wxT("w+b")); file.Write(content); file.Close(); //create the header file filename = m_mgr->GetStartupDirectory() + wxT("/templates/gizmos/plugin.h.wizard"); content.Clear(); if (!ReadFileWithConversion(filename, content)) { wxMessageBox(_("Failed to load wizard's file 'plugin.h.wizard'"), _("CodeLite"), wxICON_WARNING | wxOK); return; } // Expand macros content.Replace(wxT("$(PluginName)"), data.GetPluginName()); content.Replace(wxT("$(BaseFileName)"), baseFileName); content.Replace(wxT("$(PluginShortName)"), data.GetPluginName()); content.Replace(wxT("$(PluginLongName)"), data.GetPluginDescription()); content.Replace(wxT("$(UserName)"), wxGetUserName().c_str()); // format the content evtFormat.SetString(content); EventNotifier::Get()->ProcessEvent( evtFormat ); content = evtFormat.GetString(); // Write it down file.Open(headerFile.GetFullPath(), wxT("w+b")); file.Write(content); file.Close(); //add the new project to the workspace wxString errMsg; //convert the path to be full path as required by the //workspace manager m_mgr->AddProject(projectFileName); } }