Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/16/10 17:14:35 (15 years ago)
Author:
gkronber
Message:

Worked on multi-select behavior of list views in deployment server interfaces. #891 (Refactor GUI for plugin management)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DeploymentServer Prototype/HeuristicLab.Services/HeuristicLab.DeploymentService.AdminClient/PluginListView.cs

    r3045 r3068  
    1010
    1111namespace HeuristicLab.DeploymentService.AdminClient {
     12  /// <summary>
     13  /// Wraps a ListView and adds functionality to automatically check and uncheck dependencies of plugins.
     14  /// </summary>
    1215  public partial class PluginListView : UserControl {
    1316    public event ItemCheckedEventHandler ItemChecked;
     
    1821      set {
    1922        plugins = value;
     23        checkedPlugins.Clear();
    2024        UpdateControls();
    2125      }
    2226    }
    2327
     28    private List<IPluginDescription> checkedPlugins = new List<IPluginDescription>();
    2429    public IEnumerable<IPluginDescription> CheckedPlugins {
    2530      get {
    26         return from item in listView.Items.OfType<ListViewItem>()
    27                where item.Checked
    28                select item.Tag as IPluginDescription;
     31        return checkedPlugins;
    2932      }
    3033    }
    31 
    32     private bool suppressItemCheckedEvents = false;
    3334
    3435    public PluginListView() {
     
    3738
    3839    public void CheckPlugin(IPluginDescription plugin) {
    39       var items = FindItemsForPlugin(plugin);
    40       if (items.Count() == 0) throw new ArgumentException();
    41       var item = items.Single();
    42       if (!item.Checked) {
    43         suppressItemCheckedEvents = true;
    44         item.Checked = true;
    45         suppressItemCheckedEvents = false;
    46       }
     40      MarkPluginChecked(plugin);
     41      listView.CheckItems(new IPluginDescription[] { plugin }.Select(x => FindItemsForPlugin(x).Single()));
    4742    }
     43
    4844
    4945    private void UpdateControls() {
    5046      if (plugins != null) {
    5147        listView.Items.Clear();
    52         suppressItemCheckedEvents = true;
     48        listView.SuppressItemCheckedEvents = true;
    5349        foreach (var plugin in plugins) {
    5450          listView.Items.Add(CreateListViewItem(plugin));
    5551        }
    56         suppressItemCheckedEvents = false;
     52        listView.SuppressItemCheckedEvents = false;
    5753      }
    5854    }
     
    6056    private ListViewItem CreateListViewItem(IPluginDescription plugin) {
    6157      var item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString() });
     58      item.Checked = (from p in checkedPlugins where p.Name == plugin.Name where p.Version == plugin.Version select p).Any();
    6259      item.Tag = plugin;
    6360      return item;
     
    6562
    6663    private void listView_ItemChecked(object sender, ItemCheckedEventArgs e) {
    67       if (suppressItemCheckedEvents) return;
     64      List<IPluginDescription> modifiedPlugins = new List<IPluginDescription>();
    6865      if (e.Item.Checked) {
    69         // also check all dependencies
    70         suppressItemCheckedEvents = true;
    71         var dependencies = GetAllDependencies(e.Item.Tag as IPluginDescription);
    72         foreach (var dep in dependencies) {
    73           var item = FindItemsForPlugin(dep).Single();
    74           if (!item.Checked) item.Checked = true;
     66        foreach (ListViewItem item in listView.SelectedItems) {
     67          var plugin = (IPluginDescription)item.Tag;
     68          // also check all dependencies
     69          MarkPluginChecked(plugin);
     70          modifiedPlugins.Add(plugin);
     71          foreach (var dep in GetAllDependencies(plugin)) {
     72            MarkPluginChecked(dep);
     73            modifiedPlugins.Add(dep);
     74          }
    7575        }
    76         suppressItemCheckedEvents = false;
     76        listView.CheckItems(modifiedPlugins.Select(x => FindItemsForPlugin(x).Single()));
     77        OnItemChecked(e);
    7778      } else {
    78         // also uncheck all dependencies
    79         suppressItemCheckedEvents = true;
    80         var dependents = GetAllDependents(e.Item.Tag as IPluginDescription);
    81         foreach (var dep in dependents) {
    82           var item = FindItemsForPlugin(dep).Single();
    83           if (item.Checked) item.Checked = false;
     79        foreach (ListViewItem item in listView.SelectedItems) {
     80          var plugin = (IPluginDescription)item.Tag;
     81          // also uncheck all dependent plugins
     82          MarkPluginUnchecked(plugin);
     83          modifiedPlugins.Add(plugin);
     84          foreach (var dep in GetAllDependents(plugin)) {
     85            MarkPluginUnchecked(dep);
     86            modifiedPlugins.Add(dep);
     87          }
     88
    8489        }
    85         suppressItemCheckedEvents = false;
     90        listView.UncheckItems(modifiedPlugins.Select(x => FindItemsForPlugin(x).Single()));
     91        OnItemChecked(e);
    8692      }
    87       OnItemChecked(e);
     93    }
     94
     95    private void MarkPluginChecked(IPluginDescription plugin) {
     96      var matching = from p in checkedPlugins
     97                     where p.Name == plugin.Name
     98                     where p.Version == plugin.Version
     99                     select p;
     100      if (!matching.Any()) checkedPlugins.Add(plugin);
     101    }
     102
     103    private void MarkPluginUnchecked(IPluginDescription plugin) {
     104      checkedPlugins = (from p in checkedPlugins
     105                        where p.Name != plugin.Name ||
     106                              p.Version != plugin.Version
     107                        select p).ToList();
    88108    }
    89109
     
    116136
    117137    private void OnItemChecked(ItemCheckedEventArgs e) {
    118       if (ItemChecked != null && !suppressItemCheckedEvents) ItemChecked(this, e);
     138      if (ItemChecked != null) ItemChecked(this, e);
    119139    }
    120140  }
Note: See TracChangeset for help on using the changeset viewer.