private void ListView_MouseDoubleClick(object sender, MouseEventArgs e) { var listView = sender as ListView; ListViewHitTestInfo info = listView.HitTest(e.X, e.Y); ListViewItem item = info.Item; if (item != null) { PluginInterface.Plugin plugin = listView.Tag as PluginInterface.Plugin; Entity entity = item.Tag as Entity; if (entity.IsDirectory) { plugin.Entity.Seek(entity.Path); UpdateListBox(listView, plugin); } } else { listView.SelectedItems.Clear(); //EventAggregator.EventAggregator.Instance.Publish(new LogMessageArgs("No Item is selected.")); } }
private void UpdateListBox(ListView listView, PluginInterface.Plugin plugin, string filter = "") { //Plugin oldPlugin = listView.Tag as Plugin; listView.Tag = plugin; listView.SuspendLayout(); listView.BeginUpdate(); listView.Items.Clear(); // GetItems ones. Each GetItems trigger filesystem get files and directory. Entity parent = plugin.Entity.Entities.FirstOrDefault(x => x != null && x.IsParent); IEnumerable <Entity> dirs = plugin.Entity.Entities.Where(x => x != null && !x.IsParent && x.IsDirectory); List <Entity> files = plugin.Entity.Entities.Where(x => x != null && x.IsFile).ToList(); //files.Sort((a, b) => String.Compare(a.Attributes.Keys.ToArray()[sortIndex], b.Attributes.Keys.ToArray()[sortIndex], StringComparison.Ordinal)); var entities = new List <Entity>(); if (parent != null) //parent i null at root level { entities.Add(parent); } entities.AddRange(dirs); entities.AddRange(files); //no item to show //TODO: Maybe no needed. Ensure always at least one item. if (entities.Count == 0) { return; } List <ListViewItem> listViewItems = new List <ListViewItem>(); foreach (Entity entity in entities.Where(x => x.IsParent || x.Name.StartsWith(filter))) { ListViewItem listViewItem = new ListViewItem().FromEntity(entity); //Add extra column values such as dir, size attr listViewItem.SubItems.AddRange(entity.Values.Values.Cast <string>().ToArray()); listViewItems.Add(listViewItem); } listView.Items.AddRange(listViewItems.ToArray()); // adding listViewItems as array is much faster. Individual adding triggers ListView sorting. //Focus on right ListViewItem ListViewItem focusListViewItem = listView.Items.Cast <ListViewItem>().FirstOrDefault(x => x.Text == plugin.Entity.Previous?.Name); if (focusListViewItem == null) { listView.Items[0].Selected = true; listView.Items[0].Focused = true; } else { // When we navigate back, we want to focus on right ListViewItem listView.Items[plugin.Entity.Previous.Path].Selected = true; listView.Items[plugin.Entity.Previous.Path].Focused = true; listView.EnsureVisible(listView.Items[plugin.Entity.Previous.Path].Index); } listView.EndUpdate(); listView.SuspendLayout(); int countDir = entities.Count(x => x.IsDirectory && !x.IsParent); int countFiles = entities.Count(x => x.IsFile); // global::Helper.EventAggregator.EventAggregator.Instance.Publish(new LogMessageArgs(countFiles + " files and " + countDir + " directories listed.")); }
private void ListView_KeyDown(object sender, KeyEventArgs e) { var listView = sender as ListView; try { if (e.Alt)// Filter textBox { textBoxFilter.BringToFront(); textBoxFilter.Left = splitContainer2.Panel2.Left; textBoxFilter.Top = splitContainer2.Panel2.Top; textBoxFilter.Show(); textBoxFilter.Focus(); e.Handled = true; return; } switch (e.KeyCode) { case Keys.Enter: { PluginInterface.Plugin plugin = listView.Tag as PluginInterface.Plugin; var entity = listView.FocusedItem.Tag as Entity; if (entity.IsDirectory) { plugin.Entity.Seek(entity.Path); if (plugin.Entity == null) { Debugger.Break(); } UpdateListBox(listView, plugin); } break; } case Keys.Back: { PluginInterface.Plugin plugin = listView.Tag as PluginInterface.Plugin; //No need to update if we already are in root folder. if (!plugin.Entity.IsRoot) { plugin.Entity.Seek(plugin.Entity.Parent); UpdateListBox(listView, plugin); } break; } case Keys.F5: { StartCopyOperation(); break; } case Keys.Escape: { logRichTextBox.Clear(); break; } } //e.Handled = true; } catch (Exception ex) { _logger.Error(ex.Message); } }