2
* This file is part of the Code::Blocks IDE and licensed under the GNU General Public License, version 3
3
* http://www.gnu.org/licenses/gpl-3.0.html
13
#include <wx/filename.h>
16
#include <wx/filename.h>
17
#include <wx/fs_zip.h>
19
#include <wx/xrc/xmlres.h>
23
#include "logmanager.h"
24
#include "projectmanager.h"
25
#include "logmanager.h"
26
#include "compilerfactory.h"
27
#include "cbproject.h"
28
#include "cbworkspace.h"
31
#include "projectsimporter.h"
32
#include "devcpploader.h"
33
#include "msvc7loader.h"
34
#include "msvc7workspaceloader.h"
35
#include "msvcloader.h"
36
#include "msvcworkspaceloader.h"
37
#include "importers_globals.h"
38
#include "filefilters.h"
40
// this auto-registers the plugin
43
PluginRegistrant<ProjectsImporter> reg(_T("ProjectsImporter"));
46
ProjectsImporter::ProjectsImporter()
49
if (!Manager::LoadResource(_T("projectsimporter.zip")))
51
NotifyMissingFile(_T("projectsimporter.zip"));
55
ProjectsImporter::~ProjectsImporter()
60
void ProjectsImporter::OnAttach()
65
void ProjectsImporter::OnRelease(bool appShutDown)
69
int ProjectsImporter::Configure()
74
cbConfigurationPanel* ProjectsImporter::GetConfigurationPanel(wxWindow* parent)
79
void ProjectsImporter::BuildMenu(wxMenuBar* menuBar)
81
if (!IsAttached() || !menuBar)
86
m_Menu = Manager::Get()->LoadMenu(_T("project_import_menu"), false);
93
wxMenu* fileMenu = menuBar->GetMenu(0);
96
// The position is hard-coded. Please adjust it if necessary
97
fileMenu->Insert(7, wxNewId(), _T("&Import project"), m_Menu);
98
fileMenu->InsertSeparator(8);
102
bool ProjectsImporter::CanHandleFile(const wxString& filename) const
104
FileType ft = FileTypeOf(filename);
105
return ft == ftDevCppProject ||
106
ft == ftMSVC6Project ||
107
ft == ftMSVC6Workspace ||
108
ft == ftMSVC7Project ||
109
ft == ftMSVC7Workspace;
112
int ProjectsImporter::OpenFile(const wxString& filename)
114
FileType ft = FileTypeOf(filename);
117
case ftDevCppProject: // fallthrough
118
case ftMSVC6Project: // fallthrough
119
case ftMSVC7Project: // fallthrough
120
case ftXcode1Project: // fallthrough
121
case ftXcode2Project: // fallthrough
122
return LoadProject(filename);
125
case ftMSVC6Workspace: // fallthrough
126
case ftMSVC7Workspace: // fallthrough
127
return LoadWorkspace(filename);
131
cbMessageBox(_("Failed to import file: unsupported"), _("Error"), wxICON_ERROR);
137
int ProjectsImporter::LoadProject(const wxString& filename)
139
wxFileName the_file(filename);
140
if (!the_file.FileExists())
142
the_file.SetExt(FileFilters::CODEBLOCKS_EXT);
144
cbProject* prj = Manager::Get()->GetProjectManager()->NewProject(the_file.GetFullPath());
148
// Make a check whether the project exists in current workspace
149
if (Manager::Get()->GetProjectManager()->BeginLoadingProject())
2
* This file is part of the Code::Blocks IDE and licensed under the GNU General Public License, version 3
3
* http://www.gnu.org/licenses/gpl-3.0.html
13
#include <wx/filename.h>
16
#include <wx/filename.h>
17
#include <wx/fs_zip.h>
19
#include <wx/xrc/xmlres.h>
23
#include "logmanager.h"
24
#include "projectmanager.h"
25
#include "logmanager.h"
26
#include "compilerfactory.h"
27
#include "cbproject.h"
28
#include "cbworkspace.h"
31
#include "projectsimporter.h"
32
#include "devcpploader.h"
33
#include "msvc7loader.h"
34
#include "msvc7workspaceloader.h"
35
#include "msvcloader.h"
36
#include "msvcworkspaceloader.h"
37
#include "importers_globals.h"
38
#include "filefilters.h"
40
// this auto-registers the plugin
43
PluginRegistrant<ProjectsImporter> reg(_T("ProjectsImporter"));
46
ProjectsImporter::ProjectsImporter()
49
if (!Manager::LoadResource(_T("projectsimporter.zip")))
51
NotifyMissingFile(_T("projectsimporter.zip"));
55
ProjectsImporter::~ProjectsImporter()
60
void ProjectsImporter::OnAttach()
65
void ProjectsImporter::OnRelease(bool appShutDown)
69
int ProjectsImporter::Configure()
74
cbConfigurationPanel* ProjectsImporter::GetConfigurationPanel(wxWindow* parent)
79
void ProjectsImporter::BuildMenu(wxMenuBar* menuBar)
81
if (!IsAttached() || !menuBar)
86
m_Menu = Manager::Get()->LoadMenu(_T("project_import_menu"), false);
93
wxMenu* fileMenu = menuBar->GetMenu(0);
96
int menuId = 0, id = 0;
97
wxMenuItemList menuItems = fileMenu->GetMenuItems();
98
menuId = fileMenu->FindItem(_T("R&ecent files"));
99
wxMenuItem* recentFileItem = fileMenu->FindItem(menuId);
100
id = menuItems.IndexOf(recentFileItem);
101
if (id == wxNOT_FOUND)
109
// The position is hard-coded to "Recent Files" menu. Please adjust it if necessary
110
fileMenu->Insert(++id, wxNewId(), _("&Import project"), m_Menu);
111
fileMenu->InsertSeparator(++id);
115
bool ProjectsImporter::CanHandleFile(const wxString& filename) const
117
const FileType ft = FileTypeOf(filename);
118
return ft == ftDevCppProject ||
119
ft == ftMSVC6Project ||
120
ft == ftMSVC6Workspace ||
121
ft == ftMSVC7Project ||
122
ft == ftMSVC7Workspace;
125
int ProjectsImporter::OpenFile(const wxString& filename)
127
const FileType ft = FileTypeOf(filename);
130
case ftDevCppProject: // fallthrough
131
case ftMSVC6Project: // fallthrough
132
case ftMSVC7Project: // fallthrough
133
case ftXcode1Project: // fallthrough
134
case ftXcode2Project: // fallthrough
135
return LoadProject(filename);
138
case ftMSVC6Workspace: // fallthrough
139
case ftMSVC7Workspace: // fallthrough
140
return LoadWorkspace(filename);
144
cbMessageBox(_("Failed to import file: unsupported"), _("Error"), wxICON_ERROR);
150
int ProjectsImporter::LoadProject(const wxString& filename)
152
wxFileName the_file(filename);
153
if (!the_file.FileExists())
155
the_file.SetExt(FileFilters::CODEBLOCKS_EXT);
157
cbProject* prj = Manager::Get()->GetProjectManager()->NewProject(the_file.GetFullPath());
161
// Make a check whether the project exists in current workspace
162
if (Manager::Get()->GetProjectManager()->BeginLoadingProject())
166
#if wxCHECK_VERSION(2, 9, 0)
167
Manager::Get()->GetLogManager()->Log(F(_("Importing %s: "), filename.wx_str()));
153
169
Manager::Get()->GetLogManager()->Log(F(_("Importing %s: "), filename.c_str()));
154
IBaseLoader* loader = 0L;
155
FileType ft = FileTypeOf(filename);
158
case ftDevCppProject:
159
loader = new DevCppLoader(prj); break;
161
loader = new MSVCLoader(prj); break;
163
loader = new MSVC7Loader(prj); break;
164
case ftXcode1Project: /* placeholder, fallthrough (for now) */
165
case ftXcode2Project: /* placeholder, fallthrough (for now) */
167
Manager::Get()->GetProjectManager()->EndLoadingProject(0);
168
cbMessageBox(_("Failed to import file: File type not supported."), _("Error"), wxICON_ERROR);
173
if (ImportersGlobals::UseDefaultCompiler)
174
compilerID = CompilerFactory::GetDefaultCompilerID();
177
// select compiler for the imported project
178
// need to do it before actual import, because the importer might need
179
// project's compiler information (like the object files extension etc).
180
Compiler* compiler = CompilerFactory::SelectCompilerUI(_("Select compiler for ") + wxFileName(filename).GetFullName());
181
if (!compiler) // User hit Cancel.
183
if (loader) delete loader;
184
Manager::Get()->GetProjectManager()->EndLoadingProject(0);
185
Manager::Get()->GetProjectManager()->CloseProject(prj, true, false);
186
Manager::Get()->GetProjectManager()->RebuildTree();
187
cbMessageBox(_("Import canceled."), _("Information"), wxICON_INFORMATION);
191
compilerID = compiler->GetID();
192
if (compilerID.IsEmpty())
193
compilerID = CompilerFactory::GetDefaultCompilerID();
196
prj->SetCompilerID(compilerID);
198
// actually import project file
199
if (loader->Open(filename))
201
prj->CalculateCommonTopLevelPath();
202
prj->Save(); // Save it now to avoid project file opening error
203
// prj->SetModified(true);
205
Manager::Get()->GetProjectManager()->EndLoadingProject(prj);
206
if (!Manager::Get()->GetProjectManager()->IsLoadingWorkspace())
207
Manager::Get()->GetProjectManager()->SetProject(prj);
211
if (loader) delete loader;
212
Manager::Get()->GetProjectManager()->EndLoadingProject(0);
213
Manager::Get()->GetProjectManager()->CloseProject(prj, true, false);
214
Manager::Get()->GetProjectManager()->RebuildTree();
215
cbMessageBox(_("Failed to import file: Wrong file format."), _("Error"), wxICON_ERROR);
219
if (loader) delete loader;
220
Manager::Get()->GetProjectManager()->EndLoadingProject(prj);
224
cbMessageBox(_("Failed to import file (internal error)."), _("Error"), wxICON_ERROR);
225
Manager::Get()->GetProjectManager()->EndLoadingProject(0);
226
Manager::Get()->GetProjectManager()->CloseProject(prj, true, false);
227
Manager::Get()->GetProjectManager()->RebuildTree();
231
int ProjectsImporter::LoadWorkspace(const wxString& filename)
233
wxFileName the_file(filename);
234
if (!the_file.FileExists())
239
if (!Manager::Get()->GetProjectManager()->BeginLoadingWorkspace())
242
cbWorkspace* wksp = Manager::Get()->GetProjectManager()->GetWorkspace();
245
Manager::Get()->GetProjectManager()->EndLoadingWorkspace();
171
IBaseLoader* loader = 0L;
172
FileType ft = FileTypeOf(filename);
175
case ftDevCppProject:
176
loader = new DevCppLoader(prj); break;
178
loader = new MSVCLoader(prj); break;
180
loader = new MSVC7Loader(prj); break;
181
case ftXcode1Project: /* placeholder, fallthrough (for now) */
182
case ftXcode2Project: /* placeholder, fallthrough (for now) */
184
Manager::Get()->GetProjectManager()->EndLoadingProject(0);
185
cbMessageBox(_("Failed to import file: File type not supported."), _("Error"), wxICON_ERROR);
190
if (ImportersGlobals::UseDefaultCompiler)
191
compilerID = CompilerFactory::GetDefaultCompilerID();
194
// select compiler for the imported project
195
// need to do it before actual import, because the importer might need
196
// project's compiler information (like the object files extension etc).
197
Compiler* compiler = CompilerFactory::SelectCompilerUI(_("Select compiler for ") + wxFileName(filename).GetFullName());
198
if (!compiler) // User hit Cancel.
200
if (loader) delete loader;
201
Manager::Get()->GetProjectManager()->EndLoadingProject(0);
202
Manager::Get()->GetProjectManager()->CloseProject(prj, true, false);
203
Manager::Get()->GetProjectManager()->RebuildTree();
204
cbMessageBox(_("Import canceled."), _("Information"), wxICON_INFORMATION);
208
compilerID = compiler->GetID();
209
if (compilerID.IsEmpty())
210
compilerID = CompilerFactory::GetDefaultCompilerID();
213
prj->SetCompilerID(compilerID);
215
// actually import project file
216
if (loader->Open(filename))
218
prj->CalculateCommonTopLevelPath();
219
prj->Save(); // Save it now to avoid project file opening error
220
// prj->SetModified(true);
222
Manager::Get()->GetProjectManager()->EndLoadingProject(prj);
223
if (!Manager::Get()->GetProjectManager()->IsLoadingWorkspace())
224
Manager::Get()->GetProjectManager()->SetProject(prj);
228
if (loader) delete loader;
229
Manager::Get()->GetProjectManager()->EndLoadingProject(0);
230
Manager::Get()->GetProjectManager()->CloseProject(prj, true, false);
231
Manager::Get()->GetProjectManager()->RebuildTree();
232
cbMessageBox(_("Failed to import file: Wrong file format."), _("Error"), wxICON_ERROR);
236
if (loader) delete loader;
237
Manager::Get()->GetProjectManager()->EndLoadingProject(prj);
241
cbMessageBox(_("Failed to import file (internal error)."), _("Error"), wxICON_ERROR);
242
Manager::Get()->GetProjectManager()->EndLoadingProject(0);
243
Manager::Get()->GetProjectManager()->CloseProject(prj, true, false);
244
Manager::Get()->GetProjectManager()->RebuildTree();
248
int ProjectsImporter::LoadWorkspace(const wxString& filename)
250
wxFileName the_file(filename);
251
if (!the_file.FileExists())
256
if (!Manager::Get()->GetProjectManager()->BeginLoadingWorkspace())
259
cbWorkspace* wksp = Manager::Get()->GetProjectManager()->GetWorkspace();
262
Manager::Get()->GetProjectManager()->EndLoadingWorkspace();
266
#if wxCHECK_VERSION(2, 9, 0)
267
Manager::Get()->GetLogManager()->Log(F(_("Importing %s: "), filename.wx_str()));
249
269
Manager::Get()->GetLogManager()->Log(F(_("Importing %s: "), filename.c_str()));
250
FileType ft = FileTypeOf(filename);
251
IBaseWorkspaceLoader* pWsp = 0;
254
case ftMSVC6Workspace:
255
pWsp = new MSVCWorkspaceLoader; break;
256
case ftMSVC7Workspace:
257
pWsp = new MSVC7WorkspaceLoader; break;
264
cbMessageBox(_("Failed to import file: unsupported"), _("Error"), wxICON_ERROR);
265
Manager::Get()->GetProjectManager()->EndLoadingWorkspace();
270
if (pWsp->Open(filename, Title))
272
if (!Title.IsEmpty())
274
wksp->SetTitle(Title);
277
wksp->SetModified(true);
280
Manager::Get()->GetProjectManager()->EndLoadingWorkspace();
271
FileType ft = FileTypeOf(filename);
272
IBaseWorkspaceLoader* pWsp = 0;
275
case ftMSVC6Workspace:
276
pWsp = new MSVCWorkspaceLoader; break;
277
case ftMSVC7Workspace:
278
pWsp = new MSVC7WorkspaceLoader; break;
285
cbMessageBox(_("Failed to import file: unsupported"), _("Error"), wxICON_ERROR);
286
Manager::Get()->GetProjectManager()->EndLoadingWorkspace();
291
if (pWsp->Open(filename, Title))
293
if (!Title.IsEmpty())
295
wksp->SetTitle(Title);
297
wksp->SetModified(true);
300
cbMessageBox(_("Failed to import *any* projects from workspace file."), _("Error"), wxICON_ERROR);
303
Manager::Get()->GetProjectManager()->EndLoadingWorkspace();