using System; using System.IO; using Gtk; public class SharpApp : Window { const int COL_PATH = 0; const int COL_DISPLAY_NAME = 1; const int COL_PIXBUF = 2; const int COL_IS_DIRECTORY = 3; DirectoryInfo root = new DirectoryInfo("/"); // Тека для відображення. У початковий момент - коренева Gdk.Pixbuf dirIcon, fileIcon; ListStore store; // Структура даних для відображення ToolButton upButton; public SharpApp() : base("IconView") { SetDefaultSize(650, 400); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; VBox vbox = new VBox(false, 0); Add(vbox); Toolbar toolbar = new Toolbar(); vbox.PackStart(toolbar, false, false, 0); upButton = new ToolButton(Stock.GoUp); upButton.IsImportant = true; upButton.Sensitive = false; toolbar.Insert(upButton, -1); ToolButton homeButton = new ToolButton(Stock.Home); homeButton.IsImportant = true; toolbar.Insert(homeButton, -1); fileIcon = GetIcon(Stock.File); // Піктограма файлу з dirIcon = GetIcon(Stock.Open); // Піктограма теки ScrolledWindow sw = new ScrolledWindow(); sw.ShadowType = ShadowType.EtchedIn; sw.SetPolicy(PolicyType.Automatic, PolicyType.Automatic); vbox.PackStart(sw, true, true, 0); store = CreateStore(); FillStore(); // Обробник події натискання: upButton.Clicked += new EventHandler(OnUpClicked); // кнопки "Вгору" homeButton.Clicked += new EventHandler(OnHomeClicked); // кнопки "Домашня тека" IconView iconView = new IconView(store); // піктограми iconView.SelectionMode = SelectionMode.Multiple; iconView.TextColumn = COL_DISPLAY_NAME; iconView.PixbufColumn = COL_PIXBUF; iconView.ItemActivated += OnItemActivated; sw.Add(iconView); iconView.GrabFocus(); ShowAll(); } Gdk.Pixbuf GetIcon(string name) { return Gtk.IconTheme.Default.LoadIcon(name, 48, (IconLookupFlags) 0); } ListStore CreateStore() { ListStore store = new ListStore(typeof (string), // шлях typeof (string), // назва файлу (теки) typeof (Gdk.Pixbuf),// зображення файлу чи теки typeof (bool)); // чи є текою? store.SetSortColumnId(COL_DISPLAY_NAME, SortType.Ascending); return store; } void FillStore() // Заповнення сховища списку даними щощо усіх файлів вибраної теки { store.Clear(); if (!root.Exists) return; foreach (DirectoryInfo di in root.GetDirectories()) { if (!di.Name.StartsWith(".")) store.AppendValues(di.FullName, di.Name, dirIcon, true); } foreach (FileInfo file in root.GetFiles()) { if (!file.Name.StartsWith(".")) store.AppendValues(file.FullName, file.Name, fileIcon, false); } } void OnHomeClicked(object sender, EventArgs a) // Опрацювання події натискання { root = new DirectoryInfo(Environment.GetFolderPath // кнопки «Домашня тека»: (Environment.SpecialFolder.Personal)); // отримати посилання на домашню теку FillStore(); upButton.Sensitive = true; } void OnItemActivated(object sender, ItemActivatedArgs a) // Опрацювання події { TreeIter iter; // натискання піктограми а store.GetIter(out iter, a.Path); string path = (string) store.GetValue(iter, COL_PATH); bool isDir = (bool) store.GetValue(iter, COL_IS_DIRECTORY); if (!isDir) return; // Якщо піктограми не відповідає теці, припинити виконання... root = new DirectoryInfo(path);// Заміна теки для відображення на вказаний шлях FillStore(); // Заповнення сховища списку даними щодо усіх файлів вибраної теки upButton.Sensitive = true; // Робимо кнопку «Вгору» чутливою } void OnUpClicked(object sender, EventArgs a) // Опрацювання події натискання кнопки «Вгору»: { root = root.Parent; // Перехід у батьківську теку FillStore(); // Заповнення сховища списку даними щодо усіх файлів вибраної теки // Активація кнопки, вибрана тека не є кореневою upButton.Sensitive = (root.FullName == "/" ? false : true); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }