Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2839_HiveProjectManagement/HeuristicLab.Clients.Hive.JobManager/3.3/Views/HiveResourceSelector.cs @ 15914

Last change on this file since 15914 was 15914, checked in by jzenisek, 6 years ago

#2839: fixed several bugs in resource selector

File size: 26.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Drawing;
25using System.Linq;
26using System.Windows.Forms;
27using HeuristicLab.Collections;
28using HeuristicLab.Common.Resources;
29using HeuristicLab.Core;
30using HeuristicLab.Core.Views;
31using HeuristicLab.MainForm;
32using HeuristicLab.MainForm.WindowsForms;
33
34namespace HeuristicLab.Clients.Hive.JobManager.Views {
35  [View("Hive Project Selector View")]
36  [Content(typeof(IItemList<Project>), true)]
37  public partial class HiveProjectSelector : ItemView, IDisposable {
38    private const int greenFlagImageIndex = 0;
39    private const int redFlagImageIndex = 1;
40    private const int slaveImageIndex = 0;
41    private const int slaveGroupImageIndex = 1;
42    public const string additionalSlavesGroupName = "Additional Slaves";
43    public const string additionalSlavesGroupDescription = "Contains additional slaves which are either ungrouped or the parenting slave group is not assigned to the selected project.";
44
45    private const string CURRENT_SELECTION_TAG = " [current selection]";
46    private const string NEW_SELECTION_TAG = " [new selection]";
47    private const string CHANGED_SELECTION_TAG = " [changed selection]";
48    private const string ADDED_SELECTION_TAG = " [added selection]";
49    private const string REMOVED_SELECTION_TAG = " [removed selection]";
50    private const string INCLUDED_TAG = " [included]";
51    private const string ADDED_INCLUDE_TAG = " [added include]";
52    private const string REMOVED_INCLUDE_TAG = " [removed include]";
53
54    private readonly HashSet<TreeNode> mainTreeNodes = new HashSet<TreeNode>();
55    private readonly HashSet<TreeNode> filteredTreeNodes = new HashSet<TreeNode>();
56    private readonly HashSet<TreeNode> nodeStore = new HashSet<TreeNode>();
57
58    private readonly HashSet<Resource> availableResources = new HashSet<Resource>();
59    private readonly HashSet<Resource> assignedResources = new HashSet<Resource>();
60    private readonly HashSet<Resource> includedResources = new HashSet<Resource>();
61    private readonly HashSet<Resource> newAssignedResources = new HashSet<Resource>();
62    private readonly HashSet<Resource> newIncludedResources = new HashSet<Resource>();
63
64    private IEnumerable<Resource> addedResources;
65    private IEnumerable<Resource> removedResources;
66    private IEnumerable<Resource> addedIncludes;
67    private IEnumerable<Resource> removedIncludes;
68
69    private readonly Color addedAssignmentColor = Color.FromArgb(255, 87, 191, 193); // #57bfc1
70    private readonly Color removedAssignmentColor = Color.FromArgb(255, 236, 159, 72); // #ec9f48
71    private readonly Color addedIncludeColor = Color.FromArgb(25, 169, 221, 221); // #a9dddd
72    private readonly Color removedIncludeColor = Color.FromArgb(25, 249, 210, 145); // #f9d291
73    private readonly Color selectedBackColor = Color.DodgerBlue;
74    private readonly Color selectedForeColor = Color.White;
75    private readonly Color controlTextColor = SystemColors.ControlText;
76    private readonly Color grayTextColor = SystemColors.GrayText;
77
78    private string currentSearchString;
79
80    private void resetHiveResourceSelector() {
81      lastSelectedProject = null;
82      selectedProject = null;
83      projectId = null;
84    }
85
86    private Guid jobId;
87    public Guid JobId {
88      get { return jobId; }
89      set {
90        if (jobId == value) return;
91        jobId = value;
92        resetHiveResourceSelector();
93      }
94    }
95
96    private Guid? projectId;
97    public Guid? ProjectId {
98      get { return projectId; }
99      set {
100        if (projectId == value) return;
101        projectId = value;
102      }
103    }
104
105    private Guid? selectedProjectId;
106    public Guid? SelectedProjectId {
107      get { return selectedProjectId; }
108      set {
109        if (selectedProjectId == value) return;
110        selectedProjectId = value;
111      }
112    }
113
114    private IEnumerable<Guid> selectedResourceIds;
115    public IEnumerable<Guid> SelectedResourceIds {
116      get { return selectedResourceIds; }
117      set {
118        if (selectedResourceIds == value) return;
119        selectedResourceIds = value;
120      }
121    }
122
123    public bool ChangedProjectSelection {
124      get {
125        if ((lastSelectedProject == null && selectedProject != null)
126          || (lastSelectedProject != null && selectedProject == null)
127          || (lastSelectedProject != null && selectedProject != null && lastSelectedProject.Id != selectedProject.Id))
128          return true;
129        else return false;
130      }
131    }
132
133    public bool ChangedResources {
134      get { return !assignedResources.SetEquals(newAssignedResources); }
135    }
136
137    private Project lastSelectedProject;
138    private Project selectedProject;
139    public Project SelectedProject {
140      get { return selectedProject; }
141      set {
142        if (selectedProject == value) return;
143        lastSelectedProject = selectedProject;
144        selectedProject = value;
145
146        if (JobId == Guid.Empty || JobId == null) selectedResourceIds = null;
147        UpdateResourceTree();
148        ExtractStatistics();
149        OnSelectedProjectChanged();
150      }
151    }
152
153    public IEnumerable<Resource> AssignedResources {
154      get { return newAssignedResources; }
155      set {
156        if (newAssignedResources == value) return;
157        newAssignedResources.Clear();
158        foreach(var resource in value) {
159          newAssignedResources.Add(resource);
160        }
161      }
162    }
163
164
165    public new IItemList<Project> Content {
166      get { return (IItemList<Project>)base.Content; }
167      set { base.Content = value; }
168    }
169
170    public HiveProjectSelector() {
171      InitializeComponent();
172
173      projectsImageList.Images.Add(VSImageLibrary.FlagGreen);
174      projectsImageList.Images.Add(VSImageLibrary.FlagRed);
175      resourcesImageList.Images.Add(VSImageLibrary.MonitorLarge);
176      resourcesImageList.Images.Add(VSImageLibrary.NetworkCenterLarge);
177    }
178
179    #region Overrides
180    protected override void OnContentChanged() {
181      base.OnContentChanged();
182
183      if (Content != null) {               
184        if (SelectedProjectId.HasValue && SelectedProjectId.Value != Guid.Empty) {
185          SelectedProject = GetSelectedProjectById(SelectedProjectId.Value);
186        } else {
187          SelectedProject = null;
188        }
189        //ExtractStatistics();
190        UpdateProjectTree();
191
192      } else {
193        lastSelectedProject = null;
194        selectedProject = null;
195        selectedProjectId = null;
196        projectsTreeView.Nodes.Clear();
197        resourcesTreeView.Nodes.Clear();
198      }
199    }
200
201    #endregion
202
203    #region Event Handlers
204    private void HiveProjectSelector_Load(object sender, EventArgs e) {
205      projectsTreeView.Nodes.Clear();
206      resourcesTreeView.Nodes.Clear();
207    }
208
209    private void searchTextBox_TextChanged(object sender, EventArgs e) {
210      currentSearchString = searchTextBox.Text.ToLower();
211      //UpdateFilteredTree();
212      UpdateProjectTree();
213    }
214
215    private void projectsTreeView_MouseDoubleClick(object sender, MouseEventArgs e) {
216      OnProjectsTreeViewDoubleClicked();
217    }
218
219    private void projectsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
220      var node = (Project)e.Node.Tag;
221     
222      if (node == null) {
223        projectsTreeView.SelectedNode = null;
224      } else {
225        ResetTreeNodes(projectsTreeView.Nodes);
226        e.Node.BackColor = selectedBackColor;
227        e.Node.ForeColor = selectedForeColor;
228       
229        if(node.Id == projectId) {
230          e.Node.Text += CURRENT_SELECTION_TAG;
231        } else if(projectId == null || projectId == Guid.Empty) {
232          e.Node.Text += NEW_SELECTION_TAG;
233        } else {
234          e.Node.Text += CHANGED_SELECTION_TAG;
235        }
236
237       
238      }
239      SelectedProject = node;
240      //ExtractStatistics();
241    }
242
243    private void resourcesTreeView_MouseDown(object sender, MouseEventArgs e) {
244      var node = resourcesTreeView.GetNodeAt(new Point(e.X, e.Y));
245
246      if (node == null) {
247        resourcesTreeView.SelectedNode = null;
248      }
249
250      ExtractStatistics((Resource)node?.Tag);
251    }
252
253    private void resourcesTreeView_BeforeCheck(object sender, TreeViewCancelEventArgs e) {
254      var checkedResource = (Resource)e.Node.Tag;
255      if (newIncludedResources.Contains(checkedResource) || checkedResource.Id == Guid.Empty) e.Cancel = true;
256    }
257
258    private void resourcesTreeView_AfterCheck(object sender, TreeViewEventArgs e) {
259      var checkedResource = (Resource)e.Node.Tag;
260      if (e.Node.Checked) {
261        newAssignedResources.Add(checkedResource);
262      } else {
263        newAssignedResources.Remove(checkedResource);
264      }
265
266      UpdateNewResourceTree();
267      ExtractStatistics();
268      //ExtractStatistics((Resource)resourcesTreeView.SelectedNode?.Tag);
269      OnAssignedResourcesChanged();
270    }
271
272    private void resourcesTreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) {
273      return;
274    }
275    #endregion
276
277    #region Helpers
278
279    private Project GetSelectedProjectById(Guid projectId) {
280      return Content.Where(x => x.Id == projectId).SingleOrDefault();
281    }
282
283    private void UpdateProjectTree() {
284
285      if (string.IsNullOrEmpty(currentSearchString)) {
286        BuildProjectTree(Content);
287      } else {
288        HashSet<Project> filteredProjects = new HashSet<Project>();
289        foreach(var project in Content) {
290          if(project.Name.ToLower().Contains(currentSearchString.ToLower())) {
291            filteredProjects.Add(project);
292            filteredProjects.UnionWith(Content.Where(p => HiveClient.Instance.ProjectAncestors[project.Id].Contains(p.Id)));
293          }
294        }
295        BuildProjectTree(filteredProjects);
296      }
297    }
298
299    private void BuildProjectTree(IEnumerable<Project> projects) {
300      projectsTreeView.Nodes.Clear();
301      if (!projects.Any()) return;
302
303      // select all top level projects (withouth parent, or without any ancestor within current project collection)
304      var mainProjects = new HashSet<Project>(projects.Where(x => x.ParentProjectId == null));
305      var parentedMainProjects = new HashSet<Project>(projects
306        .Where(x => x.ParentProjectId.HasValue
307        && !projects.Select(y => y.Id).Contains(x.ParentProjectId.Value)
308        && !projects.SelectMany(y => HiveClient.Instance.ProjectAncestors[y.Id]).Contains(x.ParentProjectId.Value)));
309      mainProjects.UnionWith(parentedMainProjects);
310      var subProbjects = new HashSet<Project>(projects.Except(mainProjects));
311      foreach(var p in subProbjects) {
312        p.ParentProjectId = HiveClient.Instance.ProjectAncestors[p.Id].Where(x => projects.Select(y => y.Id).Contains(x)).FirstOrDefault();
313      }
314
315      var stack = new Stack<Project>(mainProjects.OrderByDescending(x => x.Name));
316
317      TreeNode currentNode = null;
318      Project currentProject = null;
319
320      while(stack.Any()) {
321        var newProject = stack.Pop();
322        var newNode = new TreeNode(newProject.Name) { Tag = newProject };
323
324        while (currentNode != null && newProject.ParentProjectId != currentProject.Id) {
325          currentNode = currentNode.Parent;
326          currentProject = currentNode == null ? null : (Project)currentNode.Tag;
327        }
328
329        if (currentNode == null) {
330          projectsTreeView.Nodes.Add(newNode);
331          newNode.ImageIndex = greenFlagImageIndex;
332        } else {
333          currentNode.Nodes.Add(newNode);
334          newNode.ImageIndex = redFlagImageIndex;
335        }
336
337        newNode.SelectedImageIndex = newNode.ImageIndex;
338
339        if (SelectedProject != null && SelectedProject.Id.Equals(newProject.Id)) {
340          newNode.BackColor = selectedBackColor;
341          newNode.ForeColor = selectedForeColor;
342          if(SelectedProject.Id == projectId) {
343            newNode.Text += CURRENT_SELECTION_TAG;
344          } else if (projectId == null || projectId == Guid.Empty) {
345            newNode.Text += NEW_SELECTION_TAG;
346          } else {
347            newNode.Text += CHANGED_SELECTION_TAG;
348          }
349        }
350
351        if (!string.IsNullOrEmpty(currentSearchString) && newProject.Name.ToLower().Contains(currentSearchString.ToLower())) {
352          newNode.BackColor = Color.LightBlue;
353        }
354
355        var childProjects = subProbjects.Where(x => x.ParentProjectId == newProject.Id);
356        if (childProjects.Any()) {
357          foreach (var project in childProjects.OrderByDescending(x => x.Name)) {
358            subProbjects.Remove(project);
359            stack.Push(project);
360          }
361          currentNode = newNode;
362          currentProject = newProject;
363        }
364      }
365
366      projectsTreeView.ExpandAll();
367    }
368
369    private static IEnumerable<Resource> GetAssignedResourcesForProject(Guid projectId) {
370      var assignedProjectResources = HiveServiceLocator.Instance.CallHiveService(s => s.GetAssignedResourcesForProject(projectId));
371      return HiveClient.Instance.Resources.Where(x => assignedProjectResources.Select(y => y.ResourceId).Contains(x.Id));
372    }
373
374    private static IEnumerable<Resource> GetAssignedResourcesForJob(Guid jobId) {
375      var assignedJobResources = HiveServiceLocator.Instance.CallHiveService(s => s.GetAssignedResourcesForJob(jobId));
376      return HiveClient.Instance.Resources.Where(x => assignedJobResources.Select(y => y.ResourceId).Contains(x.Id));
377    }
378
379    private void UpdateResourceTree() {
380      UpdateAvailableResources();
381      UpdateAssignedResources();
382      UpdateIncludedResources();
383      BuildResourceTree(availableResources);
384    }
385
386    private void UpdateNewResourceTree() {
387      UpdateNewAssignedResources();
388      UpdateNewIncludedResources();
389      BuildResourceTree(availableResources);
390    }
391
392    private void UpdateAvailableResources() {
393      availableResources.Clear();
394      if (selectedProject != null) {
395        var assignedProjectResources = GetAssignedResourcesForProject(selectedProject.Id);
396        foreach (var resource in assignedProjectResources) {
397          availableResources.Add(resource);
398          foreach(var descendant in HiveClient.Instance.Resources.Where(x => HiveClient.Instance.ResourceDescendants[resource.Id].Contains(x.Id))) {
399            availableResources.Add(descendant);
400          }
401        }
402      }
403      //ExtractStatistics();
404      //OnAssignedResourcesChanged();
405    }
406
407    private void UpdateAssignedResources() {
408      assignedResources.Clear();
409      newAssignedResources.Clear();
410
411      if (JobId == Guid.Empty || JobId == null) { // new, unchanged jobs get all avaialable resources
412        // update new assigned resources
413        if(selectedResourceIds == null) {
414          foreach (var resource in availableResources
415            .Where(x => !x.ParentResourceId.HasValue
416            || !availableResources.Select(y => y.Id).Contains(x.ParentResourceId.Value))) {
417            newAssignedResources.Add(resource);
418          }
419        } else {
420          foreach(var resource in availableResources.Where(x => selectedResourceIds.Contains(x.Id))) {
421            newAssignedResources.Add(resource);
422          }
423        }
424      } else { // existent, unchanged jobs get all assigned resources
425        // update assigned resources
426        var assignedJobResources = GetAssignedResourcesForJob(JobId);
427        foreach (var resource in assignedJobResources) {
428          assignedResources.Add(resource);
429          if (selectedResourceIds == null) {
430            newAssignedResources.Add(resource);
431          }
432        }
433
434        if(selectedResourceIds != null) {
435          foreach (var resource in availableResources.Where(x => selectedResourceIds.Contains(x.Id))) {
436            newAssignedResources.Add(resource);
437          }
438        }
439      }
440
441      //ExtractStatistics();
442      OnAssignedResourcesChanged();
443    }
444
445    private void UpdateNewAssignedResources() {
446      for(int i = newAssignedResources.Count-1; i>=0; i--) {
447        if(newAssignedResources.Intersect(HiveClient.Instance.GetAvailableParentResources(newAssignedResources.ElementAt(i).Id)).Any()) {
448          newAssignedResources.Remove(newAssignedResources.ElementAt(i));
449        }
450      }
451    }
452
453    private void UpdateIncludedResources() {
454      includedResources.Clear();
455      newIncludedResources.Clear();
456
457      if (JobId != Guid.Empty) {
458        foreach (var item in assignedResources) {
459          foreach (var descendant in HiveClient.Instance.GetAvailableChildResources(item.Id)) {
460            includedResources.Add(descendant);
461          }
462        }
463      }
464
465      foreach (var item in newAssignedResources) {
466        foreach (var descendant in HiveClient.Instance.GetAvailableChildResources(item.Id)) {
467          newIncludedResources.Add(descendant);
468        }
469      }
470    }
471
472    private void UpdateNewIncludedResources() {
473      newIncludedResources.Clear();
474      foreach (var item in newAssignedResources) {
475        foreach (var descendant in HiveClient.Instance.GetAvailableChildResources(item.Id)) {
476          newIncludedResources.Add(descendant);
477        }
478      }
479    }
480
481    private void BuildResourceTree(IEnumerable<Resource> resources) {
482      resourcesTreeView.Nodes.Clear();
483      if (!resources.Any()) return;
484
485      resourcesTreeView.BeforeCheck -= resourcesTreeView_BeforeCheck;
486      resourcesTreeView.AfterCheck -= resourcesTreeView_AfterCheck;
487
488      var mainResources = new HashSet<Resource>(resources.OfType<SlaveGroup>().Where(x => x.ParentResourceId == null));
489      var parentedMainResources = new HashSet<Resource>(resources.OfType<SlaveGroup>()
490        .Where(x => x.ParentResourceId.HasValue && !resources.Select(y => y.Id).Contains(x.ParentResourceId.Value)));
491      mainResources.UnionWith(parentedMainResources);
492      var subResources = new HashSet<Resource>(resources.Except(mainResources));
493
494      var addedAssignments = newAssignedResources.Except(assignedResources);
495      var removedAssignments = assignedResources.Except(newAssignedResources);
496      var addedIncludes = newIncludedResources.Except(includedResources);
497      var removedIncludes = includedResources.Except(newIncludedResources);
498
499      HashSet<TreeNode> expandedNodes = new HashSet<TreeNode>();
500      TreeNode currentNode = null;
501      Resource currentResource = null;
502
503      var stack = new Stack<Resource>(mainResources.OrderByDescending(x => x.Name));
504
505      while (stack.Any()) {
506        var newResource = stack.Pop();
507        var newNode = new TreeNode(newResource.Name) { Tag = newResource };
508
509        // search for parent node of newNode and save in currentNode
510        // necessary since newNodes (stack top items) might be siblings
511        // or grand..grandparents of previous node (currentNode)
512        while (currentNode != null && newResource.ParentResourceId != currentResource.Id) {
513          currentNode = currentNode.Parent;
514          currentResource = currentNode == null ? null : (Resource)currentNode.Tag;
515        }
516
517        if (currentNode == null) {
518          resourcesTreeView.Nodes.Add(newNode);
519        } else {
520          currentNode.Nodes.Add(newNode);
521        }
522
523        if(newAssignedResources.Select(x => x.Id).Contains(newResource.Id)
524          || assignedResources.Select(x => x.Id).Contains(newResource.Id)
525          || newIncludedResources.Select(x => x.Id).Contains(newResource.Id)
526          || includedResources.Select(x => x.Id).Contains(newResource.Id)) {
527          expandedNodes.Add(newNode);
528        }
529
530        if (newAssignedResources.Select(x => x.Id).Contains(newResource.Id)) {
531          newNode.Checked = true;
532        } else if (newIncludedResources.Select(x => x.Id).Contains(newResource.Id)) {
533          newNode.Checked = true;
534          newNode.ForeColor = grayTextColor;
535        }
536
537        if (includedResources.Select(x => x.Id).Contains(newResource.Id) && newIncludedResources.Select(x => x.Id).Contains(newResource.Id)) {
538          newNode.Text += INCLUDED_TAG;
539        } else if (addedIncludes.Select(x => x.Id).Contains(newResource.Id)) {
540          newNode.BackColor = addedIncludeColor;
541          newNode.ForeColor = grayTextColor;
542          newNode.Text += ADDED_INCLUDE_TAG;
543        } else if (removedIncludes.Select(x => x.Id).Contains(newResource.Id)) {
544          newNode.BackColor = removedIncludeColor;
545          newNode.Text += REMOVED_INCLUDE_TAG;
546        }
547
548        if (addedAssignments.Select(x => x.Id).Contains(newResource.Id)) {
549          newNode.BackColor = addedAssignmentColor;
550          newNode.ForeColor = controlTextColor;
551          newNode.Text += ADDED_SELECTION_TAG;
552        } else if (removedAssignments.Select(x => x.Id).Contains(newResource.Id)) {
553          newNode.BackColor = removedAssignmentColor;
554          newNode.ForeColor = controlTextColor;
555          newNode.Text += REMOVED_SELECTION_TAG;
556        }
557
558        if (newResource is Slave) {
559          newNode.ImageIndex = slaveImageIndex;
560        } else {
561          newNode.ImageIndex = slaveGroupImageIndex;
562
563          var childResources = subResources.Where(x => x.ParentResourceId == newResource.Id);
564          if (childResources.Any()) {
565            foreach (var resource in childResources.OrderByDescending(x => x.Name)) {
566              subResources.Remove(resource);
567              stack.Push(resource);
568            }
569            currentNode = newNode;
570            currentResource = newResource;
571          }
572        }
573        newNode.SelectedImageIndex = newNode.ImageIndex;
574      }
575
576      var singleSlaves = subResources.OfType<Slave>();
577      if (singleSlaves.Any()) {
578
579        var additionalNode = new TreeNode(additionalSlavesGroupName) {
580          ForeColor = SystemColors.GrayText,
581          Tag = new SlaveGroup() {
582            Name = additionalSlavesGroupName,
583            Description = additionalSlavesGroupDescription
584          }
585        };
586
587        foreach (var slave in singleSlaves.OrderBy(x => x.Name)) {
588          var slaveNode = new TreeNode(slave.Name) { Tag = slave };
589          additionalNode.Nodes.Add(slaveNode);
590        }
591
592        resourcesTreeView.Nodes.Add(additionalNode);
593      }
594
595     
596      foreach (var node in expandedNodes) {
597        node.Expand();
598        var parent = node.Parent;
599        while(parent != null) {
600          parent.Expand();
601          parent = parent.Parent;
602        }
603      }
604
605      resourcesTreeView.BeforeCheck += resourcesTreeView_BeforeCheck;
606      resourcesTreeView.AfterCheck += resourcesTreeView_AfterCheck;
607      //resourcesTreeView.ExpandAll();
608    }
609
610    private void ExpandSlaveGroupNodes() {
611      foreach (TreeNode n in nodeStore.Where(x => x.Tag is SlaveGroup)) {
612        TreeNode[] children = new TreeNode[n.Nodes.Count];
613        n.Nodes.CopyTo(children, 0);
614        if (children.Any(x => x.Tag is SlaveGroup)) n.Expand();
615      }
616    }
617
618    private void ExtractStatistics(Resource resource = null) {
619      HashSet<Slave> newAssignedSlaves = new HashSet<Slave>(newAssignedResources.OfType<Slave>());
620      foreach (var slaveGroup in newAssignedResources.OfType<SlaveGroup>()) {
621        foreach(var slave in HiveClient.Instance.ResourceDescendants[slaveGroup.Id].OfType<Slave>()) {
622          newAssignedSlaves.Add(slave);
623        }
624      }
625
626      HashSet<Slave> selectedSlaves = null;
627
628      if (resource != null) {
629        var slaveGroup = resource as SlaveGroup;
630        if (slaveGroup != null) {
631          selectedSlaves = new HashSet<Slave>(HiveClient.Instance.ResourceDescendants[slaveGroup.Id].OfType<Slave>());
632          //selectedSlaves.IntersectWith(newAssignedSlaves);
633        } else {
634          selectedSlaves = new HashSet<Slave>(new[] { resource as Slave });
635        }
636      } else {
637        selectedSlaves = newAssignedSlaves;
638      }
639
640      int sumCores = selectedSlaves.Sum(x => x.Cores.GetValueOrDefault());
641      int sumFreeCores = selectedSlaves.Sum(x => x.FreeCores.GetValueOrDefault());
642      double sumMemory = selectedSlaves.Sum(x => x.Memory.GetValueOrDefault()) / 1024.0;
643      double sumFreeMemory = selectedSlaves.Sum(x => x.FreeMemory.GetValueOrDefault()) / 1024.0;
644
645      coresSummaryLabel.Text = $"{sumCores} Total ({sumFreeCores} Free / {sumCores - sumFreeCores} Used)";
646      memorySummaryLabel.Text = $"{sumMemory:0.00} GB Total ({sumFreeMemory:0.00} GB Free / {(sumMemory - sumFreeMemory):0.00} GB Used)";
647    }
648
649    private void StyleTreeNode(TreeNode n, string name) {
650      n.Text = name;
651      n.BackColor = Color.Transparent;
652      n.ForeColor = Color.Black;
653    }
654
655    private void ResetTreeNodes(TreeNodeCollection nodes) {
656      foreach (TreeNode n in nodes) {
657        string name = "";
658        if (n.Tag is Project) name = ((Project)n.Tag).Name;
659        else if (n.Tag is Resource) name = ((Resource)n.Tag).Name;
660        StyleTreeNode(n, name);
661        if (n.Nodes.Count > 0) {
662          ResetTreeNodes(n.Nodes);
663        }
664      }
665    }
666
667    #endregion
668
669    #region Events
670    public event EventHandler SelectedProjectChanged;
671    private void OnSelectedProjectChanged() {
672      SelectedProjectChanged?.Invoke(this, EventArgs.Empty);
673    }
674
675    public event EventHandler AssignedResourcesChanged;
676    private void OnAssignedResourcesChanged() {
677      AssignedResourcesChanged?.Invoke(this, EventArgs.Empty);
678    }
679
680    public event EventHandler ProjectsTreeViewDoubleClicked;
681    private void OnProjectsTreeViewDoubleClicked() {
682      ProjectsTreeViewDoubleClicked?.Invoke(this, EventArgs.Empty);
683    }
684    #endregion
685  }
686}
Note: See TracBrowser for help on using the repository browser.