00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 using System;
00013 using System.ComponentModel;
00014 using System.Data;
00015 using System.Diagnostics;
00016 using System.Runtime.InteropServices;
00017 using System.Threading;
00018 using System.Windows.Forms;
00019 using Mcs.Epm.MicrosoftProject.mpFx.Client.Plugins.ProjectPlugin.Properties;
00020 using Mcs.Epm.MicrosoftProject.mpFx.Client.Shared;
00021 using Mcs.Epm.MicrosoftProject.mpFx.ProjectsWebService;
00022 using Microsoft.Office.Interop.MSProject;
00023 using Application = Microsoft.Office.Interop.MSProject.Application;
00024 using Exception=System.Exception;
00025 using View=System.Windows.Forms.View;
00026
00027 namespace Mcs.Epm.MicrosoftProject.mpFx.Client.Plugins.ProjectPlugin.Forms
00028 {
00029
00030
00031
00032 public partial class BrowserForm : Form
00033 {
00034 #region Constants
00035
00036 private const int DEFAULT_RETRY_COUNT = 15;
00037 private const int DEFAULT_WAIT_TIME = 2000;
00038
00039 #endregion
00040
00041 #region Instance Data
00042
00043 private readonly ProjectPlugin _Parent;
00044 private Application _Winproj;
00045
00046 #endregion
00047
00048 #region Constructors
00049
00050 public BrowserForm(ProjectPlugin parent)
00051 {
00052 InitializeComponent();
00053
00054 if (parent == null)
00055 {
00056 throw new ArgumentNullException("parent");
00057 }
00058
00059 _Parent = parent;
00060
00061 projectsListView.View = Settings.Default.LastViewBrowser;
00062 }
00063
00064 #endregion
00065
00066 #region Private Methods
00067
00068 private void LoadProjects()
00069 {
00070 _Parent.DoOnStatusChanged(new OnStatusChangedArgs("Loading Projects..."));
00071
00072 foreach (Guid projectGuid in _Parent.ProjectServer.Projects)
00073 {
00074 EnterpriseProject project = _Parent.ProjectServer.Projects[projectGuid];
00075
00076 _Parent.DoOnStatusChanged(new OnStatusChangedArgs(Tools.Format("Loading {0}...", project.Name)));
00077
00078 ListViewItem item = new ListViewItem(project.Name, 0);
00079
00080 using (ProjectDataSet projectDataSet = _Parent.ProjectServer.Projects[projectGuid].StandardInformation)
00081 {
00082 LoadProjectProperties(project, projectDataSet, item);
00083 }
00084
00085 _Parent.DoOnStatusChanged(new OnStatusChangedArgs(string.Empty));
00086
00087 projectsListView.Items.Add(item);
00088 }
00089 }
00090
00091 private void LoadProjectProperties(EnterpriseProject project, ProjectDataSet projectDataSet, ListViewItem item)
00092 {
00093 if (projectDataSet.Project.Count == 1)
00094 {
00095 ProjectDataSet.ProjectRow projectData = projectDataSet.Project[0];
00096
00097 item.Tag = project.ProjectGuid;
00098
00099 item.SubItems.Add(projectData.PROJ_INFO_START_DATE.ToString());
00100
00101 string value = "Unknown";
00102
00103 if (!projectData.IsProjectOwnerIDNull())
00104 {
00105 value = GetNameFromResGuid(projectData.ProjectOwnerID);
00106 }
00107
00108 item.SubItems.Add(value);
00109
00110 value = "Not checked out";
00111
00112 if (!projectData.IsPROJ_CHECKOUTBYNull())
00113 {
00114 value = GetNameFromResGuid(projectData.PROJ_CHECKOUTBY);
00115 }
00116
00117 item.SubItems.Add(value);
00118 }
00119 }
00120
00121 private void LoadProjectDetails(Guid guid)
00122 {
00123 resourcesListView.Items.Clear();
00124 basicInfoDataViewGrid.Rows.Clear();
00125
00126 using (ProjectDataSet projectDataSet = _Parent.ProjectServer.Projects[guid].StandardInformation)
00127 {
00128 if (projectDataSet.Project.Count == 1)
00129 {
00130 ProjectDataSet.ProjectRow projectData = projectDataSet.Project[0];
00131
00132 PopulateGrid(projectData, basicInfoDataViewGrid);
00133 }
00134 }
00135 if (tabControl.SelectedTab == resourcesTabPage)
00136 {
00137 LoadProjectTeam(guid);
00138 }
00139 }
00140
00141 private static void PopulateGrid(DataRow projectData, DataGridView grid)
00142 {
00143 foreach (DataColumn column in projectData.Table.Columns)
00144 {
00145 if (!projectData.IsNull(column))
00146 {
00147 string valueString = projectData[column].ToString();
00148 grid.Rows.Add(column.ColumnName, valueString);
00149 }
00150 }
00151 }
00152
00153 private void LoadProjectTeam(Guid guid)
00154 {
00155 resourcesListView.Items.Clear();
00156 resourcesListView.Columns.Clear();
00157 resourcesListView.Columns.Add("RES_NAME");
00158
00159 using (ProjectTeamDataSet projectTeamDataSet = _Parent.ProjectServer.Projects.ReadTeam(guid, false))
00160 {
00161 if (projectTeamDataSet.ProjectTeam.Rows.Count > 0)
00162 {
00163 foreach (DataColumn column in projectTeamDataSet.Tables[0].Columns)
00164 {
00165 resourcesListView.Columns.Add(column.ColumnName);
00166 }
00167
00168 foreach (ProjectTeamDataSet.ProjectTeamRow teamMember in projectTeamDataSet.ProjectTeam.Rows)
00169 {
00170 ListViewItem teamMemberItem = new ListViewItem();
00171 teamMemberItem.Text = teamMember.RES_NAME;
00172
00173 foreach (DataColumn column in teamMember.Table.Columns)
00174 {
00175 string valueString = string.Empty;
00176
00177 if (!teamMember.IsNull(column))
00178 {
00179 valueString = teamMember[column].ToString();
00180 }
00181
00182 teamMemberItem.SubItems.Add(valueString);
00183 }
00184
00185 resourcesListView.Items.Add(teamMemberItem);
00186 }
00187 }
00188 }
00189 }
00190
00191 private string GetNameFromResGuid(Guid resGuid)
00192 {
00193 EnterpriseResource resource = _Parent.ProjectServer.Resources[resGuid];
00194
00195 if (resource != null && !string.IsNullOrEmpty(resource.Name))
00196 {
00197 return resource.Name;
00198 }
00199
00200 return string.Empty;
00201 }
00202
00203 private void OpenSelectdProjectInWinProj()
00204 {
00205 Process[] processes = Process.GetProcessesByName("winproj");
00206
00207 bool success = false;
00208
00209 if (processes.Length == 0)
00210 {
00211
00212 ProcessStartInfo startupInfo = new ProcessStartInfo
00213 {
00214 FileName = "winproj.exe",
00215 Arguments = string.Format(" /s {0}", _Parent.ProjectServer.Site)
00216 };
00217 try
00218 {
00219 Process.Start(startupInfo);
00220 Thread.Sleep(DEFAULT_WAIT_TIME);
00221 }
00222 catch (Win32Exception exception)
00223 {
00224 MessageBox.Show(this,
00225 exception.Message,
00226 _Parent.Name,
00227 MessageBoxButtons.OK,
00228 MessageBoxIcon.Error);
00229 return;
00230 }
00231 }
00232
00233 for (int i = 0; i < DEFAULT_RETRY_COUNT; i++)
00234 {
00235
00236
00237 try
00238 {
00239 _Winproj = new Application();
00240
00241 _Winproj.Visible = true;
00242
00243 break;
00244
00245 }
00246 catch (COMException exception)
00247 {
00248 Debug.WriteLine(exception.Message);
00249
00250
00251 FreeWinProj();
00252
00253 Thread.Sleep(DEFAULT_WAIT_TIME);
00254 }
00255 }
00256
00257 if (_Winproj != null)
00258 {
00259
00260
00261
00262 Exception exception;
00263
00264 for (int i = 0; i < DEFAULT_RETRY_COUNT; i++)
00265 {
00266 try
00267 {
00268 success = _Winproj.Profiles.ActiveProfile.Server.Equals(_Parent.ProjectServer.Site.ToString(),
00269 StringComparison.CurrentCultureIgnoreCase);
00270
00271 break;
00272 }
00273 catch (COMException e)
00274 {
00275 exception = e;
00276 }
00277 catch (InvalidCastException e)
00278 {
00279 exception = e;
00280 }
00281
00282 if (exception.Message.Contains("not available"))
00283 {
00284
00285
00286 break;
00287 }
00288 Debug.WriteLine(exception.Message);
00289 Thread.Sleep(DEFAULT_WAIT_TIME);
00290 }
00291 }
00292
00293
00294 if (_Winproj != null && success)
00295 {
00296 _Winproj.FileOpenEx(@"<>\" + projectsListView.SelectedItems[0].Text,
00297 false,
00298 Type.Missing,
00299 Type.Missing,
00300 Type.Missing,
00301 Type.Missing,
00302 Type.Missing,
00303 Type.Missing,
00304 Type.Missing,
00305 Type.Missing,
00306 Type.Missing,
00307 PjPoolOpen.pjDoNotOpenPool,
00308 Type.Missing,
00309 Type.Missing,
00310 Type.Missing,
00311 Type.Missing,
00312 Type.Missing);
00313 }
00314 else
00315 {
00316 MessageBox.Show(this,
00317 "You may be logged onto a different instance of Project Server. Please close Project and try again.",
00318 _Parent.Name,
00319 MessageBoxButtons.OK,
00320 MessageBoxIcon.Error);
00321 }
00322 }
00323
00324 private void FreeWinProj()
00325 {
00326 if (_Winproj != null)
00327 {
00328 Marshal.FinalReleaseComObject(_Winproj);
00329 _Winproj = null;
00330 }
00331 }
00332
00333 #endregion
00334
00335 #region Event Handlers
00336
00337 private void detailsToolStripMenuItem_Click(object sender, EventArgs e)
00338 {
00339 iconsToolStripMenuItem.Checked = !detailsToolStripMenuItem.Checked;
00340
00341 if (detailsToolStripMenuItem.Checked)
00342 {
00343 projectsListView.View = View.Details;
00344 }
00345 }
00346
00347 private void iconsToolStripMenuItem_Click(object sender, EventArgs e)
00348 {
00349 detailsToolStripMenuItem.Checked = !iconsToolStripMenuItem.Checked;
00350
00351 if (iconsToolStripMenuItem.Checked)
00352 {
00353 projectsListView.View = View.SmallIcon;
00354 }
00355 }
00356
00357 private void BrowserForm_Shown(object sender, EventArgs e)
00358 {
00359 Cursor = Cursors.WaitCursor;
00360 LoadProjects();
00361 Cursor = Cursors.Default;
00362 }
00363
00364 private void BrowserForm_FormClosing(object sender, FormClosingEventArgs e)
00365 {
00366 Settings.Default.LastViewBrowser = projectsListView.View;
00367 Settings.Default.Save();
00368 }
00369
00370 private void projectsListView_SelectedIndexChanged(object sender, EventArgs e)
00371 {
00372 if (!splitContainer.Panel2Collapsed && projectsListView.SelectedItems.Count > 0)
00373 {
00374 Cursor = Cursors.WaitCursor;
00375 LoadProjectDetails(new Guid(projectsListView.SelectedItems[0].Tag.ToString()));
00376 Cursor = Cursors.Default;
00377 }
00378 openInWinPojToolStripButton.Enabled = projectsListView.SelectedItems.Count > 0;
00379 }
00380
00381 private void detailsViewToolStripMenuItem_Click(object sender, EventArgs e)
00382 {
00383 detailsViewToolStripMenuItem.Checked = !detailsViewToolStripMenuItem.Checked;
00384
00385 if (!splitContainer.Panel2Collapsed && projectsListView.SelectedItems.Count > 0)
00386 {
00387 Cursor = Cursors.WaitCursor;
00388 LoadProjectDetails(new Guid(projectsListView.SelectedItems[0].Tag.ToString()));
00389 Cursor = Cursors.Default;
00390 }
00391 }
00392
00393 private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
00394 {
00395 if (!splitContainer.Panel2Collapsed && projectsListView.SelectedItems.Count > 0 && resourcesListView.Items.Count == 0)
00396 {
00397 Cursor = Cursors.WaitCursor;
00398 LoadProjectTeam(new Guid(projectsListView.SelectedItems[0].Tag.ToString()));
00399 Cursor = Cursors.Default;
00400 }
00401 }
00402
00403 private void openInWinPojToolStripButton_Click(object sender, EventArgs e)
00404 {
00405 Cursor = Cursors.WaitCursor;
00406 OpenSelectdProjectInWinProj();
00407 Cursor = Cursors.Default;
00408 }
00409
00410 #endregion
00411
00412 }
00413 }