- Timestamp:
- 08/30/18 11:32:56 (6 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
-
trunk/HeuristicLab.Clients.Hive.Administrator
- Property svn:mergeinfo changed
-
trunk/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ProjectsView.cs
r15760 r16117 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 7Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 40 40 private const int greenFlagImageIndex = 0; 41 41 private const int redFlagImageIndex = 1; 42 43 private readonly Color changedColor = Color.FromArgb(255, 87, 191, 193); // #57bfc1 44 private readonly Color selectedColor = Color.FromArgb(255, 240, 194, 59); // #f0c23b 42 private const string SELECTED_TAG = ""; // " [selected]"; 43 private const string NOT_STORED_TAG = "*"; // " [not stored]"; 44 private const string CHANGES_NOT_STORED_TAG = "*"; // " [changes not stored]"; 45 46 private readonly Color selectedBackColor = Color.DodgerBlue; 47 private readonly Color selectedForeColor = Color.White; 48 private readonly Color grayTextColor = SystemColors.GrayText; 49 45 50 private Project selectedProject = null; 51 public Project SelectedProject { 52 get { return selectedProject; } 53 set { if (selectedProject != value) ChangeSelectedProject(value); } 54 } 46 55 47 56 private readonly object locker = new object(); … … 92 101 projectPermissionsView.Content = null; 93 102 projectResourcesView.Content = null; 103 projectJobsView.Content = null; 104 selectedProject = null; 94 105 } else { 95 var top = BuildProjectTree(Content); 96 projectView.Content = top; 97 projectPermissionsView.Content = top; 98 projectResourcesView.Content = top; 99 100 if(top != null && top.Id == Guid.Empty) { 101 projectPermissionsView.Locked = true; 102 projectResourcesView.Locked = true; 103 } 106 BuildProjectTree(Content); 104 107 } 105 108 } … … 107 110 protected override void SetEnabledStateOfControls() { 108 111 base.SetEnabledStateOfControls(); 109 bool enabled = Content != null && !ReadOnly; 110 refreshButton.Enabled = enabled; 111 addButton.Enabled = enabled; 112 removeButton.Enabled = enabled; 113 saveProjectButton.Enabled = enabled; 114 projectView.Enabled = enabled; 115 projectPermissionsView.Enabled = enabled; 116 projectResourcesView.Enabled = enabled; 112 bool selectedProjectExists = selectedProject != null && selectedProject.Id != Guid.Empty && Content.Contains(selectedProject); 113 bool projectIsNew = selectedProject != null && selectedProject.Id == Guid.Empty; 114 bool locked = Content == null || selectedProject == null || Locked || ReadOnly; 115 bool parentOwner = HiveAdminClient.Instance.CheckOwnershipOfParentProject(selectedProject, UserInformation.Instance.User.Id); 116 bool saveLocked = locked || (!IsAdmin() && selectedProject.OwnerUserId != UserInformation.Instance.User.Id && !parentOwner); 117 bool addLocked = saveLocked || projectIsNew || selectedProject.Id == Guid.Empty; 118 bool deleteLocked = locked || (!IsAdmin() && !parentOwner) || Content.Where(x => x.ParentProjectId == selectedProject.Id).Any(); 119 120 var now = DateTime.Now; 121 if (!addLocked && (now < selectedProject.StartDate || now > selectedProject.EndDate)) addLocked = true; 122 123 addButton.Enabled = !addLocked; 124 removeButton.Enabled = !deleteLocked; 125 saveProjectButton.Enabled = !saveLocked; 126 projectView.Enabled = !locked; 127 projectPermissionsView.Enabled = !locked; 128 projectResourcesView.Enabled = !locked; 129 projectJobsView.Enabled = !locked; 130 131 projectView.Locked = locked; 132 projectPermissionsView.Locked = locked; 133 projectResourcesView.Locked = locked; 134 projectJobsView.Locked = locked; 117 135 } 118 136 #endregion … … 194 212 } 195 213 196 private void addButton_Click(object sender, EventArgs e) { 197 Guid? parentProjectId = null; 198 214 private void addButton_Click(object sender, EventArgs e) { 215 216 if (selectedProject == null && !IsAdmin()) { 217 MessageBox.Show( 218 "You are not allowed to add a root project - please select a parent project.", 219 "HeuristicLab Hive Administrator", 220 MessageBoxButtons.OK, 221 MessageBoxIcon.Information); 222 return; 223 } 224 199 225 if (selectedProject != null && selectedProject.Id == Guid.Empty) { 200 226 MessageBox.Show( … … 206 232 } 207 233 208 if (selectedProject != null) parentProjectId = selectedProject.Id;209 234 var project = new Project { 210 235 Name = "New Project", 211 OwnerUserId = UserInformation.Instance.User.Id, 212 ParentProjectId = parentProjectId 236 OwnerUserId = UserInformation.Instance.User.Id, 213 237 }; 214 215 selectedProject = project; 238 if(selectedProject != null) { 239 project.ParentProjectId = selectedProject.Id; 240 project.EndDate = selectedProject.EndDate; 241 } 242 243 SelectedProject = project; 216 244 Content.Add(project); 217 245 } … … 221 249 222 250 lock (locker) { 251 // for details go to ChangeSelectedProject(..) 223 252 if (!removeButton.Enabled) return; 224 253 removeButton.Enabled = false; 225 254 } 226 255 227 if(!IsAdmin()228 && HiveAdminClient.Instance.CheckOwnershipOfParentProject(selectedProject,229 256 // double check of ChangeSelectedProject(..): 257 // if the user is no admin nor owner of a parent project 258 if (!IsAdmin() && !HiveAdminClient.Instance.CheckOwnershipOfParentProject(selectedProject, UserInformation.Instance.User.Id)) { 230 259 MessageBox.Show( 231 "Only subprojects of owned projects can be deleted.",260 "Only admins and owners of parent projects are allowed to delete this project.", 232 261 "HeuristicLab Hive Administrator", 233 262 MessageBoxButtons.OK, 234 263 MessageBoxIcon.Error); 235 264 return; 236 } 237 238 if (!IsAdmin() && Content.Any(x => x.ParentProjectId == selectedProject.Id)) { 265 } 266 267 268 if (Content.Any(x => x.ParentProjectId == selectedProject.Id) 269 || HiveAdminClient.Instance.ProjectDescendants[selectedProject.Id].Any()) { 239 270 MessageBox.Show( 240 271 "Only empty projects can be deleted.", … … 245 276 } 246 277 278 if (HiveAdminClient.Instance.Jobs.ContainsKey(selectedProject.Id) 279 && HiveAdminClient.Instance.Jobs[selectedProject.Id] != null 280 && HiveAdminClient.Instance.Jobs[selectedProject.Id].Any()) { 281 MessageBox.Show( 282 "There are " + HiveAdminClient.Instance.Jobs[selectedProject.Id].Count + " job(s) using this project and/or child-projects. It is necessary to delete them before the project.", 283 "HeuristicLab Hive Administrator", 284 MessageBoxButtons.OK, 285 MessageBoxIcon.Error); 286 return; 287 } 288 247 289 var result = MessageBox.Show( 248 290 "Do you really want to delete " + selectedProject.Name + "?", … … 253 295 if (result == DialogResult.Yes) { 254 296 await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions( 255 action: () => RemoveProject(selectedProject), 297 action: () => { 298 RemoveProject(selectedProject); 299 }, 256 300 finallyCallback: () => { 257 301 removeButton.Enabled = true; 258 302 }); 303 } else { 304 removeButton.Enabled = true; 259 305 } 260 306 } … … 268 314 await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions( 269 315 action: () => { 316 //if (selectedProject != null && selectedProject.Id == Guid.Empty) 317 // SelectedProject = HiveAdminClient.Instance.GetAvailableProjectAncestors(selectedProject.Id).LastOrDefault(); 270 318 var projectsToSave = Content.Where(x => x.Id == Guid.Empty || x.Modified); 271 319 foreach (var project in projectsToSave) 272 320 project.Store(); 321 273 322 UpdateProjects(); 274 323 }, … … 278 327 } 279 328 280 private void projectsTreeView_AfterSelect(object sender, TreeViewEventArgs e) { 281 ChangeSelectedProjectNode(e.Node); 282 283 //if (projectView.Content != null) 284 // projectView.Content.PropertyChanged -= ProjectViewContent_PropertyChanged; 285 286 projectView.Content = selectedProject; 287 projectPermissionsView.Content = selectedProject; 288 projectResourcesView.Content = selectedProject; 289 290 //if (selectedProject != null) 291 // selectedProject.PropertyChanged += ProjectViewContent_PropertyChanged; 329 private void projectsTreeView_MouseDown(object sender, MouseEventArgs e) { 330 var node = projectsTreeView.GetNodeAt(e.Location); 331 if (node == null) return; 332 var p = (Project)node.Tag; 333 if(!HiveAdminClient.Instance.DisabledParentProjects.Contains(p)) ChangeSelectedProjectNode(node); 334 } 335 336 private void projectsTreeView_BeforeSelect(object sender, TreeViewCancelEventArgs e) { 337 e.Cancel = true; 292 338 } 293 339 294 340 private void projectsTreeView_DragDrop(object sender, DragEventArgs e) { 341 if (e.Effect == DragDropEffects.None) return; 342 295 343 var sourceNode = (TreeNode)e.Data.GetData(typeof(TreeNode)); 296 344 if (sourceNode == null) return; 297 var source Resource= ((Project)sourceNode.Tag);298 if (source Resource== null) return;345 var sourceProject = ((Project)sourceNode.Tag); 346 if (sourceProject == null) return; 299 347 300 348 var treeView = (TreeView)sender; … … 304 352 var targetNode = treeView.GetNodeAt(targetPoint); 305 353 306 if (sourceNode == targetNode) return;307 354 var targetProject = (targetNode != null) ? (Project)targetNode.Tag : null; 308 355 309 if (targetProject != null && targetProject.Id == Guid.Empty) {356 if (!HiveAdminClient.Instance.CheckParentChange(sourceProject, targetProject)) { 310 357 MessageBox.Show( 311 "You cannot drag projects to a not yet storedproject.",358 "You cannot drag projects to this project.", 312 359 "HeuristicLab Hive Administrator", 313 360 MessageBoxButtons.OK, 314 361 MessageBoxIcon.Information); 315 362 return; 316 363 } 317 364 … … 320 367 } else { 321 368 sourceNode.Parent.Nodes.Remove(sourceNode); 322 source Resource.ParentProjectId = null;369 sourceProject.ParentProjectId = null; 323 370 } 324 371 … … 327 374 } else if(targetProject.Id != Guid.Empty) { 328 375 targetNode.Nodes.Add(sourceNode); 329 source Resource.ParentProjectId = targetProject.Id;330 } 331 332 selectedProject = sourceResource;376 sourceProject.ParentProjectId = targetProject.Id; 377 } 378 379 SelectedProject = sourceProject; 333 380 OnContentChanged(); 334 381 } … … 340 387 } 341 388 342 private void projectsTreeView_DragEnter (object sender, DragEventArgs e) {389 private void projectsTreeView_DragEnterOver(object sender, DragEventArgs e) { 343 390 e.Effect = DragDropEffects.Move; 344 } 345 346 private void projectsTreeView_DragOver(object sender, DragEventArgs e) { 347 e.Effect = DragDropEffects.Move; 391 392 var sourceNode = (TreeNode)e.Data.GetData(typeof(TreeNode)); 393 var sourceProject = ((Project)sourceNode.Tag); 394 395 var targetPoint = projectsTreeView.PointToClient(new Point(e.X, e.Y)); 396 var targetNode = projectsTreeView.GetNodeAt(targetPoint); 397 var targetProject = (targetNode != null) ? (Project)targetNode.Tag : null; 398 399 if ((!IsAdmin() && (targetNode == null || targetProject == null)) 400 || sourceNode == null 401 || sourceProject == null 402 || sourceNode == targetNode 403 || !HiveAdminClient.Instance.CheckParentChange(sourceProject, targetProject)) { 404 e.Effect = DragDropEffects.None; 405 } 348 406 } 349 407 … … 354 412 355 413 #region Helpers 356 private void ResetTreeNodes(TreeNodeCollection nodes, Color c1, Color c2, bool resetText) { 357 foreach (TreeNode n in nodes) { 358 var pro = ((Project)n.Tag); 359 if (n.BackColor.Equals(c1)) { 360 n.BackColor = c2; 361 } 362 if (resetText) { 363 n.Text = pro.Name; 364 365 if (pro.Id == Guid.Empty) { 366 n.Text += " [not stored]"; 367 } else if (pro.Modified) { 368 n.Text += " [changes not stored]"; 369 } 370 } 371 if (n.Nodes.Count > 0) { 372 ResetTreeNodes(n.Nodes, c1, c2, resetText); 373 } 374 } 375 } 376 377 private void ChangeSelectedProjectNode(TreeNode projectNode) { 378 selectedProject = (Project)projectNode.Tag; 379 ResetTreeNodes(projectsTreeView.Nodes, selectedColor, Color.Transparent, true); 380 projectNode.BackColor = selectedColor; 381 projectNode.Text += " [selected]"; 382 } 383 384 private Project BuildProjectTree(IEnumerable<Project> projects) { 414 private void BuildProjectTree(IEnumerable<Project> projects) { 385 415 projectsTreeView.Nodes.Clear(); 386 if (!projects.Any()) return null; 387 416 if (!projects.Any()) return; 417 418 var disabledParentProjects = HiveAdminClient.Instance.DisabledParentProjects; 388 419 var mainProjects = new HashSet<Project>(projects.Where(x => x.ParentProjectId == null)); 389 var parentedMainProjects = new HashSet<Project>(projects 390 .Where(x => x.ParentProjectId.HasValue 391 && !projects.Select(y => y.Id).Contains(x.ParentProjectId.Value))); 392 mainProjects.UnionWith(parentedMainProjects); 393 var subProbjects = new HashSet<Project>(projects.Except(mainProjects)); 420 //var parentedMainProjects = new HashSet<Project>(projects 421 // .Where(x => x.ParentProjectId.HasValue 422 // && !projects.Select(y => y.Id).Contains(x.ParentProjectId.Value))); 423 //mainProjects.UnionWith(parentedMainProjects); 424 var mainDisabledParentProjects = new HashSet<Project>(disabledParentProjects.Where(x => x.ParentProjectId == null || x.ParentProjectId == Guid.Empty)); 425 mainProjects.UnionWith(mainDisabledParentProjects); 426 var subProbjects = new HashSet<Project>(projects.Union(disabledParentProjects).Except(mainProjects)); 394 427 395 428 var stack = new Stack<Project>(mainProjects.OrderByDescending(x => x.Name)); 396 if (selectedProject != null) selectedProject = projects.Where(x => x.Id == selectedProject.Id).FirstOrDefault();429 if (selectedProject != null) SelectedProject = projects.Where(x => x.Id == selectedProject.Id).FirstOrDefault(); 397 430 bool nodeSelected = false; 398 431 399 432 TreeNode currentNode = null; 400 433 Project currentProject = null; 401 434 402 435 while (stack.Any()) { 403 436 var newProject = stack.Pop(); 404 437 var newNode = new TreeNode(newProject.Name) { Tag = newProject }; 405 406 if (newProject.Id == Guid.Empty) { 407 newNode.Text += " [not stored]"; 408 } else if(newProject.Modified) { 409 newNode.Text += " [changes not stored]"; 410 } 411 if (selectedProject == null) { 412 selectedProject = newProject; 413 } 414 if (newProject.Id == selectedProject.Id && !nodeSelected) { 415 newNode.BackColor = selectedColor; 416 newNode.Text += " [selected]"; 438 StyleTreeNode(newNode, newProject); 439 440 if (selectedProject == null && !disabledParentProjects.Contains(newProject)) { 441 SelectedProject = newProject; 442 } 443 if (!nodeSelected && selectedProject != null && selectedProject.Id == newProject.Id) { 444 newNode.BackColor = selectedBackColor; 445 newNode.ForeColor = selectedForeColor; 446 newNode.Text += SELECTED_TAG; 417 447 nodeSelected = true; 418 448 } … … 435 465 436 466 newNode.SelectedImageIndex = newNode.ImageIndex; 467 468 if (disabledParentProjects.Contains(newProject)) { 469 newNode.Checked = false; 470 newNode.ForeColor = grayTextColor; 471 } 437 472 438 473 var childProjects = subProbjects.Where(x => x.ParentProjectId == newProject.Id); … … 448 483 449 484 projectsTreeView.ExpandAll(); 450 451 return selectedProject; 485 } 486 487 private void StyleTreeNode(TreeNode n, Project p) { 488 n.Text = p.Name; 489 n.BackColor = Color.Transparent; 490 n.ForeColor = Color.Black; 491 492 if (HiveAdminClient.Instance.DisabledParentProjects.Select(x => x.Id).Contains(p.Id)) { 493 n.ForeColor = grayTextColor; 494 } else if (p.Id == Guid.Empty) { 495 n.Text += NOT_STORED_TAG; 496 } else if (p.Modified) { 497 n.Text += CHANGES_NOT_STORED_TAG; 498 } 499 } 500 501 private void ResetTreeNodes(TreeNodeCollection nodes) { 502 foreach (TreeNode n in nodes) { 503 StyleTreeNode(n, (Project)n.Tag); 504 if (n.Nodes.Count > 0) { 505 ResetTreeNodes(n.Nodes); 506 } 507 } 508 } 509 510 private void ChangeSelectedProject(Project project) { 511 projectView.Content = project; 512 projectPermissionsView.Content = project; 513 projectResourcesView.Content = project; 514 projectJobsView.Content = project; 515 selectedProject = project; 516 SetEnabledStateOfControls(); 517 } 518 519 private void ChangeSelectedProjectNode(TreeNode projectNode) { 520 if (projectNode == null) return; 521 SelectedProject = (Project)projectNode.Tag; 522 ResetTreeNodes(projectsTreeView.Nodes); 523 projectNode.BackColor = selectedBackColor; 524 projectNode.ForeColor = selectedForeColor; 525 projectNode.Text += SELECTED_TAG; 452 526 } 453 527 … … 462 536 463 537 private void RemoveProject(Project project) { 464 if (project == null || project.Id == Guid.Empty) return;538 if (project == null) return; 465 539 466 540 try { 467 HiveAdminClient.Delete(project); 468 Content.Remove(selectedProject); 541 if (project.Id != Guid.Empty) { 542 var projectsToSave = Content.Where(x => x.Id == Guid.Empty || x.Modified); 543 foreach (var p in projectsToSave) 544 p.Store(); 545 546 SelectedProject = HiveAdminClient.Instance.GetAvailableProjectAncestors(project.Id).LastOrDefault(); 547 HiveAdminClient.Delete(project); 548 UpdateProjects(); 549 } else { 550 Content.Remove(project); 551 } 469 552 } catch (AnonymousUserException) { 470 553 ShowHiveInformationDialog(); … … 474 557 private bool IsAuthorized(Project project) { 475 558 return project != null && UserInformation.Instance.UserExists; 476 //&& (project.OwnerUserId == UserInformation.Instance.User.Id || HiveRoles.CheckAdminUserPermissions());477 559 } 478 560
Note: See TracChangeset
for help on using the changeset viewer.