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