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
 | 
						|
  }
 | 
						|
} |