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