MainWindowGridController.cs

00001 using System;
00002 using System.Collections.Generic;
00003 using System.Text;
00004 using System.Windows.Forms;
00005 using Shared;
00006 using System.Data;
00007 using System.Drawing;
00008 
00009 namespace Client
00010 {
00011     public partial class MainWindow : Form
00012     {
00016         private GridFormats gridFormat = GridFormats.None;
00017         
00021         enum GridFormats {
00022             Project,
00023             Literature,
00024             Search,
00025             User,
00026             Tag,
00027             None
00028         }
00029 
00033         public enum SearchTypes
00034         {
00036             FreeText,
00038             ByTag,
00040             Relevance
00041         }
00042         private struct PreviousSearch
00043         {
00044             public SearchTypes byTag;
00045             public string query;
00046             public object Tag; 
00047             public ResultType types;
00048             public int resultCount;
00056             public PreviousSearch(string query, ResultType type, SearchTypes byTag, int resultCount)
00057             {
00058                 this.byTag = byTag;
00059                 this.query = query;
00060                 this.types = type;
00061                 this.resultCount = resultCount;
00062                 Tag = null;
00063             }
00072             public PreviousSearch(string query, ResultType type, SearchTypes byTag, int resultCount, object tag)
00073             {
00074                 this.byTag = byTag;
00075                 this.query = query;
00076                 this.types = type;
00077                 this.resultCount = resultCount;
00078                 this.Tag = tag;
00079             }
00080         }
00081 
00082 
00083         DataTable currentData = null;
00084 
00085 
00089         private void SetProjectGrid()
00090         {
00091             currentData = new DataTable();
00092             currentData.Columns.Add("object", typeof(ISearchable));
00093             currentData.Columns.Add(" ", typeof(Image));
00094             currentData.Columns.Add("Title", typeof(string));
00095             currentData.Columns.Add("Subject", typeof(string));
00096             currentData.Columns.Add("Department", typeof(string));
00097             currentData.Columns.Add("Year", typeof(string));
00098             mainGridView.DataSource = null;
00099             mainGridView.DataSource = currentData;
00100 
00101             gridFormat = GridFormats.Project;
00102 
00103             mainGridView.Columns[0].Visible = false;
00104 
00105             mainGridView.Columns[1].Width = 20;
00106             mainGridView.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00107             mainGridView.Columns[1].Resizable = DataGridViewTriState.False;
00108             mainGridView.Columns[1].ReadOnly = true;
00109 
00110             mainGridView.Columns[2].Width = 245;
00111             mainGridView.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
00112             mainGridView.Columns[2].ReadOnly = true;
00113 
00114             mainGridView.Columns[3].Width = 150;
00115             mainGridView.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00116             mainGridView.Columns[3].ReadOnly = true;
00117 
00118             mainGridView.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00119             mainGridView.Columns[4].Width = 150;
00120             mainGridView.Columns[4].ReadOnly = true;
00121 
00122             mainGridView.Columns[5].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00123             mainGridView.Columns[5].Width = 40;
00124             mainGridView.Columns[5].ReadOnly = true;
00125         }
00129         public void ShowProjects()
00130         {
00131             ShowProjects(null, false);
00132         }
00138         public void ShowProjects(string query, bool userSearch)
00139         {
00140             if (gridFormat != GridFormats.Project)
00141             {
00142                 SetProjectGrid();
00143             }
00144             currentData.Rows.Clear();
00145             ProjectInfo[] items;
00146             List<SearchResult> results = null;
00147             if (query == null)
00148                 items = accessHandler.ListProjects();
00149             else if(!userSearch)
00150             {
00151                 results = accessHandler.Search(query, ResultType.Project);
00152                 items = new ProjectInfo[results.Count];
00153             }
00154             else
00155             {
00156                 ISearchable[] gg = accessHandler.ListItems(ResultType.Project, query);
00157                 items = new ProjectInfo[gg.Length];
00158                 for (int i = 0; i < gg.Length; i++)
00159                 {
00160                     items[i] = (ProjectInfo)gg[i];
00161                 }
00162             }
00163             
00164             for(int i=0;i<items.Length;i++)
00165             {
00166                 if (query != null && !userSearch)
00167                     items[i] = (ProjectInfo)results[i].Item;
00168 
00169                 currentData.Rows.Add(
00170                     items[i],
00171                     global::Client.Properties.Resources.ResourceManager.GetObject("project"), 
00172                     items[i].Title, 
00173                     items[i].subject, 
00174                     items[i].department, 
00175                     items[i].Date == DateTime.MinValue ? "" : items[i].Date.Year.ToString()
00176                     );
00177             }
00178         }
00182         private void SetLiteratureGrid()
00183         {
00184             currentData = new DataTable();
00185             currentData.Columns.Add("object", typeof(ISearchable));
00186             currentData.Columns.Add(" ", typeof(Image));
00187             currentData.Columns.Add("Title", typeof(string));
00188             currentData.Columns.Add("Author(s)", typeof(string));
00189             currentData.Columns.Add("ISBN", typeof(string));
00190             currentData.Columns.Add("Year", typeof(string));
00191             mainGridView.DataSource = null;
00192             mainGridView.DataSource = currentData;
00193 
00194             gridFormat = GridFormats.Literature;
00195 
00196             mainGridView.Columns[0].Visible = false;
00197 
00198             mainGridView.Columns[1].Width = 20;
00199             mainGridView.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00200             mainGridView.Columns[1].Resizable = DataGridViewTriState.False;
00201             mainGridView.Columns[1].ReadOnly = true;
00202 
00203             mainGridView.Columns[2].Width = 245;
00204             mainGridView.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
00205             mainGridView.Columns[2].ReadOnly = true;
00206 
00207             mainGridView.Columns[3].Width = 150;
00208             mainGridView.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00209             mainGridView.Columns[3].ReadOnly = true;
00210 
00211             mainGridView.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00212             mainGridView.Columns[4].Width = 150;
00213             mainGridView.Columns[4].ReadOnly = true;
00214 
00215             mainGridView.Columns[5].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00216             mainGridView.Columns[5].Width = 40;
00217             mainGridView.Columns[5].ReadOnly = true;
00218         }
00219 
00223         public void ShowLiterature()
00224         {
00225             ShowLiterature(null, false);
00226         }
00232         public void ShowLiterature(string query, bool userSearch)
00233         {
00234             if (gridFormat != GridFormats.Literature)
00235             {
00236                 SetLiteratureGrid();
00237             }
00238             currentData.Rows.Clear();
00239             LiteratureInfo[] items;
00240             List<SearchResult> results = null;
00241             if (query == null)
00242                 items = accessHandler.ListLiterature();
00243             else if (!userSearch)
00244             {
00245                 results = accessHandler.Search(query, ResultType.Literature);
00246                 items = new LiteratureInfo[results.Count];
00247             }
00248             else
00249             {
00250                 ISearchable[] gg = accessHandler.ListItems(ResultType.Literature, query);
00251                 items = new LiteratureInfo[gg.Length];
00252                 for (int i = 0; i < gg.Length; i++)
00253                 {
00254                     items[i] = (LiteratureInfo)gg[i];
00255                 }
00256             }
00257 
00258             for (int i = 0; i < items.Length; i++)
00259             {
00260                 if (query != null && !userSearch)
00261                     items[i] = (LiteratureInfo)results[i].Item;
00262 
00263                 currentData.Rows.Add(
00264                     items[i],
00265                     global::Client.Properties.Resources.ResourceManager.GetObject("literature"),
00266                     items[i].Title,
00267                     items[i].author,
00268                     items[i].isbn,
00269                     items[i].Date == DateTime.MinValue ? "" : items[i].Date.Year.ToString()
00270                     );
00271             }
00272         }
00273 
00277         private void SetUsersGrid()
00278         {
00279             currentData = new DataTable();
00280             currentData.Columns.Add("object", typeof(ISearchable));
00281             currentData.Columns.Add(" ", typeof(Image));
00282             currentData.Columns.Add("Name", typeof(string));
00283             currentData.Columns.Add("Department", typeof(string));
00284             currentData.Columns.Add("UserName", typeof(string));
00285             mainGridView.DataSource = null;
00286             mainGridView.DataSource = currentData;
00287 
00288             gridFormat = GridFormats.User;
00289 
00290             mainGridView.Columns[0].Visible = false;
00291 
00292             mainGridView.Columns[1].Width = 20;
00293             mainGridView.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00294             mainGridView.Columns[1].Resizable = DataGridViewTriState.False;
00295             mainGridView.Columns[1].ReadOnly = true;
00296 
00297             mainGridView.Columns[2].Width = 245;
00298             mainGridView.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
00299             mainGridView.Columns[2].ReadOnly = true;
00300 
00301             mainGridView.Columns[3].Width = 190;
00302             mainGridView.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00303             mainGridView.Columns[3].ReadOnly = true;
00304 
00305             mainGridView.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00306             mainGridView.Columns[4].Width = 150;
00307             mainGridView.Columns[4].ReadOnly = true;
00308         }
00309 
00313         public void ShowUsers()
00314         {
00315             ShowUsers(null);
00316         }
00321         public void ShowUsers(string query)
00322         {
00323             if (gridFormat != GridFormats.User)
00324             {
00325                 SetUsersGrid();
00326             }
00327             currentData.Rows.Clear();
00328             PersonInfo[] items;
00329             ISearchable[] r2 = null;
00330             List<SearchResult> results = null;
00331             if (query == null)
00332             {
00333                 r2 = accessHandler.ListItems(ResultType.Person);
00334                 items = new PersonInfo[r2.Length];
00335             }
00336             else
00337             {
00338                 results = accessHandler.Search(query, ResultType.Person);
00339                 items = new PersonInfo[results.Count];
00340             }
00341 
00342             for (int i = 0; i < items.Length; i++)
00343             {
00344                 if (query != null)
00345                     items[i] = (PersonInfo)results[i].Item;
00346                 else
00347                     items[i] = (PersonInfo)r2[i];
00348 
00349                 currentData.Rows.Add(
00350                     items[i],
00351                     global::Client.Properties.Resources.ResourceManager.GetObject("user"),
00352                     items[i].name,
00353                     items[i].department,
00354                     items[i].username
00355                     );
00356             }
00357         }
00361         private void SetTagGrid()
00362         {
00363             currentData = new DataTable();
00364             currentData.Columns.Add("object", typeof(TagInfo));
00365             currentData.Columns.Add(" ", typeof(Image));
00366             currentData.Columns.Add("Tag Name", typeof(string));
00367             currentData.Columns.Add("Tag Usage", typeof(string));
00368             mainGridView.DataSource = null;
00369             mainGridView.DataSource = currentData;
00370 
00371             gridFormat = GridFormats.Tag;
00372 
00373             mainGridView.Columns[0].Visible = false;
00374 
00375             mainGridView.Columns[1].Width = 20;
00376             mainGridView.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00377             mainGridView.Columns[1].Resizable = DataGridViewTriState.False;
00378             mainGridView.Columns[1].ReadOnly = true;
00379 
00380             mainGridView.Columns[2].Width = 245;
00381             mainGridView.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
00382             mainGridView.Columns[2].ReadOnly = true;
00383 
00384             mainGridView.Columns[3].Width = 100;
00385             mainGridView.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00386             mainGridView.Columns[3].ReadOnly = true;
00387             mainGridView.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
00388 
00389 
00390         }
00394         public void ShowTags()
00395         {
00396             ShowTags(null);
00397         }
00402         public void ShowTags(string query)
00403         {
00404             if (gridFormat != GridFormats.Tag)
00405             {
00406                 SetTagGrid();
00407             }
00408             currentData.Rows.Clear();
00409             TagInfo[] tags = accessHandler.GetAllTags();
00410             Dictionary<string, int> sortedTags = new Dictionary<string, int>();
00411             
00412             foreach (TagInfo ti in tags)
00413             {
00414                 if (sortedTags.ContainsKey(ti.Name))
00415                     sortedTags[ti.Name]++;
00416                 else sortedTags.Add(ti.Name, 1);
00417             }
00418 
00419             foreach (KeyValuePair<string, int> kvp in sortedTags)
00420             {
00421                 TagInfo ti = new TagInfo(kvp.Key, -1, "", kvp.Value);
00422                 currentData.Rows.Add(
00423                     ti,
00424                     global::Client.Properties.Resources.ResourceManager.GetObject("tag"),
00425                     ti.Name,
00426                     ti.Count
00427                     );
00428             }
00429             mainGridView.Sort(mainGridView.Columns["Tag Usage"], System.ComponentModel.ListSortDirection.Descending);
00430         }
00431 
00432         private List<ListViewItem> previousSearches = new List<ListViewItem>();
00433         // a little bool to stop an infinite loop that occurs when the selected index of the sidebar is changed when searching causing a new search to be called.
00434         private bool IsSearching = false;
00435 
00439         private void SetSearchGrid()
00440         {
00441             currentData = new DataTable();
00442             currentData.Columns.Add("object", typeof(ISearchable));
00443             currentData.Columns.Add(" ", typeof(Image));
00444             currentData.Columns.Add("Type", typeof(string));
00445             currentData.Columns.Add("Title", typeof(string));
00446             currentData.Columns.Add("Description", typeof(string));
00447             currentData.Columns.Add("Date", typeof(string));
00448             currentData.Columns.Add("Score", typeof(float));
00449             mainGridView.DataSource = null;
00450             mainGridView.DataSource = currentData;
00451 
00452             gridFormat = GridFormats.Search;
00453 
00454             mainGridView.Columns[0].Visible = false;
00455 
00456             mainGridView.Columns[1].Width = 20;
00457             mainGridView.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00458             mainGridView.Columns[1].Resizable = DataGridViewTriState.False;
00459             mainGridView.Columns[1].ReadOnly = true;
00460 
00461             mainGridView.Columns[2].ReadOnly = true;
00462             mainGridView.Columns[2].Width = 75;
00463             mainGridView.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00464 
00465             mainGridView.Columns[3].Width = 150;
00466             mainGridView.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00467             mainGridView.Columns[3].ReadOnly = true;
00468 
00469             mainGridView.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
00470             mainGridView.Columns[4].ReadOnly = true;
00471 
00472             mainGridView.Columns[5].Width = 40;
00473             mainGridView.Columns[5].ReadOnly = true;
00474             mainGridView.Columns[5].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00475             
00476             mainGridView.Columns[6].Width = 40;
00477             mainGridView.Columns[6].ReadOnly = true;
00478             mainGridView.Columns[6].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
00479         }
00480 
00484         public void ShowSearch()
00485         {
00486             ShowSearch(null, ResultType.All, SearchTypes.FreeText);
00487         }
00494         public void ShowSearch(string query, ResultType type, SearchTypes searchType)
00495         {
00496             ShowSearch(query, type, searchType, null);
00497         }
00498         
00506         public void ShowSearch(string query, ResultType type, SearchTypes searchType, object tag)
00507         {
00508             if (gridFormat != GridFormats.Search)
00509             {
00510                 SetSearchGrid();
00511             }
00512             currentData.Rows.Clear();
00513 
00514             if (string.IsNullOrEmpty(query) || query.Length < 3)
00515                 return;
00516 
00517             IsSearching = true;
00518 
00519             
00520 
00521             ISearchable[] results = null;
00522             if (query == null)
00523             {
00524                 results = accessHandler.ListItems(type);
00525             }
00526             else
00527             {
00528                 switch (searchType)
00529                 {
00530                     case SearchTypes.FreeText:
00531                         results = accessHandler.Search(query, type).ToArray();
00532                         break;
00533                     case SearchTypes.ByTag:
00534                         results = accessHandler.SearchByTag(query).ToArray();
00535                         break;
00536                     case SearchTypes.Relevance:
00537                         results = accessHandler.ShowRelated((int)tag).ToArray();
00538                         break;
00539                     default:
00540                         break;
00541                 }
00542                 
00543             }
00544             string img = "find.png";
00545 
00546             bool found = false;
00547             foreach (ListViewItem lvi in previousSearches)
00548             {
00549                 PreviousSearch ps = (PreviousSearch)lvi.Tag;
00550                 if (ps.query.ToLower() == query.ToLower())
00551                 {
00552                     found = true;
00553                     lvi.Selected = true;
00554                     ps.resultCount = results.Length;
00555                     lvi.Text = query + " (" + results.Length + ")";
00556                 }
00557             }
00558             if (!found)
00559             {
00560                 ListViewItem lvi = new ListViewItem(query + " (" + results.Length + ")", img, sidebarTree.Groups[2]);
00561                 lvi.Tag = new PreviousSearch(query, type, searchType, results.Length, tag);
00562                 previousSearches.Insert(0, lvi);
00563                 sidebarTree.Items.Insert(0, lvi);
00564                 lvi.Selected = true;
00565             }
00566 
00567             for (int i = 0; i < results.Length; i++)
00568             {
00569                 object image;
00570 
00571                 ISearchable asd = results[i] is SearchResult ? ((SearchResult)results[i]).Item : results[i];
00572 
00573                 if (asd is LiteratureInfo)
00574                     image = global::Client.Properties.Resources.ResourceManager.GetObject("literature");
00575                 else if (asd is ProjectInfo)
00576                     image = global::Client.Properties.Resources.ResourceManager.GetObject("project");
00577                 else if (asd is PersonInfo)
00578                     image = global::Client.Properties.Resources.ResourceManager.GetObject("user");
00579                 else
00580                     image = global::Client.Properties.Resources.ResourceManager.GetObject("edit");
00581                 
00582                 float relevance = results[i] is SearchResult ? ((SearchResult)results[i]).Relevance : 0;
00583 
00584                 string date = results[i].Date != DateTime.MinValue ? results[i].Date.Year.ToString() : "N/A";
00585 
00586 
00587                 currentData.Rows.Add(
00588                     asd,
00589                     image,
00590                     results[i].Type,
00591                     results[i].Title,
00592                     results[i].Description,
00593                     date,
00594                     Math.Round(relevance, 1)
00595                     );
00596             }
00597             UpdateStats();
00598             IsSearching = false;
00599         }
00600 
00605         public void ShowRelated(int id)
00606         {
00607             if (gridFormat != GridFormats.Search)
00608             {
00609                 SetSearchGrid();
00610             }
00611             currentData.Rows.Clear();
00612 
00613             IsSearching = true;
00614 
00615             ISearchable[] results = accessHandler.ShowRelated(id).ToArray();
00616 
00617             for (int i = 0; i < results.Length; i++)
00618             {
00619                 object image;
00620 
00621                 ISearchable asd = results[i] is SearchResult ? ((SearchResult)results[i]).Item : results[i];
00622 
00623                 if (asd is LiteratureInfo)
00624                     image = global::Client.Properties.Resources.ResourceManager.GetObject("literature");
00625                 else if (asd is ProjectInfo)
00626                     image = global::Client.Properties.Resources.ResourceManager.GetObject("project");
00627                 else if (asd is PersonInfo)
00628                     image = global::Client.Properties.Resources.ResourceManager.GetObject("user");
00629                 else
00630                     image = global::Client.Properties.Resources.ResourceManager.GetObject("edit");
00631 
00632                 float relevance = results[i] is SearchResult ? ((SearchResult)results[i]).Relevance : 0;
00633 
00634                 string date = results[i].Date != DateTime.MinValue ? results[i].Date.Year.ToString() : "N/A";
00635 
00636 
00637                 currentData.Rows.Add(
00638                     asd,
00639                     image,
00640                     results[i].Type,
00641                     results[i].Title,
00642                     results[i].Description,
00643                     date,
00644                     Math.Round(relevance, 1)
00645                     );
00646             }
00647             UpdateStats();
00648             IsSearching = false;
00649         }
00650 
00651 
00652     }
00653 }

Generated on Thu Dec 21 06:21:55 2006 for SCRAML by  doxygen 1.5.1-p1