#include "ide.h" const char tempaux[] = ""; const char prjaux[] = ""; const char ideaux[] = ""; Font WorkspaceWork::ListFont() { return StdFont(); }; String WorkspaceWork::PackagePathA(const String& pn) { if(pn == prjaux) { String nm; String cfg = ConfigFile("cfg"); for(const char *s = main; *s; s++) nm.Cat(*s == '\\' || *s == '/' ? '$' : *s); RealizeDirectory(cfg); return AppendFileName(cfg, ForceExt(nm + '@' + GetVarsName(), ".aux")); } if(pn == ideaux) return ConfigFile("ide.aux"); if(pn == tempaux) return ConfigFile(Sprintf("aux%x.tmp", #ifdef PLATFORM_WIN32 GetCurrentProcessId() #endif #ifdef PLATFORM_POSIX getpid() #endif )); if(pn == METAPACKAGE) return Null; return PackagePath(pn); } void WorkspaceWork::ScanWorkspace() { Workspace wspc; wspc.Scan(main); actualpackage.Clear(); actualfileindex = -1; filelist.Clear(); package.Clear(); Vector pks; Vector speed; for(int i = 0; i < wspc.package.GetCount(); i++) { pks.Add(wspc.package.GetKey(i)); speed.Add(wspc.GetPackage(i).optimize_speed); } if(sort) IndexSort(pks.Begin() + 1, pks.End(), speed.Begin() + 1, StdLess()); for(int i = 0; i < wspc.package.GetCount(); i++) { String pk = pks[i]; Font fnt = ListFont(); if(i == 0) fnt.Bold(); PackageInfo pi = GetPackageInfo(pk); if(pi.bold) fnt.Bold(); if(pi.italic) fnt.Italic(); package.Add(pk, speed[i] ? IdeCommonImg::FastPackage() : IdeImg::Package(), fnt, Nvl(pi.ink, SColorText()), false, 0, Null, SColorMark); } if(!organizer) { package.Add(prjaux, IdeImg::PrjAux(), ListFont(), Magenta); package.Add(ideaux, IdeImg::IdeAux(), ListFont(), Magenta); package.Add(tempaux, IdeImg::TempAux(), ListFont(), Magenta); package.Add(METAPACKAGE, IdeImg::Meta(), ListFont(), Red); } package.SetCursor(0); } void WorkspaceWork::SavePackage() { if(IsNull(actualpackage) || actualpackage == "") return; InvalidatePackageInfo(actualpackage); String pp = PackagePathA(actualpackage); RealizePath(pp); if(organizer && backup.Find(pp) < 0) { Backup& b = backup.Add(pp); FindFile ff(pp); if(ff) { b.time = ff.GetLastWriteTime(); b.data = LoadFile(pp); } else b.data = String::GetVoid(); } actual.Save(pp); String init; String mnm = Filter('_' + actualpackage + "_icpp_init_stub", CharFilterMacro); init << "#ifndef " << mnm << "\r\n"; init << "#define " << mnm << "\r\n"; Index once; for(int i = 0; i < actual.uses.GetCount(); i++) { String u = actual.uses[i].text; if(once.Find(u) < 0) { once.Add(u); init << "#include \"" << actual.uses[i].text << "/init\"\r\n"; } } for(int i = 0; i < actual.GetCount(); i++) { String f = actual[i]; if(ToLower(GetFileExt(f)) == ".icpp") init << "#define BLITZ_INDEX__ " << "F" + AsString(Uuid::Create()) << "\r\n" << "#include \"" << f << "\"\r\n" << "#undef BLITZ_INDEX__\r\n"; } init << "#endif\r\n"; SaveChangedFile(SourcePath(actualpackage, "init"), init); } void WorkspaceWork::RestoreBackup() { for(int i = 0; i < backup.GetCount(); i++) { Backup& b = backup[i]; String fn = backup.GetKey(i); if(b.data.IsVoid()) DeleteFile(fn); else { SaveFile(fn, b.data); SetFileTime(fn, b.time); } } } void WorkspaceWork::SaveLoadPackageNS() { SavePackage(); String p = actualpackage; String f; if(IsActiveFile()) f = ActiveFile(); int psc = package.GetSbPos(); int fsc = filelist.GetSbPos(); ScanWorkspace(); package.SetSbPos(psc); package.FindSetCursor(p); filelist.SetSbPos(fsc); filelist.FindSetCursor(f); } void WorkspaceWork::SaveLoadPackage() { SaveLoadPackageNS(); SyncWorkspace(); } void WorkspaceWork::LoadActualPackage() { Time utime = FileGetTime(ConfigFile("version")); filelist.Clear(); fileindex.Clear(); bool open = true; Time tm = GetSysTime(); for(int i = 0; i < actual.file.GetCount(); i++) { Package::File& f = actual.file[i]; if(f.separator) { open = closed.Find(Sepfo(actualpackage, f)) < 0; filelist.Add(f, open ? IdeImg::SeparatorClose() : IdeImg::SeparatorOpen(), ListFont().Bold(), open ? SColorMark : SColorText, true, 0, Null); fileindex.Add(i); } else if(open) { Color uln = Null; String p = SourcePath(GetActivePackage(), f); if(showtime) { FindFile ff(p); if(ff) { Time ftm = Time(ff.GetLastWriteTime()); if(ftm > utime) { int64 t = tm - ftm; if(t < 24 * 3600) uln = SColorMark; else if(t < 32 * 24 * 3600) uln = SColorDisabled; } } } Image m = IdeFileImage(f, f.optimize_speed); if(GetFileExt(p) == ".tpp" && IsFolder(p)) if(FileExists(AppendFileName(p, "all.i"))) m = TopicImg::IGroup(); else m = TopicImg::Group(); filelist.Add(f, m, ListFont(), SColorText, false, 0, Null, SColorMark, Null, Null, Null, uln); fileindex.Add(i); } } } void WorkspaceWork::TouchFile(const String& path) { if(!showtime) return; Time tm = GetSysTime(); String n = GetFileName(path); for(int i = 0; i < filelist.GetCount(); i++) { FileList::File f = filelist[i]; if(f.name == n && path == SourcePath(GetActivePackage(), f.name)) filelist.Set(i, f.name, f.icon, f.font, f.ink, false, 0, Null, SColorMark, Null, Null, Null, SColorMark); } } void WorkspaceWork::PackageCursor() { InvalidatePackageCache(); filelist.WhenBar.Clear(); actualpackage = GetActivePackage(); if(actualpackage.IsEmpty()) return; if(actualpackage == METAPACKAGE) { actual.file.Clear(); actual.file.Add(String(HELPNAME)); Vector d = GetUppDirs(); for(int i = 0; i < d.GetCount(); i++) actual.file.Add(AppendFileName(d[i], "$.tpp")); } else { String pp = PackagePathA(actualpackage); RealizePath(pp); actual.Load(pp); } LoadActualPackage(); filelist.Enable(); if(actualpackage != METAPACKAGE) filelist.WhenBar = THISBACK(FileMenu); } void WorkspaceWork::FileCursor() { int i = filelist.GetCursor(); actualfileindex = -1; if(i >= 0 && i < fileindex.GetCount()) actualfileindex = fileindex[i]; } String WorkspaceWork::FileName(int i) const { return i >= 0 && i < fileindex.GetCount() ? (String)actual.file[fileindex[i]] : Null; } bool WorkspaceWork::IsSeparator(int i) const { return i >= 0 && i < fileindex.GetCount() ? actual.file[fileindex[i]].separator : true; } String WorkspaceWork::GetActiveFileName() const { return FileName(filelist.GetCursor()); } String WorkspaceWork::GetActiveFilePath() const { return SourcePath(GetActivePackage(), GetActiveFileName()); } bool WorkspaceWork::IsActiveFile() const { int i = filelist.GetCursor(); return i >= 0 && i < fileindex.GetCount() && fileindex[i] < actual.file.GetCount(); } Package::File& WorkspaceWork::ActiveFile() { return actual.file[fileindex[filelist.GetCursor()]]; } void WorkspaceWork::AddFile(ADDFILE af) { String active = GetActivePackage(); if(active.IsEmpty()) return; FileSel *fs = &OutputFs(); RealizeDirectory(GetLocalDir()); switch(af) { case PACKAGE_FILE: fs = &BasedSourceFs(); fs->BaseDir(GetFileFolder(PackagePathA(active))); break; case ANY_FILE: fs = &AnySourceFs(); break; case OUTPUT_FILE: fs->ActiveDir(GetOutputDir()); break; #ifdef PLATFORM_POSIX case HOME_FILE: fs->ActiveDir(GetHomeDirectory()); break; #endif case LOCAL_FILE: fs->ActiveDir(GetLocalDir()); break; } if(!fs->ExecuteOpen("Add files to package..")) return; int fci = filelist.GetCursor(); int cs = filelist.GetSbPos(); int ci = fci >= 0 && fci < fileindex.GetCount() ? fileindex[fci] : -1; for(int i = 0; i < fs->GetCount(); i++) { Package::File& f = ci >= 0 ? actual.file.Insert(ci++) : actual.file.Add(); f = (*fs)[i]; f.readonly = fs->GetReadOnly(); } SaveLoadPackage(); filelist.SetSbPos(cs); filelist.SetCursor(fci >= 0 ? fci : filelist.GetCount() - 1); FileSelected(); } void WorkspaceWork::AddItem(const String& name, bool separator, bool readonly) { int fci = filelist.GetCursor(); int cs = filelist.GetSbPos(); int ci = fci >= 0 && fci < fileindex.GetCount() ? fileindex[fci] : -1; Package::File& f = ci >= 0 ? actual.file.Insert(ci) : actual.file.Add(); f = name; f.separator = separator; f.readonly = readonly; if(separator) SaveLoadPackageNS(); else SaveLoadPackage(); filelist.SetSbPos(cs); filelist.SetCursor(fci >= 0 ? fci : filelist.GetCount() - 1); FileSelected(); } void WorkspaceWork::AddSeparator() { String active = GetActivePackage(); if(active.IsEmpty()) return; String name; if(!EditText(name, "Insert separator", "Name")) return; AddItem(~name, true, true); } class ImportDlg : public WithImportLayout { typedef ImportDlg CLASSNAME; FrameRight