Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.cs @ 4042

Last change on this file since 4042 was 4042, checked in by kgrading, 14 years ago

#828 added various improvements to the plugin cache manager, the execution engine, the transaction handling on the serverside and the server console

File size: 31.3 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 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.ComponentModel;
25using System.Data;
26using System.Drawing;
27using System.Linq;
28using System.Text;
29using System.Windows.Forms;
30using HeuristicLab.Hive.Contracts.Interfaces;
31using HeuristicLab.Hive.Contracts.BusinessObjects;
32using HeuristicLab.Hive.Contracts;
33using System.Threading;
34using System.ServiceModel;
35using HeuristicLab.Tracing;
36
37namespace HeuristicLab.Hive.Server.ServerConsole {
38
39  /// <summary>
40  /// if form is closed the loginform gets an information
41  /// </summary>
42  /// <param name="cf"></param>
43  /// <param name="error"></param>
44  public delegate void closeForm(bool cf, bool error);
45
46  public delegate void updateListView(JobDataFetcher fetcher, ListView sender, int category);
47
48  public partial class HiveServerManagementConsole : Form {
49
50    public event closeForm closeFormEvent;
51
52    #region private variables
53    private ResponseList<JobDto> jobs = null;
54
55    List<ListViewGroup> jobGroup;
56    private Dictionary<Guid, List<ListViewItem>> clientList = new Dictionary<Guid, List<ListViewItem>>();
57    private List<Changes> changes = new List<Changes>();
58
59    private JobDto currentJob = null;
60    private ClientDto currentClient = null;
61
62    private TreeNode currentGroupNode = null;
63    Guid parentgroup = Guid.Empty;
64    private ToolTip tt = new ToolTip();
65
66    private const string NOGROUP = "No group";
67    private TreeNode hoverNode;
68    private List<ListViewGroup> lvClientGroups;
69
70    private JobDataFetcher jdfFinished = null;
71    private JobDataFetcher jdfOffline = null;
72    private JobDataFetcher jdfCalculating = null;
73   
74     
75    #endregion
76
77    #region Properties
78    private IClientManager ClientManager {
79      get {
80        try {
81          return ServiceLocator.GetClientManager();
82        }
83        catch (FaultException ex) {
84          MessageBox.Show(ex.Message);
85        }
86        return null;
87      }
88    }
89    #endregion
90
91    public HiveServerManagementConsole() {
92      InitializeComponent();
93      Init();
94      AddClients();
95      //AddJobs();
96      StartAutoUpdateTimers();
97      //timerSyncronize.Start();
98    }
99
100    private void StartAutoUpdateTimers() {
101      jdfCalculating.NewDataAvailable += new EventHandler(jdf_NewDataAvailable);
102      jdfOffline.NewDataAvailable += new EventHandler(jdf_NewDataAvailable);
103      jdfFinished.NewDataAvailable += new EventHandler(jdf_NewDataAvailable);
104      jdfFinished.Start();
105      jdfOffline.Start();
106      jdfCalculating.Start();
107    }
108
109    void jdf_NewDataAvailable(object sender, EventArgs e) {
110      JobDataFetcher fetcher = (JobDataFetcher) sender;
111      if (fetcher.PollStates.Contains(State.finished)) {
112        updateJobListView(fetcher, lv_finishedJobs, 0);
113      } else if(fetcher.PollStates.Contains(State.calculating)) {
114        updateJobListView(fetcher, lv_calculatingJobs, 1);
115      } else if (fetcher.PollStates.Contains(State.offline)) {
116        updateJobListView(fetcher, lv_offlineJobs, 2);
117      }
118    }
119
120    private void updateJobListView(JobDataFetcher fetcher, ListView listView, int category) {
121      if (listView.InvokeRequired) {
122        listView.Invoke(new updateListView(updateJobListView), new object[] { fetcher, listView, category });
123      } else {
124        listView.BeginUpdate();
125        listView.Items.Clear();
126        foreach (JobDto job in fetcher.CachedJobs) {
127          ListViewItem lvi = new ListViewItem(job.Id.ToString(), category);
128          lvi.Tag = job;
129          listView.Items.Add(lvi);
130        }
131        listView.EndUpdate();
132      }
133    }
134
135   
136    private void Init() {
137
138      jdfFinished = new JobDataFetcher(new State[] {State.finished}, 50);
139      jdfCalculating = new JobDataFetcher(new State[] {State.calculating}, 50);
140      jdfOffline = new JobDataFetcher(new State[] {State.offline}, 50);
141
142      cmb_finishedJob_count.SelectedItem = "50";
143      cmb_offlineJob_count.SelectedItem = "50";
144      cmb_calculatingJob_count.SelectedItem = "50";
145     
146      calcToolStripAbortItem.Click += (s, e) => {
147        if(lv_calculatingJobs.SelectedItems.Count > 0) {
148          ServiceLocator.GetJobManager().AbortJob(((JobDto) lv_calculatingJobs.SelectedItems[0].Tag).Id);
149        }
150      };
151
152      offlineItemAbortJob.Click += (s, e) => {
153        if (lv_offlineJobs.SelectedItems.Count > 0) {
154          ServiceLocator.GetJobManager().AbortJob(((JobDto)lv_offlineJobs.SelectedItems[0].Tag).Id);
155        }
156      };
157
158      //adding group
159      menuItemAddGroup.Click += (s, e) => {
160        AddGroup addgroup = new AddGroup();
161        parentgroup = Guid.Empty;
162        if ((tvClientControl.SelectedNode != null) && (((ClientGroupDto)tvClientControl.SelectedNode.Tag).Id != Guid.Empty)) {
163          parentgroup = ((ClientGroupDto)tvClientControl.SelectedNode.Tag).Id;
164        }
165        addgroup.addGroupEvent += new AddGroupDelegate(addgroup_addGroupEvent);
166        addgroup.Show();
167      };
168
169      //adding group
170      menuItemDeleteGroup.Click += (s, e) => {
171        IClientManager clientManager = ServiceLocator.GetClientManager();
172        if (tvClientControl.SelectedNode != null) {
173          Response resp = clientManager.DeleteClientGroup(((ClientGroupDto)tvClientControl.SelectedNode.Tag).Id);
174          if (tvClientControl.SelectedNode == currentGroupNode) {
175            currentGroupNode = null;
176          }
177          tvClientControl.Nodes.Remove(tvClientControl.SelectedNode);
178          AddClients();
179        }
180      };
181
182      menuItemOpenCalendar.Click += (s, e) => {
183                                      if (tvClientControl.SelectedNode != null) {
184                                        CgCalendar cal = new CgCalendar(((ClientGroupDto)tvClientControl.SelectedNode.Tag).Id, ((ClientGroupDto)tvClientControl.SelectedNode.Tag).Name);                                       
185                                        cal.Show();
186                                      }
187                                    };
188
189
190      // drag item to treeview
191      lvClientControl.ItemDrag += delegate(object sender, ItemDragEventArgs e) {
192        List<string> itemIDs = new List<string>((sender as ListView).SelectedItems.Count);
193        foreach (ListViewItem item in (sender as ListView).SelectedItems) {
194          itemIDs.Add(item.Name);
195        }
196        (sender as ListView).DoDragDrop(itemIDs.ToArray(), DragDropEffects.Move);
197      };
198
199      // drag enter on treeview
200      tvClientControl.DragEnter += delegate(object sender, DragEventArgs e) {
201        e.Effect = DragDropEffects.Move;
202      };
203
204      // drag over
205      tvClientControl.DragOver += delegate(object sender, DragEventArgs e) {
206        Point mouseLocation = tvClientControl.PointToClient(new Point(e.X, e.Y));
207        TreeNode node = tvClientControl.GetNodeAt(mouseLocation);
208        if (node != null && ((ClientGroupDto)node.Tag).Id != Guid.Empty) {
209          e.Effect = DragDropEffects.Move;
210          if (hoverNode == null) {
211            node.BackColor = Color.LightBlue;
212            node.ForeColor = Color.White;
213            hoverNode = node;
214          } else if (hoverNode != node) {
215            hoverNode.BackColor = Color.White;
216            hoverNode.ForeColor = Color.Black;
217            node.BackColor = Color.LightBlue;
218            node.ForeColor = Color.White;
219            hoverNode = node;
220          }
221        } else {
222          e.Effect = DragDropEffects.None;
223        }
224      };
225
226      // drag drop event
227      tvClientControl.DragDrop += delegate(object sender, DragEventArgs e) {
228        if (e.Data.GetDataPresent(typeof(string[]))) {
229          Point dropLocation = (sender as TreeView).PointToClient(new Point(e.X, e.Y));
230          TreeNode dropNode = (sender as TreeView).GetNodeAt(dropLocation);
231          if (((ClientGroupDto)dropNode.Tag).Id != Guid.Empty) {
232            Dictionary<ClientDto, Guid> clients = new Dictionary<ClientDto, Guid>();
233            foreach (ListViewItem lvi in lvClientControl.SelectedItems) {
234              Guid groupId = Guid.Empty;
235              foreach (ListViewGroup lvg in lvClientGroups) {
236                if (lvi.Group.Header == ((ClientGroupDto)lvg.Tag).Name) {
237                  groupId = ((ClientGroupDto)lvg.Tag).Id;
238                }
239              }
240              clients.Add((ClientDto)lvi.Tag, groupId);
241            }
242            ChangeGroup(clients, ((ClientGroupDto)dropNode.Tag).Id);
243          }
244          tvClientControl_DragLeave(null, EventArgs.Empty);
245          AddClients();
246        }
247      };
248    }
249
250    /// <summary>
251    /// Change client to other group
252    /// </summary>
253    /// <param name="clients">list of clients</param>
254    /// <param name="clientgroupID">group of clients</param>
255    private void ChangeGroup(Dictionary<ClientDto, Guid> clients, Guid clientgroupID) {
256      IClientManager clientManager = ServiceLocator.GetClientManager();
257      foreach (KeyValuePair<ClientDto, Guid> client in clients) {
258        if (client.Key.Id != Guid.Empty) {
259          Response resp = clientManager.DeleteResourceFromGroup(client.Value, client.Key.Id);
260        }
261        clientManager.AddResourceToGroup(clientgroupID, client.Key);
262      }
263    }
264
265    #region Backgroundworker
266    /// <summary>
267    /// event on Ticker
268    /// </summary>
269    /// <param name="obj"></param>
270    /// <param name="e"></param>
271    private void TickSync(object obj, EventArgs e) {
272      if (!updaterWoker.IsBusy) {
273        updaterWoker.RunWorkerAsync();
274      }
275    }
276
277    private void updaterWoker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
278      RefreshForm();
279    }
280
281    private void updaterWoker_DoWork(object sender, DoWorkEventArgs e) {
282
283      changes.Clear();
284
285      ResponseList<JobDto> jobsOld = jobs;
286      try {
287        IJobManager jobManager =
288                ServiceLocator.GetJobManager();
289
290        jobs = jobManager.GetAllJobs();
291
292        IDictionary<int, JobDto> jobsOldHelp;
293        CloneList(jobsOld, out jobsOldHelp);
294
295        if(jobsOld != null && jobsOld.List != null && jobsOldHelp != null)
296          GetDelta(jobsOld.List, jobsOldHelp);
297
298      }
299      catch (FaultException fe) {
300        MessageBox.Show(fe.Message);
301      }
302
303    }
304
305    #endregion
306
307
308    private void AddClients() {
309      lvClientGroups = new List<ListViewGroup>();
310      clientList.Clear();
311      tvClientControl.Nodes.Clear();
312      try {
313        ResponseList<ClientGroupDto> clientGroups = ClientManager.GetAllClientGroups();
314
315        if (clientGroups != null && clientGroups.List != null) {
316          foreach (ClientGroupDto cg in clientGroups.List) {
317            AddClientOrGroup(cg, null);
318          }
319
320          if (currentGroupNode != null) {
321            lvClientControl.Items.Clear();
322            lvClientControl.Groups.Clear();
323            AddGroupsToListView(currentGroupNode);
324          }
325          tvClientControl.ExpandAll();
326        }
327
328      }
329      catch (FaultException fe) {
330        MessageBox.Show(fe.Message);
331      }
332    }
333
334    private void AddClientOrGroup(ClientGroupDto clientGroup, TreeNode currentNode) {
335      currentNode = CreateTreeNode(clientGroup, currentNode);
336      List<ListViewItem> clientGroupList = new List<ListViewItem>();
337      ListViewGroup lvg;
338      if (string.IsNullOrEmpty(clientGroup.Name)) {
339        lvg = new ListViewGroup(NOGROUP, HorizontalAlignment.Left);
340      } else {
341        lvg = new ListViewGroup(clientGroup.Name, HorizontalAlignment.Left);
342      }
343      lvClientControl.Groups.Add(lvg);
344      lvg.Tag = clientGroup;
345      lvClientGroups.Add(lvg);
346      foreach (ResourceDto resource in clientGroup.Resources) {
347        if (resource is ClientDto) {
348          int percentageUsage = CapacityRam(((ClientDto)resource).NrOfCores, ((ClientDto)resource).NrOfFreeCores);
349          int usage = 3;
350          if ((((ClientDto)resource).State != State.offline) &&
351            (((ClientDto)resource).State != State.nullState)) {
352            if ((percentageUsage >= 0) && (percentageUsage <= 25)) {
353              usage = 0;
354            } else if ((percentageUsage > 25) && (percentageUsage <= 75)) {
355              usage = 1;
356            } else if ((percentageUsage > 75) && (percentageUsage <= 100)) {
357              usage = 2;
358            }
359          }
360          ListViewItem lvi = new ListViewItem(resource.Name, usage, lvg);
361          lvi.Tag = resource as ClientDto;
362          clientGroupList.Add(lvi);
363        } else if (resource is ClientGroupDto) {
364          AddClientOrGroup(resource as ClientGroupDto, currentNode);
365        }
366      }
367      clientList.Add(clientGroup.Id, clientGroupList);
368    }
369
370    private TreeNode CreateTreeNode(ClientGroupDto clientGroup, TreeNode currentNode) {
371      TreeNode tn;
372      if (string.IsNullOrEmpty(clientGroup.Name)) {
373        tn = new TreeNode(NOGROUP);
374      } else {
375        tn = new TreeNode(clientGroup.Name);
376      }
377      tn.Tag = clientGroup;
378      if (currentNode == null) {
379        tvClientControl.Nodes.Add(tn);
380      } else {
381        currentNode.Nodes.Add(tn);
382      }
383      return tn;
384    }
385
386    private void AddGroupsToListView(TreeNode node) {
387      if (node != null) {
388        ListViewGroup lvg = new ListViewGroup(node.Text, HorizontalAlignment.Left);
389        lvClientControl.Groups.Add(lvg);
390        lvg.Tag = node.Tag;
391        foreach (ListViewItem item in clientList[((ClientGroupDto)node.Tag).Id]) {
392          item.Group = lvg;
393          lvClientControl.Items.Add(item);
394        }
395
396        if (node.Nodes != null) {
397          foreach (TreeNode curNode in node.Nodes) {
398            AddGroupsToListView(curNode);
399          }
400        }
401      }
402    }
403
404    /// <summary>
405    /// if one job is clicked, the details for the clicked job are shown
406    /// in the second panel
407    /// </summary>
408    private void JobClicked() {
409      plJobDetails.Visible = true;
410      lvJobDetails.Items.Clear();
411
412      ResponseObject<JobDto> response = ServiceLocator.GetJobManager().GetJobByIdWithDetails(currentJob.Id);
413
414      if(response.Success == false || response.Obj == null)
415        return;
416
417      JobDto job = response.Obj;
418
419      //lvSnapshots.Enabled = true;
420
421      if (job.State == State.offline) {
422        pbJobControl.Image = ilLargeImgJob.Images[2];
423      } else if (job.State == State.calculating) {
424        pbJobControl.Image = ilLargeImgJob.Images[1];
425      } else if (job.State == State.finished) {
426        pbJobControl.Image = ilLargeImgJob.Images[0];
427      }
428
429      lblJobName.Text = job.Id.ToString();
430      if (job.Percentage != null) {
431        progressJob.Value = (int) (currentJob.Percentage*100);
432        lblProgress.Text = (int) (currentJob.Percentage*100) + "% calculated";
433      }
434
435      ListViewItem lvi = new ListViewItem();
436      lvi.Text = "User:";
437      lvi.SubItems.Add(job.UserId.ToString());
438      lvJobDetails.Items.Add(lvi);
439
440      lvi = null;
441      lvi = new ListViewItem();
442      lvi.Text = "created at:";
443      lvi.SubItems.Add(job.DateCreated.ToString());
444      lvJobDetails.Items.Add(lvi);
445
446      if (job.ParentJob != null) {
447        lvi = null;
448        lvi = new ListViewItem();
449        lvi.Text = "Parent job:";
450        lvi.SubItems.Add(job.ParentJob.ToString());
451        lvJobDetails.Items.Add(lvi);
452      }
453
454      lvi = null;
455      lvi = new ListViewItem();
456      lvi.Text = "Priority:";
457      lvi.SubItems.Add(job.Priority.ToString());
458      lvJobDetails.Items.Add(lvi);
459
460      if (job.Project != null) {
461        lvi = null;
462        lvi = new ListViewItem();
463        lvi.Text = "Project:";
464        lvi.SubItems.Add(job.Project.Name.ToString());
465        lvJobDetails.Items.Add(lvi);
466      }
467
468      if (job.Client != null) {
469        lvi = null;
470        lvi = new ListViewItem();
471        lvi.Text = "Calculation begin:";
472        lvi.SubItems.Add(job.DateCalculated.ToString());
473        lvJobDetails.Items.Add(lvi);
474
475
476        lvi = null;
477        lvi = new ListViewItem();
478        lvi.Text = "Client calculated:";
479        lvi.SubItems.Add(job.Client.Name.ToString());
480        lvJobDetails.Items.Add(lvi);
481
482        if (job.State == State.finished) {
483          lvi = null;
484            lvi = new ListViewItem();
485            lvi.Text = "Calculation ended:";
486            lvi.SubItems.Add(job.DateFinished.ToString());
487            lvJobDetails.Items.Add(lvi);
488          }
489        }
490      }
491
492    /// <summary>
493    /// if one client is clicked, the details for the clicked client are shown
494    /// in the second panel
495    /// </summary>
496    private void ClientClicked() {
497      plClientDetails.Visible = true;
498
499      if (currentClient != null) {
500        int percentageUsage = CapacityRam(currentClient.NrOfCores, currentClient.NrOfFreeCores);
501        int usage = 3;
502        if ((currentClient.State != State.offline) && (currentClient.State != State.nullState)) {
503          if ((percentageUsage >= 0) && (percentageUsage <= 25)) {
504            usage = 0;
505          } else if ((percentageUsage > 25) && (percentageUsage <= 75)) {
506            usage = 1;
507          } else if ((percentageUsage > 75) && (percentageUsage <= 100)) {
508            usage = 2;
509          }
510        }
511        pbClientControl.Image = ilLargeImgClient.Images[usage];
512        lblClientName.Text = currentClient.Name;
513        lblLogin.Text = currentClient.Login.ToString();
514        lblState.Text = currentClient.State.ToString();
515      }
516    }
517
518    private void RefreshForm() {
519      foreach (Changes change in changes) {
520        if (change.Types == Type.Job) {
521          RefreshJob(change);
522        }
523      }
524    }
525
526    private void RefreshJob(Changes change) {
527      /*if (change.ChangeType == Change.Update) {
528        for (int i = 0; i < lvJobControl.Items.Count; i++) {
529          if (lvJobControl.Items[i].Text == change.ID.ToString()) {
530            foreach (JobDto job in jobs.List) {
531              if (job.Id == change.ID) {
532                lvJobControl.Items[i].Tag = job;
533                if (currentJob != null) {
534                  if (currentJob.Id == change.ID) {
535                    currentJob = job;
536                    JobClicked();
537                  }
538                }
539                break;
540              }
541            }
542            State state = jobs.List[change.Position].State;
543            if (state == State.finished) {
544              lvJobControl.Items[i].Group = jobGroup[1];
545              lvJobControl.Items[i].ImageIndex = 0;
546            } else if (state == State.calculating) {
547              lvJobControl.Items[i].Group = jobGroup[0];
548              lvJobControl.Items[i].ImageIndex = 1;
549            } else if (state == State.offline || state == State.pending) {
550              lvJobControl.Items[i].Group = jobGroup[2];
551              lvJobControl.Items[i].ImageIndex = 2;
552            }
553            lvJobControl.Refresh();
554          }
555        }
556      } else if (change.ChangeType == Change.Create) {
557
558        ListViewItem lvi = new ListViewItem(
559          change.ID.ToString(), 2, jobGroup[2]);
560        foreach (JobDto job in jobs.List) {
561          if (job.Id == change.ID) {
562            lvi.Tag = job;
563            break;
564          }
565        }
566        lvJobControl.Items.Add(lvi);
567
568      } else if (change.ChangeType == Change.Delete) {
569        for (int i = 0; i < lvJobControl.Items.Count; i++) {
570          if (change.ID.ToString() == lvJobControl.Items[i].Text.ToString()) {
571            lvJobControl.Items[i].Remove();
572            break;
573          }
574        }
575      }                    */
576    }
577
578
579    #region Eventhandlers
580    /// <summary>
581    /// Send event to Login-GUI when closing
582    /// </summary>
583    /// <param name="sender"></param>
584    /// <param name="e"></param>
585    private void Close_Click(object sender, EventArgs e) {
586      if (closeFormEvent != null) {
587        closeFormEvent(true, false);
588      }
589      this.Close();
590    }
591
592    /// <summary>
593    /// Send evnt to Login-GUI when closing
594    /// </summary>
595    /// <param name="sender"></param>
596    /// <param name="e"></param>
597    private void HiveServerConsoleInformation_FormClosing(object sender, FormClosingEventArgs e) {
598      if (closeFormEvent != null) {
599        closeFormEvent(true, false);
600      }
601    }
602
603    private void AddJob_Click(object sender, EventArgs e) {
604      AddJobForm newForm = new AddJobForm();
605      newForm.Show();
606      newForm.addJobEvent += new addDelegate(updaterWoker.RunWorkerAsync);
607    }
608
609    private void OnLVJobControlClicked(object sender, EventArgs e) {
610      JobListView jlv = (JobListView) sender;
611      currentJob = (JobDto)jlv.SelectedItems[0].Tag;
612      JobClicked();
613    }
614
615    private void lvJobControl_MouseMove(object sender, MouseEventArgs e) {
616      JobListView jlv = (JobListView) sender;
617      if ((jlv.GetItemAt(e.X, e.Y) != null) &&
618        (jlv.GetItemAt(e.X, e.Y).ToolTipText != null)) {
619        tt.SetToolTip(jlv, jlv.GetItemAt(e.X, e.Y).ToolTipText);
620      }
621    }
622
623    private void lvJobControl_MouseUp(object sender, MouseEventArgs e) {
624      // If the right mouse button was clicked and released,
625      // display the shortcut menu assigned to the ListView.
626      JobListView jlv = (JobListView)sender;
627      jlv.ContextMenuStrip.Items.Clear();
628      ListViewHitTestInfo hitTestInfo = jlv.HitTest(e.Location);
629      if (e.Button == MouseButtons.Right && hitTestInfo.Item != null && jlv.SelectedItems.Count == 1) {
630        JobDto selectedJob = (JobDto)jlv.SelectedItems[0].Tag;
631
632        if (selectedJob != null && selectedJob.State == State.calculating) {
633          jlv.ContextMenuStrip.Items.Add(offlineItemAbortJob);
634          jlv.ContextMenuStrip.Items.Add(menuItemGetSnapshot);
635        }
636      }
637      jlv.ContextMenuStrip.Show(new Point(e.X, e.Y));
638    }
639
640    private void tvClientControl_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
641      lvClientControl.Items.Clear();
642      lvClientControl.Groups.Clear();
643      currentGroupNode = e.Node;
644      AddGroupsToListView(e.Node);
645    }
646
647    private void groupToolStripMenuItem_Click(object sender, EventArgs e) {
648      AddGroup addgroup = new AddGroup();
649      parentgroup = Guid.Empty;
650      if ((tvClientControl.SelectedNode != null) && (((ClientGroupDto)tvClientControl.SelectedNode.Tag).Id != Guid.Empty)) {
651        parentgroup = ((ClientGroupDto)tvClientControl.SelectedNode.Tag).Id;
652      }
653      addgroup.addGroupEvent += new AddGroupDelegate(addgroup_addGroupEvent);
654      addgroup.Show();
655    }
656
657    private void projectToolStripMenuItem_Click(object sender, EventArgs e) {
658      AddProject addproject = new AddProject();
659      addproject.AddProjectEvent += new AddProjectDelegate(addproject_AddProjectEvent);
660      addproject.Show();
661    }
662
663    private void OnLVClientClicked(object sender, EventArgs e) {
664      currentClient = (ClientDto)lvClientControl.SelectedItems[0].Tag;
665      ClientClicked();
666    }
667
668    private void tvClientControl_MouseUp(object sender, MouseEventArgs e) {
669      // If the right mouse button was clicked and released,
670      // display the shortcut menu assigned to the ListView.
671      contextMenuGroup.Items.Clear();
672      TreeViewHitTestInfo hitTestInfo = tvClientControl.HitTest(e.Location);
673      tvClientControl.SelectedNode = hitTestInfo.Node;
674      if (e.Button != MouseButtons.Right) return;
675      if (hitTestInfo.Node != null) {
676        ResourceDto selectedGroup = (ResourceDto)tvClientControl.SelectedNode.Tag;
677
678        if (selectedGroup != null) {
679          contextMenuGroup.Items.Add(menuItemAddGroup);
680          contextMenuGroup.Items.Add(menuItemDeleteGroup);
681          contextMenuGroup.Items.Add(menuItemOpenCalendar);
682        }
683      } else {
684        contextMenuGroup.Items.Add(menuItemAddGroup);
685      }
686      tvClientControl.ContextMenuStrip.Show(tvClientControl, new Point(e.X, e.Y));
687    }
688
689    private void addproject_AddProjectEvent(string name) {
690      IJobManager jobManager = ServiceLocator.GetJobManager();
691
692      ProjectDto pg = new ProjectDto() { Name = name };
693      jobManager.CreateProject(pg);
694
695    }
696
697    private void addgroup_addGroupEvent(string name) {
698      IClientManager clientManager = ServiceLocator.GetClientManager();
699
700      if (parentgroup != Guid.Empty) {
701        ClientGroupDto cg = new ClientGroupDto() { Name = name };
702        ResponseObject<ClientGroupDto> respcg = clientManager.AddClientGroup(cg);
703        Response res = clientManager.AddResourceToGroup(parentgroup, respcg.Obj);
704        if (res != null && !res.Success) {
705          MessageBox.Show(res.StatusMessage, "Error adding Group", MessageBoxButtons.OK, MessageBoxIcon.Error);
706        }
707      } else {
708        ClientGroupDto cg = new ClientGroupDto() { Name = name };
709        clientManager.AddClientGroup(cg);
710      }
711      AddClients();
712    }
713
714
715    private void Refresh_Click(object sender, EventArgs e) {
716      Form overlayingForm = new Form();
717
718      overlayingForm.Show();
719      overlayingForm.FormBorderStyle = FormBorderStyle.None;
720      overlayingForm.BackColor = Color.Gray;
721      overlayingForm.Opacity = 0.4;
722      overlayingForm.Size = this.Size;
723      overlayingForm.Location = this.Location;
724
725      AddClients();
726
727      overlayingForm.Close();
728    }
729
730    private void largeIconsToolStripMenuItem_Click(object sender, EventArgs e) {
731      lvClientControl.View = View.LargeIcon;
732      //lvJobControl.View = View.LargeIcon;
733      largeIconsToolStripMenuItem.CheckState = CheckState.Checked;
734      smallIconsToolStripMenuItem.CheckState = CheckState.Unchecked;
735      listToolStripMenuItem.CheckState = CheckState.Unchecked;
736    }
737
738    private void smallIconsToolStripMenuItem_Click(object sender, EventArgs e) {
739      lvClientControl.View = View.SmallIcon;
740      //lvJobControl.View = View.SmallIcon;
741      largeIconsToolStripMenuItem.CheckState = CheckState.Unchecked;
742      smallIconsToolStripMenuItem.CheckState = CheckState.Checked;
743      listToolStripMenuItem.CheckState = CheckState.Unchecked;
744    }
745
746    private void listToolStripMenuItem_Click(object sender, EventArgs e) {
747      lvClientControl.View = View.List;
748      //lvJobControl.View = View.List;
749      largeIconsToolStripMenuItem.CheckState = CheckState.Unchecked;
750      smallIconsToolStripMenuItem.CheckState = CheckState.Unchecked;
751      listToolStripMenuItem.CheckState = CheckState.Checked;
752    }
753
754    private void tvClientControl_DragLeave(object sender, EventArgs e) {
755      foreach (TreeNode node in tvClientControl.Nodes) {
756        node.BackColor = Color.White;
757        node.ForeColor = Color.Black;
758      }
759    }
760    #endregion
761
762    #region Helper methods
763
764    private void CloneList(ResponseList<JobDto> oldList, out IDictionary<int, JobDto> newList) {
765      newList = new Dictionary<int, JobDto>();
766      if (oldList != null && oldList.List != null) {
767        for (int i = 0; i < oldList.List.Count; i++) {
768          newList.Add(i, oldList.List[i]);
769        }
770      }
771    }
772
773    private bool IsEqual(ClientDto ci1, ClientDto ci2) {
774      if (ci1 == null && ci2 == null) {
775        return true;
776      }
777      if (ci2 == null) {
778        return false;
779      }
780      if (ci1.Id.Equals(ci2.Id)) {
781        return true;
782      } else return false;
783    }
784
785    private int CapacityRam(int noCores, int freeCores) {   
786      if (noCores > 0) {
787        int capacity = ((noCores - freeCores) / noCores) * 100;
788        return capacity;
789      }
790      return 100;
791    }
792
793    private void GetDelta(IList<JobDto> oldJobs, IDictionary<int, JobDto> helpJobs) {
794      bool found = false;
795      for (int i = 0; i < jobs.List.Count; i++) {
796        JobDto job = jobs.List[i];
797        for (int j = 0; j < oldJobs.Count; j++) {
798
799          JobDto jobold = oldJobs[j];
800
801          if (job.Id.Equals(jobold.Id)) {
802
803            found = true;
804            bool change = false;
805            if (job.State != jobold.State) {
806              change = true;
807            }
808            if (job.State != State.offline) {
809              if ((!IsEqual(job.Client, jobold.Client)) || (job.State != jobold.State)
810                   || (job.Percentage != jobold.Percentage)) {
811                change = true;
812              }
813            } else if (job.DateCalculated != jobold.DateCalculated) {
814              change = true;
815            }
816            if (change) {
817              changes.Add(new Changes { Types = Type.Job, ID = job.Id, ChangeType = Change.Update, Position = i });
818            }
819
820            int removeAt = -1;
821            foreach (KeyValuePair<int, JobDto> kvp in helpJobs) {
822              if (job.Id.Equals(kvp.Value.Id)) {
823                removeAt = kvp.Key;
824                break;
825              }
826            }
827            if (removeAt >= 0) {
828              helpJobs.Remove(removeAt);
829            }
830            break;
831          }
832
833        }
834        if (found == false) {
835          changes.Add(new Changes { Types = Type.Job, ID = job.Id, ChangeType = Change.Create });
836        }
837        found = false;
838      }
839      foreach (KeyValuePair<int, JobDto> kvp in helpJobs) {
840        changes.Add(new Changes { Types = Type.Job, ID = kvp.Value.Id, ChangeType = Change.Delete, Position = kvp.Key });
841      }
842    }
843
844    #endregion
845
846    private void btn_prev_Click(object sender, EventArgs e) {
847      if (sender == btn_finishedJob_prev)
848        jdfFinished.Backward();
849      else if (sender == btn_calculatingJobs_prev)
850        jdfCalculating.Backward();
851      else if (sender == btn_offlinejob_prev) {
852        jdfOffline.Backward();
853      }
854    }
855
856    private void btn_next_Click(object sender, EventArgs e) {
857      if (sender == btn_finishedJob_next)
858        jdfFinished.Forward();
859      else if (sender == btn_calculatingJobs_next)
860        jdfCalculating.Forward();
861      else if (sender == btn_offlineJob_next) {
862        jdfOffline.Forward();
863      }
864    }
865
866    private void cmb_count_SelectedIndexChanged(object sender, EventArgs e) {
867      ComboBox box = (ComboBox) sender;
868      if (box.SelectedItem != null) {
869        int val;
870        if (Int32.TryParse(box.SelectedItem.ToString(), out val)) {
871          if (box == cmb_offlineJob_count) {
872            jdfOffline.NrOfEntriesOnPage = val;
873          }
874          else if (box == cmb_finishedJob_count) {
875            jdfFinished.NrOfEntriesOnPage = val;
876          }
877          else if (box == cmb_calculatingJob_count) {
878            jdfCalculating.NrOfEntriesOnPage = val;
879          }
880        }
881      }
882    }
883
884    private void lv_Jobs_SelectedIndexChanged(object sender, EventArgs e) {
885      ListView lv = (ListView) sender;
886      if(lv.SelectedItems.Count > 0) {
887        foreach (ListViewItem lvi in lv.SelectedItems) {
888          currentJob = (JobDto) lvi.Tag;
889          JobClicked();         
890        }
891      }
892    }
893  }
894}
Note: See TracBrowser for help on using the repository browser.