source: branches/2994-AutoDiffForIntervals/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectView.cs @ 17209

Last change on this file since 17209 was 17209, checked in by gkronber, 5 weeks ago

#2994: merged r17132:17198 from trunk to branch

File size: 12.5 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 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.ComponentModel;
24using System.Linq;
25using System.Windows.Forms;
26using HeuristicLab.Clients.Access;
27using HeuristicLab.Clients.Hive.Views;
28using HeuristicLab.Core.Views;
29using HeuristicLab.MainForm;
30
31namespace HeuristicLab.Clients.Hive.Administrator.Views {
32  [View("ProjectView")]
33  [Content(typeof(Project), IsDefaultView = true)]
34  public partial class ProjectView : ItemView {
35    private readonly object locker = new object();
36
37    public new Project Content {
38      get { return (Project)base.Content; }
39      set { base.Content = value; }
40    }
41
42    public ProjectView() {
43      InitializeComponent();
44
45      AccessClient.Instance.Refreshing += AccessClient_Instance_Refreshing;
46      AccessClient.Instance.Refreshed += AccessClient_Instance_Refreshed;
47    }
48
49    #region Overrides
50    protected override void RegisterContentEvents() {
51      base.RegisterContentEvents();
52      Content.PropertyChanged += Content_PropertyChanged;
53    }
54
55    protected override void DeregisterContentEvents() {
56      Content.PropertyChanged -= Content_PropertyChanged;
57      base.DeregisterContentEvents();
58    }
59
60    protected void RegisterControlEvents() {
61      nameTextBox.TextChanged += nameTextBox_TextChanged;
62      nameTextBox.Validating += nameTextBox_Validating;
63      descriptionTextBox.TextChanged += descriptionTextBox_TextChanged;
64      ownerComboBox.SelectedIndexChanged += ownerComboBox_SelectedIndexChanged;
65      startDateTimePicker.ValueChanged += startDateTimePicker_ValueChanged;
66      endDateTimePicker.ValueChanged += endDateTimePicker_ValueChanged;
67      indefiniteCheckBox.CheckedChanged += indefiniteCheckBox_CheckedChanged;
68    }
69
70    protected void DeregisterControlEvents() {
71      nameTextBox.TextChanged -= nameTextBox_TextChanged;
72      nameTextBox.Validating -= nameTextBox_Validating;
73      descriptionTextBox.TextChanged -= descriptionTextBox_TextChanged;
74      ownerComboBox.SelectedIndexChanged -= ownerComboBox_SelectedIndexChanged;
75      startDateTimePicker.ValueChanged -= startDateTimePicker_ValueChanged;
76      endDateTimePicker.ValueChanged -= endDateTimePicker_ValueChanged;
77      indefiniteCheckBox.CheckedChanged -= indefiniteCheckBox_CheckedChanged;
78    }
79
80    protected override void OnContentChanged() {
81      base.OnContentChanged();
82      DeregisterControlEvents();
83      if (Content == null) {
84        idTextBox.Clear();
85        nameTextBox.Clear();
86        descriptionTextBox.Clear();
87        ownerComboBox.SelectedItem = null;
88        createdTextBox.Clear();
89        startDateTimePicker.Value = DateTime.Now;
90        endDateTimePicker.Value = startDateTimePicker.Value;
91        indefiniteCheckBox.Checked = false;
92      } else {
93        idTextBox.Text = Content.Id.ToString();
94        nameTextBox.Text = Content.Name;
95        descriptionTextBox.Text = Content.Description;
96
97        ownerComboBox.SelectedIndexChanged -= ownerComboBox_SelectedIndexChanged;
98        if (AccessClient.Instance.UsersAndGroups != null) {
99          var users = AccessClient.Instance.UsersAndGroups.OfType<LightweightUser>();
100          if (!Content.ParentProjectId.HasValue) users = users.Where(x => x.Roles.Select(y => y.Name).Contains(HiveRoles.Administrator));
101          var projectOwnerId = Content.OwnerUserId;
102          ownerComboBox.DataSource = users.OrderBy(x => x.UserName).ToList();
103          ownerComboBox.SelectedItem = users.FirstOrDefault(x => x.Id == projectOwnerId);
104        }
105        ownerComboBox.SelectedIndexChanged += ownerComboBox_SelectedIndexChanged;
106
107        createdTextBox.Text = Content.DateCreated.ToString("ddd, dd.MM.yyyy, HH:mm:ss");
108        startDateTimePicker.Value = Content.StartDate;
109
110        indefiniteCheckBox.Checked = !Content.EndDate.HasValue;
111        if (!indefiniteCheckBox.Checked) endDateTimePicker.Value = Content.EndDate.Value;
112        else endDateTimePicker.Value = Content.StartDate;
113        endDateTimePicker.Enabled = !indefiniteCheckBox.Checked;
114      }
115      SetEnabledStateOfControls();
116      RegisterControlEvents();
117    }
118
119    protected override void SetEnabledStateOfControls() {
120      base.SetEnabledStateOfControls();
121      bool enabled = Content != null && !Locked && !ReadOnly;
122      nameTextBox.Enabled = enabled;
123      descriptionTextBox.Enabled = enabled;
124      ownerComboBox.Enabled = enabled;
125      createdTextBox.Enabled = enabled;
126      startDateTimePicker.Enabled = enabled;
127      endDateTimePicker.Enabled = enabled && Content.EndDate.HasValue;
128      indefiniteCheckBox.Enabled = enabled;
129
130      if (Content != null) {
131        //var parentProject = HiveAdminClient.Instance.GetAvailableProjectAncestors(Content.Id).LastOrDefault();
132        var parentProject = HiveAdminClient.Instance.Projects.FirstOrDefault(x => x.Id == Content.ParentProjectId);
133        if ((!IsAdmin() && (parentProject == null || parentProject.EndDate.HasValue))
134           || (IsAdmin() && parentProject != null && parentProject.EndDate.HasValue)) {
135          indefiniteCheckBox.Enabled = false;
136        }
137
138        if (Content.Id != Guid.Empty && !IsAdmin() && !HiveAdminClient.Instance.CheckOwnershipOfParentProject(Content, UserInformation.Instance.User.Id)) {
139          ownerComboBox.Enabled = false;
140          startDateTimePicker.Enabled = false;
141          endDateTimePicker.Enabled = false;
142          indefiniteCheckBox.Enabled = false;
143        }
144      }
145    }
146    #endregion
147
148    #region Event Handlers
149    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
150      if (InvokeRequired) Invoke((Action<object, PropertyChangedEventArgs>)Content_PropertyChanged, sender, e);
151      else OnContentChanged();
152    }
153
154    private void AccessClient_Instance_Refreshing(object sender, EventArgs e) {
155      if (InvokeRequired) Invoke((Action<object, EventArgs>)AccessClient_Instance_Refreshing, sender, e);
156      else {
157        Progress.Show(this, "Refreshing ...", ProgressMode.Indeterminate);
158        SetEnabledStateOfControls();
159      }
160    }
161
162    private void AccessClient_Instance_Refreshed(object sender, EventArgs e) {
163      if (InvokeRequired) Invoke((Action<object, EventArgs>)AccessClient_Instance_Refreshed, sender, e);
164      else {
165        Progress.Hide(this);
166        SetEnabledStateOfControls();
167      }
168    }
169
170    private async void ProjectView_Load(object sender, EventArgs e) {
171      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
172        action: () => UpdateUsers(),
173        finallyCallback: () => {
174          ownerComboBox.SelectedIndexChanged -= ownerComboBox_SelectedIndexChanged;
175          var users = AccessClient.Instance.UsersAndGroups.OfType<LightweightUser>();
176          if (Content != null && !Content.ParentProjectId.HasValue) users = users.Where(x => x.Roles.Select(y => y.Name).Contains(HiveRoles.Administrator));
177          ownerComboBox.DataSource = users.OrderBy(x => x.UserName).ToList();
178          ownerComboBox.SelectedIndexChanged += ownerComboBox_SelectedIndexChanged;
179        });
180    }
181
182    private void ProjectView_Disposed(object sender, EventArgs e) {
183      AccessClient.Instance.Refreshed -= AccessClient_Instance_Refreshed;
184      AccessClient.Instance.Refreshing -= AccessClient_Instance_Refreshing;
185    }
186
187    private void nameTextBox_Validating(object sender, CancelEventArgs e) {
188      if (string.IsNullOrEmpty(nameTextBox.Text)) {
189        MessageBox.Show(
190          "Project must have a name.",
191          "HeuristicLab Hive Administrator",
192          MessageBoxButtons.OK,
193          MessageBoxIcon.Error);
194        e.Cancel = true;
195      }
196    }
197
198    private void nameTextBox_TextChanged(object sender, EventArgs e) {
199      if (Content != null && Content.Name != nameTextBox.Text) {
200        DeregisterContentEvents();
201        Content.Name = nameTextBox.Text;
202        RegisterContentEvents();
203      }
204    }
205
206    private void descriptionTextBox_TextChanged(object sender, EventArgs e) {
207      if (Content != null && Content.Description != descriptionTextBox.Text) {
208        DeregisterContentEvents();
209        Content.Description = descriptionTextBox.Text;
210        RegisterContentEvents();
211      }
212    }
213
214    private void ownerComboBox_SelectedIndexChanged(object sender, EventArgs e) {
215      var selectedItem = (LightweightUser)ownerComboBox.SelectedItem;
216      var selectedOwnerUserId = selectedItem != null ? selectedItem.Id : Guid.Empty;
217      if (Content != null && Content.OwnerUserId != selectedOwnerUserId) {
218        DeregisterContentEvents();
219        Content.OwnerUserId = selectedOwnerUserId;
220        RegisterContentEvents();
221      }
222    }
223
224    private void startDateTimePicker_ValueChanged(object sender, EventArgs e) {
225      if (Content == null) return;
226      startDateTimePicker.ValueChanged -= startDateTimePicker_ValueChanged;
227
228      if (!IsAdmin()) {
229        var parentProject = HiveAdminClient.Instance.GetAvailableProjectAncestors(Content.Id).LastOrDefault();
230        if (parentProject != null) {
231          if (startDateTimePicker.Value < parentProject.StartDate)
232            startDateTimePicker.Value = parentProject.StartDate;
233        } else {
234          startDateTimePicker.Value = Content.StartDate;
235        }
236      }
237
238      if (!Content.EndDate.HasValue || startDateTimePicker.Value > Content.EndDate)
239        endDateTimePicker.Value = startDateTimePicker.Value;
240      if (Content.StartDate != startDateTimePicker.Value) {
241        DeregisterContentEvents();
242        Content.StartDate = startDateTimePicker.Value;
243        RegisterContentEvents();
244      }
245
246      startDateTimePicker.ValueChanged += startDateTimePicker_ValueChanged;
247    }
248
249    private void endDateTimePicker_ValueChanged(object sender, EventArgs e) {
250      if (Content == null) return;
251      endDateTimePicker.ValueChanged -= endDateTimePicker_ValueChanged;
252
253      if (!IsAdmin()) {
254        var parentProject = HiveAdminClient.Instance.GetAvailableProjectAncestors(Content.Id).LastOrDefault();
255        if (parentProject != null) {
256          if (parentProject.EndDate.HasValue && endDateTimePicker.Value > parentProject.EndDate.Value) {
257            endDateTimePicker.Value = parentProject.EndDate.Value;
258          }
259        } else if (Content.EndDate.HasValue) {
260          endDateTimePicker.Value = Content.EndDate.Value;
261        }
262      }
263
264      if (endDateTimePicker.Value < startDateTimePicker.Value)
265        endDateTimePicker.Value = startDateTimePicker.Value;
266      if (Content.EndDate != endDateTimePicker.Value) {
267        DeregisterContentEvents();
268        Content.EndDate = endDateTimePicker.Value;
269        RegisterContentEvents();
270      }
271
272      endDateTimePicker.ValueChanged += endDateTimePicker_ValueChanged;
273    }
274
275    private void indefiniteCheckBox_CheckedChanged(object sender, EventArgs e) {
276      if (Content == null) return;
277
278      var newEndDate = indefiniteCheckBox.Checked ? (DateTime?)null : endDateTimePicker.Value;
279      endDateTimePicker.Enabled = !indefiniteCheckBox.Checked;
280      if (Content.EndDate != newEndDate) {
281        DeregisterContentEvents();
282        Content.EndDate = newEndDate;
283        RegisterContentEvents();
284      }
285    }
286    #endregion
287
288    #region Helpers
289    private void UpdateUsers() {
290      try {
291        AccessClient.Instance.Refresh();
292      } catch (AnonymousUserException) {
293        ShowHiveInformationDialog();
294      }
295    }
296
297    private bool IsAdmin() {
298      return HiveRoles.CheckAdminUserPermissions();
299    }
300
301    private void ShowHiveInformationDialog() {
302      if (InvokeRequired) Invoke((Action)ShowHiveInformationDialog);
303      else {
304        using (HiveInformationDialog dialog = new HiveInformationDialog()) {
305          dialog.ShowDialog(this);
306        }
307      }
308    }
309    #endregion
310  }
311}
Note: See TracBrowser for help on using the repository browser.