462 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			462 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.ComponentModel;
 | |
| using System.Data;
 | |
| using System.Drawing;
 | |
| using System.Text;
 | |
| using System.Windows.Forms;
 | |
| using ProjectTracker.Library;
 | |
| 
 | |
| namespace PTWin
 | |
| {
 | |
|   public partial class MainForm : Form
 | |
|   {
 | |
|     public MainForm()
 | |
|     {
 | |
|       InitializeComponent();
 | |
|       _main = this;
 | |
|     }
 | |
| 
 | |
|     private static MainForm _main;
 | |
| 
 | |
|     internal static MainForm Instance
 | |
|     {
 | |
|       get { return _main; }
 | |
|     }
 | |
| 
 | |
|     private void MainForm_Load(object sender, EventArgs e)
 | |
|     {
 | |
|       if (Csla.ApplicationContext.AuthenticationType == "Windows")
 | |
|         AppDomain.CurrentDomain.SetPrincipalPolicy(
 | |
|           System.Security.Principal.PrincipalPolicy.WindowsPrincipal);
 | |
|       else
 | |
|         DoLogin();
 | |
|       if (DocumentCount == 0)
 | |
|         this.DocumentsToolStripDropDownButton.Enabled = false;
 | |
|       ApplyAuthorizationRules();
 | |
|     }
 | |
| 
 | |
|     #region Projects
 | |
| 
 | |
|     private void NewProjectToolStripMenuItem_Click(
 | |
|       object sender, EventArgs e)
 | |
|     {
 | |
|       using (StatusBusy busy = 
 | |
|         new StatusBusy("Creating project..."))
 | |
|       {
 | |
|         AddWinPart(new ProjectEdit(Project.NewProject()));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     private void EditProjectToolStripMenuItem_Click(
 | |
|       object sender, EventArgs e)
 | |
|     {
 | |
|       using (ProjectSelect dlg = new ProjectSelect())
 | |
|       {
 | |
|         dlg.Text = "Edit Project";
 | |
|         if (dlg.ShowDialog() == DialogResult.OK)
 | |
|         {
 | |
|           ShowEditProject(dlg.ProjectId);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     public void ShowEditProject(Guid projectId)
 | |
|     {
 | |
|       // see if this project is already loaded
 | |
|       foreach (Control ctl in Panel1.Controls)
 | |
|       {
 | |
|         if (ctl is ProjectEdit)
 | |
|         {
 | |
|           ProjectEdit part = (ProjectEdit)ctl;
 | |
|           if (part.Project.Id.Equals(projectId))
 | |
|           {
 | |
|             // project already loaded so just
 | |
|             // display the existing winpart
 | |
|             ShowWinPart(part);
 | |
|             return;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       // the project wasn't already loaded
 | |
|       // so load it and display the new winpart
 | |
|       using (StatusBusy busy = new StatusBusy("Loading project..."))
 | |
|       {
 | |
|         try
 | |
|         {
 | |
|           AddWinPart(new ProjectEdit(Project.GetProject(projectId)));
 | |
|         }
 | |
|         catch (Csla.DataPortalException ex)
 | |
|         {
 | |
|           MessageBox.Show(ex.BusinessException.ToString(),
 | |
|             "Error loading", MessageBoxButtons.OK,
 | |
|             MessageBoxIcon.Exclamation);
 | |
|         }
 | |
|         catch (Exception ex)
 | |
|         {
 | |
|           MessageBox.Show(ex.ToString(),
 | |
|             "Error loading", MessageBoxButtons.OK,
 | |
|             MessageBoxIcon.Exclamation);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     private void DeleteProjectToolStripMenuItem_Click(object sender, EventArgs e)
 | |
|     {
 | |
|       ProjectSelect dlg = new ProjectSelect();
 | |
|       dlg.Text = "Delete Project";
 | |
|       if (dlg.ShowDialog() == DialogResult.OK)
 | |
|       {
 | |
|         // get the project id
 | |
|         Guid projectId = dlg.ProjectId;
 | |
| 
 | |
|         if (MessageBox.Show("Are you sure?", "Delete project",
 | |
|           MessageBoxButtons.YesNo, MessageBoxIcon.Question,
 | |
|           MessageBoxDefaultButton.Button2) == DialogResult.Yes)
 | |
|         {
 | |
|           using (StatusBusy busy = new StatusBusy("Deleting project..."))
 | |
|           {
 | |
|             try
 | |
|             {
 | |
|               Project.DeleteProject(projectId);
 | |
|             }
 | |
|             catch (Csla.DataPortalException ex)
 | |
|             {
 | |
|               MessageBox.Show(ex.BusinessException.ToString(),
 | |
|                 "Error deleting", MessageBoxButtons.OK,
 | |
|                 MessageBoxIcon.Exclamation);
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|               MessageBox.Show(ex.ToString(),
 | |
|                 "Error deleting", MessageBoxButtons.OK,
 | |
|                 MessageBoxIcon.Exclamation);
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     #region Resources
 | |
| 
 | |
|     private void NewResourceToolStripMenuItem_Click(object sender, EventArgs e)
 | |
|     {
 | |
|       using (StatusBusy busy = new StatusBusy("Creating resource..."))
 | |
|       {
 | |
|         AddWinPart(new ResourceEdit(Resource.NewResource()));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     private void EditResourceToolStripMenuItem_Click(
 | |
|       object sender, EventArgs e)
 | |
|     {
 | |
|       ResourceSelect dlg = new ResourceSelect();
 | |
|       dlg.Text = "Edit Resource";
 | |
|       if (dlg.ShowDialog() == DialogResult.OK)
 | |
|       {
 | |
|         // get the resource id
 | |
|         ShowEditResource(dlg.ResourceId);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     public void ShowEditResource(int resourceId)
 | |
|     {
 | |
|       // see if this resource is already loaded
 | |
|       foreach (Control ctl in Panel1.Controls)
 | |
|       {
 | |
|         if (ctl is ResourceEdit)
 | |
|         {
 | |
|           ResourceEdit part = (ResourceEdit)ctl;
 | |
|           if (part.Resource.Id.Equals(resourceId))
 | |
|           {
 | |
|             // resource already loaded so just
 | |
|             // display the existing winpart
 | |
|             ShowWinPart(part);
 | |
|             return;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       // the resource wasn't already loaded
 | |
|       // so load it and display the new winpart
 | |
|       using (StatusBusy busy = new StatusBusy("Loading resource..."))
 | |
|       {
 | |
|         try
 | |
|         {
 | |
|           AddWinPart(new ResourceEdit(Resource.GetResource(resourceId)));
 | |
|         }
 | |
|         catch (Csla.DataPortalException ex)
 | |
|         {
 | |
|           MessageBox.Show(ex.BusinessException.ToString(),
 | |
|             "Error loading", MessageBoxButtons.OK,
 | |
|             MessageBoxIcon.Exclamation);
 | |
|         }
 | |
|         catch (Exception ex)
 | |
|         {
 | |
|           MessageBox.Show(ex.ToString(),
 | |
|             "Error loading", MessageBoxButtons.OK,
 | |
|             MessageBoxIcon.Exclamation);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     private void DeleteResourceToolStripMenuItem_Click(
 | |
|       object sender, EventArgs e)
 | |
|     {
 | |
|       ResourceSelect dlg = new ResourceSelect();
 | |
|       dlg.Text = "Delete Resource";
 | |
|       if (dlg.ShowDialog() == DialogResult.OK)
 | |
|       {
 | |
|         // get the resource id
 | |
|         int resourceId = dlg.ResourceId;
 | |
| 
 | |
|         if (MessageBox.Show("Are you sure?", "Delete resource",
 | |
|           MessageBoxButtons.YesNo, MessageBoxIcon.Question,
 | |
|           MessageBoxDefaultButton.Button2) == DialogResult.Yes)
 | |
|         {
 | |
|           using (StatusBusy busy = 
 | |
|             new StatusBusy("Deleting resource..."))
 | |
|           {
 | |
|             try
 | |
|             {
 | |
|               Resource.DeleteResource(resourceId);
 | |
|             }
 | |
|             catch (Csla.DataPortalException ex)
 | |
|             {
 | |
|               MessageBox.Show(ex.BusinessException.ToString(), 
 | |
|                 "Error deleting", MessageBoxButtons.OK, 
 | |
|                 MessageBoxIcon.Exclamation);
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|               MessageBox.Show(ex.ToString(), 
 | |
|                 "Error deleting", MessageBoxButtons.OK, 
 | |
|                 MessageBoxIcon.Exclamation);
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     #region Roles
 | |
| 
 | |
|     private void EditRolesToolStripMenuItem_Click(
 | |
|       object sender, EventArgs e)
 | |
|     {
 | |
|       // see if this form is already loaded
 | |
|       foreach (Control ctl in Panel1.Controls)
 | |
|       {
 | |
|         if (ctl is RolesEdit)
 | |
|         {
 | |
|           ShowWinPart((WinPart)ctl);
 | |
|           return;
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       // it wasn't already loaded, so show it.
 | |
|       AddWinPart(new RolesEdit());
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     #region ApplyAuthorizationRules
 | |
| 
 | |
|     private void ApplyAuthorizationRules()
 | |
|     {
 | |
|       // Project menu
 | |
|       this.NewProjectToolStripMenuItem.Enabled = 
 | |
|         Project.CanAddObject();
 | |
|       this.EditProjectToolStripMenuItem.Enabled = 
 | |
|         Project.CanGetObject();
 | |
|       if (Project.CanEditObject())
 | |
|         this.EditProjectToolStripMenuItem.Text = 
 | |
|           "Edit project";
 | |
|       else
 | |
|         this.EditProjectToolStripMenuItem.Text = 
 | |
|           "View project";
 | |
|       this.DeleteProjectToolStripMenuItem.Enabled = 
 | |
|         Project.CanDeleteObject();
 | |
| 
 | |
|       // Resource menu
 | |
|       this.NewResourceToolStripMenuItem.Enabled = 
 | |
|         Resource.CanAddObject();
 | |
|       this.EditResourceToolStripMenuItem.Enabled = 
 | |
|         Resource.CanGetObject();
 | |
|       if (Resource.CanEditObject())
 | |
|         this.EditResourceToolStripMenuItem.Text = 
 | |
|           "Edit resource";
 | |
|       else
 | |
|         this.EditResourceToolStripMenuItem.Text = 
 | |
|           "View resource";
 | |
|       this.DeleteResourceToolStripMenuItem.Enabled = 
 | |
|         Resource.CanDeleteObject();
 | |
| 
 | |
|       // Admin menu
 | |
|       this.EditRolesToolStripMenuItem.Enabled = 
 | |
|         ProjectTracker.Library.Admin.Roles.CanEditObject();
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     #region Login/Logout
 | |
| 
 | |
|     private void LoginToolStripButton_Click(
 | |
|       object sender, EventArgs e)
 | |
|     {
 | |
|       DoLogin();
 | |
|     }
 | |
| 
 | |
|     private void DoLogin()
 | |
|     {
 | |
|       ProjectTracker.Library.Security.PTPrincipal.Logout();
 | |
| 
 | |
|       if (this.LoginToolStripButton.Text == "Login")
 | |
|       {
 | |
|         LoginForm loginForm = new LoginForm();
 | |
|         loginForm.ShowDialog(this);
 | |
|       }
 | |
| 
 | |
|       System.Security.Principal.IPrincipal user =
 | |
|         Csla.ApplicationContext.User;
 | |
| 
 | |
|       if (user.Identity.IsAuthenticated)
 | |
|       {
 | |
|         this.LoginToolStripLabel.Text = "Logged in as " +
 | |
|           user.Identity.Name;
 | |
|         this.LoginToolStripButton.Text = "Logout";
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         this.LoginToolStripLabel.Text = "Not logged in";
 | |
|         this.LoginToolStripButton.Text = "Login";
 | |
|       }
 | |
| 
 | |
|       // reset menus, etc.
 | |
|       ApplyAuthorizationRules();
 | |
| 
 | |
|       // notify all documents
 | |
|       foreach (Control ctl in Panel1.Controls)
 | |
|         if (ctl is WinPart)
 | |
|           ((WinPart)ctl).OnCurrentPrincipalChanged(this, EventArgs.Empty);
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
| 
 | |
|     #region WinPart handling
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Add a new WinPart control to the
 | |
|     /// list of available documents and
 | |
|     /// make it the active WinPart.
 | |
|     /// </summary>
 | |
|     /// <param name="part">The WinPart control to add and display.</param>
 | |
|     private void AddWinPart(WinPart part)
 | |
|     {
 | |
|       part.CloseWinPart += new EventHandler(CloseWinPart);
 | |
|       part.BackColor = toolStrip1.BackColor;
 | |
|       Panel1.Controls.Add(part);
 | |
|       this.DocumentsToolStripDropDownButton.Enabled = true;
 | |
|       ShowWinPart(part);
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Make the specified WinPart the 
 | |
|     /// active, displayed control.
 | |
|     /// </summary>
 | |
|     /// <param name="part">The WinPart control to display.</param>
 | |
|     private void ShowWinPart(WinPart part)
 | |
|     {
 | |
|       part.Dock = DockStyle.Fill;
 | |
|       part.Visible = true;
 | |
|       part.BringToFront();
 | |
|       this.Text = "Project Tracker - " + part.ToString();
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Populate the Documents dropdown list.
 | |
|     /// </summary>
 | |
|     private void DocumentsToolStripDropDownButton_DropDownOpening(
 | |
|       object sender, EventArgs e)
 | |
|     {
 | |
|       ToolStripItemCollection items = 
 | |
|         DocumentsToolStripDropDownButton.DropDownItems;
 | |
|       foreach (ToolStripItem item in items)
 | |
|         item.Click -= new EventHandler(DocumentClick);
 | |
|       items.Clear();
 | |
|       foreach (Control ctl in Panel1.Controls)
 | |
|         if (ctl is WinPart)
 | |
|         {
 | |
|           ToolStripItem item = new ToolStripMenuItem();
 | |
|           item.Text = ((WinPart)ctl).ToString();
 | |
|           item.Tag = ctl;
 | |
|           item.Click += new EventHandler(DocumentClick);
 | |
|           items.Add(item);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Make selected WinPart the active control.
 | |
|     /// </summary>
 | |
|     private void DocumentClick(object sender, EventArgs e)
 | |
|     {
 | |
|       WinPart ctl = (WinPart)((ToolStripItem)sender).Tag;
 | |
|       ShowWinPart(ctl);
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Gets a count of the number of loaded
 | |
|     /// documents.
 | |
|     /// </summary>
 | |
|     public int DocumentCount
 | |
|     {
 | |
|       get
 | |
|       {
 | |
|         int count = 0;
 | |
|         foreach (Control ctl in Panel1.Controls)
 | |
|           if (ctl is WinPart)
 | |
|             count++;
 | |
|         return count;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Handles event from WinPart when that
 | |
|     /// WinPart is closing.
 | |
|     /// </summary>
 | |
|     private void CloseWinPart(object sender, EventArgs e)
 | |
|     {
 | |
|       WinPart part = (WinPart)sender;
 | |
|       part.CloseWinPart -= new EventHandler(CloseWinPart);
 | |
|       part.Visible = false;
 | |
|       Panel1.Controls.Remove(part);
 | |
|       part.Dispose();
 | |
|       if (DocumentCount == 0)
 | |
|       {
 | |
|         this.DocumentsToolStripDropDownButton.Enabled = false;
 | |
|         this.Text = "Project Tracker";
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         // Find the first WinPart control and set
 | |
|         // the main form's Text property accordingly.
 | |
|         // This works because the first WinPart 
 | |
|         // is the active one.
 | |
|         foreach (Control ctl in Panel1.Controls)
 | |
|         {
 | |
|           if (ctl is WinPart)
 | |
|           {
 | |
|             this.Text = "Project Tracker - " + ((WinPart)ctl).ToString();
 | |
|             break;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     #endregion
 | |
|   }
 | |
| } |