#include "CtrlLib/CtrlLib.h" using namespace Upp; struct App : TopWindow { Splitter horz; TreeCtrl tree1; TreeCtrl tree2; OptionTree optree; Option x[10]; StatusBar info; Array edit; typedef App CLASSNAME; void OpenDir(int id) { String path = tree1[id]; for(FindFile ff(AppendFileName(path, "*.*")); ff; ff.Next()) { String n = ff.GetName(); if(n != "." && n != "..") tree1.Add(id, ff.IsFolder() ? CtrlImg::error() : CtrlImg::File(), AppendFileName(path, n), n, ff.IsFolder()); } } void CloseDir(int id) { tree1.RemoveChildren(id); } void LoadTree(int parent, const String& path, Progress& pi) { pi.SetText(DeFormat(path)); for(FindFile ff(AppendFileName(path, "*.*")); ff; ff.Next()) { if(pi.StepCanceled()) return; String n = ff.GetName(); if(n != "." && n != "..") { edit.Add(); edit.Top() <<= n; int q; static int x; if(++x & 1) q = tree2.Add(parent, ff.IsFolder() ? CtrlImg::Dir() : CtrlImg::File(), edit.Top(), 150); else q = tree2.Add(parent, ff.IsFolder() ? CtrlImg::Dir() : CtrlImg::File(), n); if(ff.IsFolder()) LoadTree(q, AppendFileName(path, n), pi); } } } void ShowPath() { info = ~tree1; } App() { horz.Add(tree1); horz.Add(tree2); horz.Add(optree); Add(horz.Horz().SizePos()); optree.SetRoot("everything"); for(int i = 0; i < 10; i++) optree.Add(i ? rand() % i : 0, x[i], AsString(i)); tree1.MultiSelect(); tree1.WhenOpen = THISBACK(OpenDir); tree1.WhenClose = THISBACK(CloseDir); #ifdef PLATFORM_WIN32 String dir = String(GetExeFilePath()[0], 1) + ":\\"; #else String dir = "/usr"; #endif tree1.SetRoot(CtrlImg::Dir(), dir); tree2.SetRoot(CtrlImg::Dir(), dir); tree2.BackPaint(); Progress pi; pi.AlignText(ALIGN_LEFT); LoadTree(0, dir, pi); tree2.NoCursor().NoRoot(); tree2.SortDeep(0); Sizeable(); tree1.WhenCursor = THISBACK(ShowPath); tree1.AddFrame(info); } }; GUI_APP_MAIN { App().Run(); }