#include "sdk_precomp.h" #include #include #include #include #include "manager.h" #include "projectmanager.h" #include "messagemanager.h" #include "editormanager.h" #include "cbeditor.h" #include "cbproject.h" #include "projectlayoutloader.h" #include "tinyxml/tinyxml.h" ProjectLayoutLoader::ProjectLayoutLoader(cbProject* project) : m_pProject(project), m_TopProjectFile(0L) { //ctor } ProjectLayoutLoader::~ProjectLayoutLoader() { //dtor } // IMPORTANT! We have to be careful of what to unicode and what not to. // TinyXML must use NON-unicode strings! bool ProjectLayoutLoader::Open(const wxString& filename) { TiXmlDocument doc(filename.mb_str()); if (!doc.LoadFile()) return false; ProjectManager* pMan = Manager::Get()->GetProjectManager(); MessageManager* pMsg = Manager::Get()->GetMessageManager(); if (!pMan || !pMsg) return false; cbProject* pProject = pMan->GetActiveProject(); if (!pProject) return false; TiXmlElement* root; TiXmlElement* elem; wxString fname; ProjectFile* pf; root = doc.FirstChildElement("CodeBlocks_layout_file"); if (!root) { // old tag root = doc.FirstChildElement("Code::Blocks_layout_file"); if (!root) { pMsg->DebugLog(_("Not a valid Code::Blocks layout file...")); return false; } } elem = root->FirstChildElement("File"); if (!elem) { //pMsg->DebugLog(_("No 'File' element in file...")); return false; } while (elem) { //pMsg->DebugLog(elem->Value()); fname = _U(elem->Attribute("name")); if (fname.IsEmpty()) { //pMsg->DebugLog(_("'File' node exists, but no filename?!?")); pf = 0L; } else pf = pProject->GetFileByFilename(fname); if (pf) { pf->editorOpen = false; pf->editorPos = 0; pf->editorTopLine = 0; int open = 0; int top = 0; if (elem->QueryIntAttribute("open", &open) == TIXML_SUCCESS) pf->editorOpen = open != 0; if (elem->QueryIntAttribute("top", &top) == TIXML_SUCCESS) { if(top) m_TopProjectFile = pf; } TiXmlElement* cursor = elem->FirstChildElement(); if (cursor) { int pos = 0; int topline = 0; if (cursor->QueryIntAttribute("position", &pos) == TIXML_SUCCESS) pf->editorPos = pos; if (cursor->QueryIntAttribute("topLine", &topline) == TIXML_SUCCESS) pf->editorTopLine = topline; } } elem = elem->NextSiblingElement(); } return true; } bool ProjectLayoutLoader::Save(const wxString& filename) { wxString buffer; wxArrayString array; buffer << _T("") << _T('\n'); buffer << _T("") << _T('\n'); buffer << _T("") << _T('\n'); ProjectFile* active = 0L; cbEditor* ed = Manager::Get()->GetEditorManager()->GetBuiltinActiveEditor(); if (ed) active = ed->GetProjectFile(); int count = m_pProject->GetFilesCount(); for (int i = 0; i < count; ++i) { ProjectFile* f = m_pProject->GetFile(i); if (f->editorOpen || f->editorPos || f->editorTopLine) { buffer << _T('\t') << _T("relativeFilename << _T("\" "); buffer << _T("open=\"") << f->editorOpen << _T("\" "); buffer << _T("top=\"") << (f == active) << _T("\">") << _T('\n'); buffer << _T('\t') << _T('\t') << _T("editorPos << _T("\" topLine=\"") << f->editorTopLine << _T("\"/>") << _T('\n'); buffer << _T('\t') << _T("") << _T('\n'); } } const wxArrayString& en = m_pProject->ExpandedNodes(); for (unsigned int i = 0; i < en.GetCount(); ++i) { if (!en[i].IsEmpty()) buffer << _T('\t') << _T("") << _T('\n'); } buffer << _T("") << _T('\n'); wxFile file(filename, wxFile::write); return cbWrite(file,buffer); }