void Autosave::SaveProject(cbProject *p, int method) { PluginManager *plm = Manager::Get()->GetPluginManager(); switch(method) { case 0: { if(p->GetModified()) { if(::wxRenameFile(p->GetFilename(), p->GetFilename() + _T(".bak"))) if(p->Save()) { CodeBlocksEvent e(cbEVT_PROJECT_SAVE, 0, p); plm->NotifyPlugins(e); } } wxFileName file = p->GetFilename(); file.SetExt(_T("layout")); wxString filename = file.GetFullPath(); if(::wxRenameFile(filename, filename + _T(".bak"))) p->SaveLayout(); break; } case 1: { if(p->GetModified() && p->Save()) { CodeBlocksEvent e(cbEVT_PROJECT_SAVE, 0, p); plm->NotifyPlugins(e); } p->SaveLayout(); break; } case 2: case 3: // doesn't really make sense to keep so many versions of a project file { if (p->IsLoaded() == false) return; if(p->GetModified()) { ProjectLoader loader(p); if(loader.Save(p->GetFilename() + _T(".save"))) { CodeBlocksEvent e(cbEVT_PROJECT_SAVE, 0, p); plm->NotifyPlugins(e); } p->SetModified(); // the actual project file is still not updated! } wxFileName file = wxFileName(p->GetFilename()); file.SetExt(_T("layout")); wxString filename = file.GetFullPath(); wxString temp = filename + _T(".temp"); wxString save = filename + _T(".save"); if(::wxFileExists(filename) && ::wxCopyFile(filename, temp)) { p->SaveLayout(); ::wxRenameFile(filename, save); ::wxRenameFile(temp, filename); } break; } default: break; } }
void Autosave::OnTimer(wxTimerEvent& e) { if(e.GetId() == 10000) { PluginManager *plm = Manager::Get()->GetPluginManager(); int method = Manager::Get()->GetConfigManager(_T("autosave"))->ReadInt(_T("method")); ProjectManager *pm = Manager::Get()->GetProjectManager(); if(pm && pm->GetActiveProject()) { if(cbProject * p = pm->GetActiveProject()) { switch(method) { case 0: { if(p->GetModified()) { if(::wxRenameFile(p->GetFilename(), p->GetFilename() + _T(".bak"))) if(p->Save()) { CodeBlocksEvent e(cbEVT_PROJECT_SAVE, 0, p); plm->NotifyPlugins(e); } } wxFileName file = p->GetFilename(); file.SetExt(_T("layout")); wxString filename = file.GetFullPath(); if(::wxRenameFile(filename, filename + _T(".bak"))) p->SaveLayout(); break; } case 1: { if(p->GetModified() && p->Save()) { CodeBlocksEvent e(cbEVT_PROJECT_SAVE, 0, p); plm->NotifyPlugins(e); } p->SaveLayout(); break; } case 2: case 3: // doesn't really make sense to keep so many versions of a project file { if (p->IsLoaded() == false) return; if(p->GetModified()) { ProjectLoader loader(p); if(loader.Save(p->GetFilename() + _T(".save"))) { CodeBlocksEvent e(cbEVT_PROJECT_SAVE, 0, p); plm->NotifyPlugins(e); } p->SetModified(); // the actual project file is still not updated! } wxFileName file = wxFileName(p->GetFilename()); file.SetExt(_T("layout")); wxString filename = file.GetFullPath(); wxString temp = filename + _T(".temp"); wxString save = filename + _T(".save"); if(::wxFileExists(filename) && ::wxCopyFile(filename, temp)) { p->SaveLayout(); ::wxRenameFile(filename, save); ::wxRenameFile(temp, filename); } break; } } } } } else if(e.GetId() == 20000) { int method = Manager::Get()->GetConfigManager(_T("autosave"))->ReadInt(_T("method")); EditorManager* em = Manager::Get()->GetEditorManager(); if(em) { for(int i = 0; i < em->GetEditorsCount(); ++i) { cbEditor* ed = em->GetBuiltinEditor(em->GetEditor(i)); if(ed && ed->GetModified()) { wxFileName fn(ed->GetFilename()); switch(method) { case 0: { if(::wxRenameFile(fn.GetFullPath(), fn.GetFullPath() + _T(".bak"))) cbSaveToFile(fn.GetFullPath(), ed->GetControl()->GetText(), ed->GetEncoding(), ed->GetUseBom()); break; } case 1: { ed->Save(); break; } case 2: { cbSaveToFile(fn.GetFullPath() + _T(".save"), ed->GetControl()->GetText(), ed->GetEncoding(), ed->GetUseBom()); ed->SetModified(); // the "real" file has not been saved! break; } case 3: { wxString tmp1; wxString tmp2; for(unsigned int i = 8; i; --i) { tmp1.Printf(_T("%s/%s.%u.%s"), fn.GetPath().c_str(), fn.GetName().c_str(), i, fn.GetExt().c_str()); tmp2.Printf(_T("%s/%s.%u.%s"), fn.GetPath().c_str(), fn.GetName().c_str(), i+1, fn.GetExt().c_str()); if(::wxFileExists(tmp2)) ::wxRemoveFile(tmp2); if(::wxFileExists(tmp1)) ::wxRenameFile(tmp1, tmp2); } tmp1.Printf(_T("%s/%s.1.%s"), fn.GetPath().c_str(), fn.GetName().c_str(), fn.GetExt().c_str()); cbSaveToFile(tmp1, ed->GetControl()->GetText(), ed->GetEncoding(), ed->GetUseBom()); ed->SetModified(); // the "real" file has not been saved! break; } } } } } } }