source: Scheduling/trunk/cs/bsdx0200GUISourceCode/DApptSearch.cs@ 1731

Last change on this file since 1731 was 1143, checked in by Sam Habiel, 13 years ago

CalendarGrid: Many changes:

  1. Dragover handler to handle auto scrolling when dragging. Also highlights destination cell in dragging.
  2. Solution for the click-right click problem by better handling of right click issues.
  3. New method OnRButtonDown()
  4. Extra comments everywhere.
  5. Fix for single column being enabled when there are multiple resources. Columns property now calls this.SetColumnInfo() to rectify that problem.

CGDocument:

  1. EditAppoitment Used to send request a refresh from the DB and update the view itself, rather than letting the view handle that. That's now changed.

CGDocumentManager:

  1. MessageBox displayed during login splash now are shown BY the splash form.

CGView:

  1. Shortcuts and some display text updated.
  2. Splash screen when updating now removed.
  3. If print appointment slip checkbox is checked when EditAppointment is chosen, now it will print the routing slip.
  4. Tiny change in appointment structure generated during drag and drop (added Patient member, as it was causing a crash)

DApptSearch:

  1. Change of name of Appointment to Slot, for better user understanding.

DSplash:

  1. RemoteMessage box methods and associated delegates for mickey mousing the form from another thread.

Updated release exes and dlls

File size: 43.1 KB
Line 
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.Windows.Forms;
5using System.Data;
6using System.Linq;
7
8namespace IndianHealthService.ClinicalScheduling
9{
10 /// <summary>
11 /// Modal Dialog for searching for Patient Slots
12 /// </summary>
13 public class DApptSearch : System.Windows.Forms.Form
14 {
15 private System.Windows.Forms.Panel panel1;
16 private System.Windows.Forms.Button cmdCancel;
17 private System.Windows.Forms.Button btnAccept;
18 private System.Windows.Forms.Panel pnlDescription;
19 private System.Windows.Forms.GroupBox grpDescription;
20 private System.Windows.Forms.Label lblDescription;
21 private System.Windows.Forms.GroupBox groupBox1;
22 private System.Windows.Forms.Label label3;
23 private System.Windows.Forms.Label label2;
24 private System.Windows.Forms.CheckedListBox lstAccessTypes;
25 private System.Windows.Forms.ComboBox cboAccessTypeFilter;
26 private System.Windows.Forms.GroupBox grpDayOfWeek;
27 private System.Windows.Forms.CheckBox chkSun;
28 private System.Windows.Forms.CheckBox chkSat;
29 private System.Windows.Forms.CheckBox chkFri;
30 private System.Windows.Forms.CheckBox chkThu;
31 private System.Windows.Forms.CheckBox chkWed;
32 private System.Windows.Forms.CheckBox chkTue;
33 private System.Windows.Forms.CheckBox chkMon;
34 private System.Windows.Forms.GroupBox grpTimeOfDay;
35 private System.Windows.Forms.RadioButton rdoBoth;
36 private System.Windows.Forms.RadioButton rdoPM;
37 private System.Windows.Forms.RadioButton rdoAM;
38 private System.Windows.Forms.Label label1;
39 private System.Windows.Forms.GroupBox groupBox2;
40 private System.Windows.Forms.Button cmdSearch;
41 private ListView lstResults;
42 private ColumnHeader colStartTime;
43 private ColumnHeader colEndTime;
44 private ColumnHeader colResource;
45 private ColumnHeader colSlots;
46 private ColumnHeader colAccessType;
47 private ColumnHeader colDate;
48 private Label lblEnd;
49 private Label lblStart;
50 private DateTimePicker dtEnd;
51 private DateTimePicker dtStart;
52 private ColumnHeader colDOW;
53 private ColumnHeader colID;
54 private Label lblMessage;
55
56 private System.ComponentModel.IContainer components;
57
58 public DApptSearch()
59 {
60 InitializeComponent();
61 }
62
63 #region Fields
64
65 private CGDocumentManager m_DocManager;
66
67 private DataSet m_dsGlobal;
68 DataTable m_dtTypes;
69 DataView m_dvTypes;
70 List<CGAvailability> lstResultantAvailabilities;
71 private CGAvailability _selectedAvailability;
72 DateTime m_dStart;
73 DateTime m_dEnd;
74 ArrayList m_alResources;
75 ArrayList m_alAccessTypes;
76 string m_sWeekDays; //only practical use now is for sending to server
77 string m_sAmpm; // same here.
78
79 #endregion Fields
80
81 #region Methods
82
83 public void LoadListBox(string sGroup)
84 {
85 if (sGroup == "ALL")
86 {
87 //Load the Access Type list box with ALL access types
88 m_dtTypes = m_dsGlobal.Tables["AccessTypes"];
89 m_dvTypes = new DataView(m_dtTypes);
90 lstAccessTypes.DataSource = m_dvTypes;
91 lstAccessTypes.DisplayMember = "ACCESS_TYPE_NAME";
92 lstAccessTypes.Tag = 1; //This holds the column index of the ACCESS_TYPE_NAME column
93 lstAccessTypes.ValueMember = "BMXIEN";
94 }
95 else
96 {
97 //Load the Access Type list box with active access types belonging
98 //to group sGroup
99
100 //Build AccessGroup table containing *active* AccessTypes and their Groups
101 m_dtTypes = m_dsGlobal.Tables["AccessGroupType"];
102 //Create a view that is filterable on Access Group
103 m_dvTypes = new DataView(m_dtTypes);
104 m_dvTypes.RowFilter = "ACCESS_GROUP = '" + this.cboAccessTypeFilter.Text + "'";
105 lstAccessTypes.DataSource = m_dvTypes;
106 lstAccessTypes.DisplayMember = "ACCESS_TYPE";
107 lstAccessTypes.ValueMember = "ACCESS_TYPE_ID";
108 lstAccessTypes.Tag = 4; //This holds the column index of the ACCESS_TYPE column
109 }
110 }
111
112 public void InitializePage(ArrayList alResources, CGDocumentManager docManager)
113 {
114
115 this.Text = "Searching for available slots in: " + string.Join(" | ", alResources.Cast<string>());
116
117 this.m_DocManager = docManager;
118 this.m_dsGlobal = m_DocManager.GlobalDataSet;
119
120 LoadListBox("ALL");
121
122 m_dStart = DateTime.Today;
123 m_dEnd = new DateTime(9999);
124 this.m_alResources = alResources;
125 this.m_alAccessTypes = new ArrayList();
126 this.m_sAmpm="both";
127 this.m_sWeekDays = "";
128
129 //Load filter combo with list of access type groups
130 DataTable dtGroup = m_dsGlobal.Tables["AccessGroup"];
131 DataSet dsTemp = new DataSet("dsTemp");
132 dsTemp.Tables.Add(dtGroup.Copy());
133 DataTable dtTemp = dsTemp.Tables["AccessGroup"];
134 DataView dvGroup = new DataView(dtTemp);
135 DataRowView drv = dvGroup.AddNew();
136 drv["ACCESS_GROUP"]="<Show All Access Types>";
137 cboAccessTypeFilter.DataSource = dvGroup;
138 cboAccessTypeFilter.DisplayMember = "ACCESS_GROUP";
139 cboAccessTypeFilter.SelectedText = "<Show All Access Types>";
140 cboAccessTypeFilter.SelectedIndex = cboAccessTypeFilter.Items.Count - 1;
141 cboAccessTypeFilter.Refresh();
142
143
144 /* OLD CODE
145 //Create DataGridTableStyle for Result grid
146 DataGridTableStyle tsResult = new DataGridTableStyle();
147 tsResult.MappingName = "Result";
148 tsResult.ReadOnly = true;
149
150 // Add START_TIME column style.
151 DataGridTextBoxColumn colStartTime = new DataGridTextBoxColumn();
152 colStartTime.MappingName = "StartTime";
153 colStartTime.HeaderText = "Start Time";
154 colStartTime.Width = 200;
155 colStartTime.Format = "f";
156 tsResult.GridColumnStyles.Add(colStartTime);
157
158 // Add END_TIME column style.
159 DataGridTextBoxColumn colEndTime = new DataGridTextBoxColumn();
160 colEndTime.MappingName = "EndTime";
161 colEndTime.HeaderText = "End Time";
162 colEndTime.Width = 75;
163 colEndTime.Format = "h:mm tt";
164 tsResult.GridColumnStyles.Add(colEndTime);
165
166 // Add RESOURCE column style.
167 DataGridTextBoxColumn colResource = new DataGridTextBoxColumn();
168 colResource.MappingName = "ResourceList";
169 colResource.HeaderText = "Resource";
170 colResource.Width = 200;
171 tsResult.GridColumnStyles.Add(colResource);
172
173 // Add SLOTS column style.
174 DataGridTextBoxColumn colSlots = new DataGridTextBoxColumn();
175 colSlots.MappingName = "SLOTS";
176 colSlots.HeaderText = "Slots";
177 colSlots.Width = 50;
178 tsResult.GridColumnStyles.Add(colSlots);
179
180 // Add AMPM column style.
181 DataGridTextBoxColumn colAccess = new DataGridTextBoxColumn();
182 colAccess.MappingName = "ACCESSNAME";
183 colAccess.HeaderText = "Access Type";
184 colAccess.Width = 200;
185 tsResult.GridColumnStyles.Add(colAccess);
186 //grdResult.TableStyles.Add(tsResult);
187 */
188
189 this.UpdateDialogData(true);
190
191 }
192
193 /// <summary>
194 /// If b is true, moves member vars into control data
195 /// otherwise, moves control data into member vars
196 /// </summary>
197 /// <param name="b"></param>
198 private void UpdateDialogData(bool b)
199 {
200 if (b == true) //move member vars into controls
201 {
202
203 }
204 else //move control data into member vars
205 {
206
207 //Build AccessType list
208
209 this.m_alAccessTypes.Clear();
210
211 for (int j = 0; j < this.lstAccessTypes.CheckedItems.Count; j++)
212 {
213 DataRowView drv = (DataRowView) lstAccessTypes.CheckedItems[j];
214 int nIndex = (int) lstAccessTypes.Tag;
215 string sItem = drv.Row.ItemArray[nIndex].ToString();
216 m_alAccessTypes.Add(sItem);
217 }
218
219 //AM/PM
220 this.m_sAmpm = (this.rdoAM.Checked == true) ? "AM":"BOTH";
221 if (this.m_sAmpm != "AM")
222 this.m_sAmpm = (this.rdoPM.Checked == true) ? "PM":"BOTH";
223
224
225 //Weekday
226 this.m_sWeekDays = ""; //any
227 if (chkMon.Checked == true)
228 m_sWeekDays += "Monday";
229 if (chkTue.Checked == true)
230 m_sWeekDays += "Tuesday";
231 if (chkWed.Checked == true)
232 m_sWeekDays += "Wednesday";
233 if (chkThu.Checked == true)
234 m_sWeekDays += "Thursday";
235 if (chkFri.Checked == true)
236 m_sWeekDays += "Friday";
237 if (chkSat.Checked == true)
238 m_sWeekDays += "Saturday";
239 if (chkSun.Checked == true)
240 m_sWeekDays += "Sunday";
241
242 //Start
243 this.m_dStart = this.dtStart.Value;
244
245 //End
246 this.m_dEnd = this.dtEnd.Value;
247 }
248 }
249
250
251 /// <summary>
252 /// Clean up any resources being used.
253 /// </summary>
254 protected override void Dispose( bool disposing )
255 {
256 if( disposing )
257 {
258 if(components != null)
259 {
260 components.Dispose();
261 }
262 }
263 base.Dispose( disposing );
264 }
265
266 #endregion Methods
267
268 #region Windows Form Designer generated code
269 /// <summary>
270 /// Required method for Designer support - do not modify
271 /// the contents of this method with the code editor.
272 /// </summary>
273 private void InitializeComponent()
274 {
275 this.panel1 = new System.Windows.Forms.Panel();
276 this.lblMessage = new System.Windows.Forms.Label();
277 this.cmdSearch = new System.Windows.Forms.Button();
278 this.cmdCancel = new System.Windows.Forms.Button();
279 this.btnAccept = new System.Windows.Forms.Button();
280 this.pnlDescription = new System.Windows.Forms.Panel();
281 this.grpDescription = new System.Windows.Forms.GroupBox();
282 this.lblDescription = new System.Windows.Forms.Label();
283 this.groupBox1 = new System.Windows.Forms.GroupBox();
284 this.lblEnd = new System.Windows.Forms.Label();
285 this.lblStart = new System.Windows.Forms.Label();
286 this.dtEnd = new System.Windows.Forms.DateTimePicker();
287 this.dtStart = new System.Windows.Forms.DateTimePicker();
288 this.label3 = new System.Windows.Forms.Label();
289 this.label2 = new System.Windows.Forms.Label();
290 this.lstAccessTypes = new System.Windows.Forms.CheckedListBox();
291 this.cboAccessTypeFilter = new System.Windows.Forms.ComboBox();
292 this.grpDayOfWeek = new System.Windows.Forms.GroupBox();
293 this.chkSun = new System.Windows.Forms.CheckBox();
294 this.chkSat = new System.Windows.Forms.CheckBox();
295 this.chkFri = new System.Windows.Forms.CheckBox();
296 this.chkThu = new System.Windows.Forms.CheckBox();
297 this.chkWed = new System.Windows.Forms.CheckBox();
298 this.chkTue = new System.Windows.Forms.CheckBox();
299 this.chkMon = new System.Windows.Forms.CheckBox();
300 this.grpTimeOfDay = new System.Windows.Forms.GroupBox();
301 this.rdoBoth = new System.Windows.Forms.RadioButton();
302 this.rdoPM = new System.Windows.Forms.RadioButton();
303 this.rdoAM = new System.Windows.Forms.RadioButton();
304 this.label1 = new System.Windows.Forms.Label();
305 this.groupBox2 = new System.Windows.Forms.GroupBox();
306 this.lstResults = new System.Windows.Forms.ListView();
307 this.colID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
308 this.colDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
309 this.colDOW = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
310 this.colStartTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
311 this.colEndTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
312 this.colResource = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
313 this.colSlots = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
314 this.colAccessType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
315 this.panel1.SuspendLayout();
316 this.pnlDescription.SuspendLayout();
317 this.grpDescription.SuspendLayout();
318 this.groupBox1.SuspendLayout();
319 this.grpDayOfWeek.SuspendLayout();
320 this.grpTimeOfDay.SuspendLayout();
321 this.groupBox2.SuspendLayout();
322 this.SuspendLayout();
323 //
324 // panel1
325 //
326 this.panel1.Controls.Add(this.lblMessage);
327 this.panel1.Controls.Add(this.cmdSearch);
328 this.panel1.Controls.Add(this.cmdCancel);
329 this.panel1.Controls.Add(this.btnAccept);
330 this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
331 this.panel1.Location = new System.Drawing.Point(0, 461);
332 this.panel1.Name = "panel1";
333 this.panel1.Size = new System.Drawing.Size(923, 40);
334 this.panel1.TabIndex = 4;
335 //
336 // lblMessage
337 //
338 this.lblMessage.AutoSize = true;
339 this.lblMessage.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
340 this.lblMessage.ForeColor = System.Drawing.Color.Red;
341 this.lblMessage.Location = new System.Drawing.Point(337, 16);
342 this.lblMessage.Name = "lblMessage";
343 this.lblMessage.Size = new System.Drawing.Size(0, 16);
344 this.lblMessage.TabIndex = 3;
345 //
346 // cmdSearch
347 //
348 this.cmdSearch.Location = new System.Drawing.Point(33, 6);
349 this.cmdSearch.Name = "cmdSearch";
350 this.cmdSearch.Size = new System.Drawing.Size(72, 24);
351 this.cmdSearch.TabIndex = 2;
352 this.cmdSearch.Text = "Search";
353 this.cmdSearch.Click += new System.EventHandler(this.cmdSearch_Click);
354 //
355 // cmdCancel
356 //
357 this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
358 this.cmdCancel.Location = new System.Drawing.Point(828, 8);
359 this.cmdCancel.Name = "cmdCancel";
360 this.cmdCancel.Size = new System.Drawing.Size(64, 24);
361 this.cmdCancel.TabIndex = 1;
362 this.cmdCancel.Text = "Cancel";
363 //
364 // btnAccept
365 //
366 this.btnAccept.DialogResult = System.Windows.Forms.DialogResult.OK;
367 this.btnAccept.Location = new System.Drawing.Point(135, 8);
368 this.btnAccept.Name = "btnAccept";
369 this.btnAccept.Size = new System.Drawing.Size(176, 24);
370 this.btnAccept.TabIndex = 0;
371 this.btnAccept.Text = "Select Slot for Appointment";
372 this.btnAccept.Click += new System.EventHandler(this.btnAccept_Click);
373 //
374 // pnlDescription
375 //
376 this.pnlDescription.Controls.Add(this.grpDescription);
377 this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
378 this.pnlDescription.Location = new System.Drawing.Point(0, 397);
379 this.pnlDescription.Name = "pnlDescription";
380 this.pnlDescription.Size = new System.Drawing.Size(923, 64);
381 this.pnlDescription.TabIndex = 47;
382 //
383 // grpDescription
384 //
385 this.grpDescription.Controls.Add(this.lblDescription);
386 this.grpDescription.Dock = System.Windows.Forms.DockStyle.Fill;
387 this.grpDescription.Location = new System.Drawing.Point(0, 0);
388 this.grpDescription.Name = "grpDescription";
389 this.grpDescription.Size = new System.Drawing.Size(923, 64);
390 this.grpDescription.TabIndex = 0;
391 this.grpDescription.TabStop = false;
392 this.grpDescription.Text = "Description";
393 //
394 // lblDescription
395 //
396 this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
397 this.lblDescription.Location = new System.Drawing.Point(3, 16);
398 this.lblDescription.Name = "lblDescription";
399 this.lblDescription.Size = new System.Drawing.Size(917, 45);
400 this.lblDescription.TabIndex = 1;
401 this.lblDescription.Text = "Search for available slots times using this panel. You may narrow your search by" +
402 " selecting an access type or by selecting specific days of the week or times of " +
403 "day.";
404 //
405 // groupBox1
406 //
407 this.groupBox1.Controls.Add(this.lblEnd);
408 this.groupBox1.Controls.Add(this.lblStart);
409 this.groupBox1.Controls.Add(this.dtEnd);
410 this.groupBox1.Controls.Add(this.dtStart);
411 this.groupBox1.Controls.Add(this.label3);
412 this.groupBox1.Controls.Add(this.label2);
413 this.groupBox1.Controls.Add(this.lstAccessTypes);
414 this.groupBox1.Controls.Add(this.cboAccessTypeFilter);
415 this.groupBox1.Controls.Add(this.grpDayOfWeek);
416 this.groupBox1.Controls.Add(this.grpTimeOfDay);
417 this.groupBox1.Controls.Add(this.label1);
418 this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
419 this.groupBox1.Location = new System.Drawing.Point(0, 0);
420 this.groupBox1.Name = "groupBox1";
421 this.groupBox1.Size = new System.Drawing.Size(923, 208);
422 this.groupBox1.TabIndex = 56;
423 this.groupBox1.TabStop = false;
424 this.groupBox1.Text = "Search Parameters";
425 //
426 // lblEnd
427 //
428 this.lblEnd.AutoSize = true;
429 this.lblEnd.Location = new System.Drawing.Point(12, 124);
430 this.lblEnd.Name = "lblEnd";
431 this.lblEnd.Size = new System.Drawing.Size(153, 13);
432 this.lblEnd.TabIndex = 67;
433 this.lblEnd.Text = "End Date to Search (Inclusive)";
434 //
435 // lblStart
436 //
437 this.lblStart.AutoSize = true;
438 this.lblStart.Location = new System.Drawing.Point(12, 35);
439 this.lblStart.Name = "lblStart";
440 this.lblStart.Size = new System.Drawing.Size(159, 13);
441 this.lblStart.TabIndex = 66;
442 this.lblStart.Text = "Start Date to Search (Inclusive)";
443 //
444 // dtEnd
445 //
446 this.dtEnd.Location = new System.Drawing.Point(12, 141);
447 this.dtEnd.Name = "dtEnd";
448 this.dtEnd.Size = new System.Drawing.Size(200, 20);
449 this.dtEnd.TabIndex = 65;
450 this.dtEnd.ValueChanged += new System.EventHandler(this.dtEnd_ValueChanged);
451 //
452 // dtStart
453 //
454 this.dtStart.Location = new System.Drawing.Point(12, 54);
455 this.dtStart.Name = "dtStart";
456 this.dtStart.Size = new System.Drawing.Size(200, 20);
457 this.dtStart.TabIndex = 64;
458 this.dtStart.ValueChanged += new System.EventHandler(this.dtStart_ValueChanged);
459 //
460 // label3
461 //
462 this.label3.Location = new System.Drawing.Point(684, 64);
463 this.label3.Name = "label3";
464 this.label3.Size = new System.Drawing.Size(80, 16);
465 this.label3.TabIndex = 63;
466 this.label3.Text = "Access Type:";
467 //
468 // label2
469 //
470 this.label2.Location = new System.Drawing.Point(684, 21);
471 this.label2.Name = "label2";
472 this.label2.Size = new System.Drawing.Size(104, 16);
473 this.label2.TabIndex = 62;
474 this.label2.Text = "Access Group:";
475 //
476 // lstAccessTypes
477 //
478 this.lstAccessTypes.CheckOnClick = true;
479 this.lstAccessTypes.HorizontalScrollbar = true;
480 this.lstAccessTypes.Location = new System.Drawing.Point(661, 88);
481 this.lstAccessTypes.MultiColumn = true;
482 this.lstAccessTypes.Name = "lstAccessTypes";
483 this.lstAccessTypes.Size = new System.Drawing.Size(250, 109);
484 this.lstAccessTypes.TabIndex = 61;
485 //
486 // cboAccessTypeFilter
487 //
488 this.cboAccessTypeFilter.Location = new System.Drawing.Point(661, 40);
489 this.cboAccessTypeFilter.Name = "cboAccessTypeFilter";
490 this.cboAccessTypeFilter.Size = new System.Drawing.Size(250, 21);
491 this.cboAccessTypeFilter.TabIndex = 60;
492 this.cboAccessTypeFilter.Text = "cboAccessTypeFilter";
493 this.cboAccessTypeFilter.SelectionChangeCommitted += new System.EventHandler(this.cboAccessTypeFilter_SelectionChangeCommitted);
494 //
495 // grpDayOfWeek
496 //
497 this.grpDayOfWeek.Controls.Add(this.chkSun);
498 this.grpDayOfWeek.Controls.Add(this.chkSat);
499 this.grpDayOfWeek.Controls.Add(this.chkFri);
500 this.grpDayOfWeek.Controls.Add(this.chkThu);
501 this.grpDayOfWeek.Controls.Add(this.chkWed);
502 this.grpDayOfWeek.Controls.Add(this.chkTue);
503 this.grpDayOfWeek.Controls.Add(this.chkMon);
504 this.grpDayOfWeek.Location = new System.Drawing.Point(311, 94);
505 this.grpDayOfWeek.Name = "grpDayOfWeek";
506 this.grpDayOfWeek.Size = new System.Drawing.Size(240, 101);
507 this.grpDayOfWeek.TabIndex = 59;
508 this.grpDayOfWeek.TabStop = false;
509 this.grpDayOfWeek.Text = "Day of the Week";
510 //
511 // chkSun
512 //
513 this.chkSun.Location = new System.Drawing.Point(176, 64);
514 this.chkSun.Name = "chkSun";
515 this.chkSun.Size = new System.Drawing.Size(48, 16);
516 this.chkSun.TabIndex = 6;
517 this.chkSun.Text = "Sun";
518 //
519 // chkSat
520 //
521 this.chkSat.Location = new System.Drawing.Point(128, 64);
522 this.chkSat.Name = "chkSat";
523 this.chkSat.Size = new System.Drawing.Size(48, 16);
524 this.chkSat.TabIndex = 5;
525 this.chkSat.Text = "Sat";
526 //
527 // chkFri
528 //
529 this.chkFri.Location = new System.Drawing.Point(72, 64);
530 this.chkFri.Name = "chkFri";
531 this.chkFri.Size = new System.Drawing.Size(48, 16);
532 this.chkFri.TabIndex = 4;
533 this.chkFri.Text = "Fri";
534 //
535 // chkThu
536 //
537 this.chkThu.Location = new System.Drawing.Point(16, 64);
538 this.chkThu.Name = "chkThu";
539 this.chkThu.Size = new System.Drawing.Size(48, 16);
540 this.chkThu.TabIndex = 3;
541 this.chkThu.Text = "Thu";
542 //
543 // chkWed
544 //
545 this.chkWed.Location = new System.Drawing.Point(128, 32);
546 this.chkWed.Name = "chkWed";
547 this.chkWed.Size = new System.Drawing.Size(48, 16);
548 this.chkWed.TabIndex = 2;
549 this.chkWed.Text = "Wed";
550 //
551 // chkTue
552 //
553 this.chkTue.Location = new System.Drawing.Point(72, 32);
554 this.chkTue.Name = "chkTue";
555 this.chkTue.Size = new System.Drawing.Size(48, 16);
556 this.chkTue.TabIndex = 1;
557 this.chkTue.Text = "Tue";
558 //
559 // chkMon
560 //
561 this.chkMon.Location = new System.Drawing.Point(16, 32);
562 this.chkMon.Name = "chkMon";
563 this.chkMon.Size = new System.Drawing.Size(48, 16);
564 this.chkMon.TabIndex = 0;
565 this.chkMon.Text = "Mon";
566 //
567 // grpTimeOfDay
568 //
569 this.grpTimeOfDay.Controls.Add(this.rdoBoth);
570 this.grpTimeOfDay.Controls.Add(this.rdoPM);
571 this.grpTimeOfDay.Controls.Add(this.rdoAM);
572 this.grpTimeOfDay.Location = new System.Drawing.Point(311, 32);
573 this.grpTimeOfDay.Name = "grpTimeOfDay";
574 this.grpTimeOfDay.Size = new System.Drawing.Size(240, 48);
575 this.grpTimeOfDay.TabIndex = 58;
576 this.grpTimeOfDay.TabStop = false;
577 this.grpTimeOfDay.Text = "Time of Day";
578 //
579 // rdoBoth
580 //
581 this.rdoBoth.Checked = true;
582 this.rdoBoth.Location = new System.Drawing.Point(176, 24);
583 this.rdoBoth.Name = "rdoBoth";
584 this.rdoBoth.Size = new System.Drawing.Size(48, 16);
585 this.rdoBoth.TabIndex = 2;
586 this.rdoBoth.TabStop = true;
587 this.rdoBoth.Text = "Both";
588 //
589 // rdoPM
590 //
591 this.rdoPM.Location = new System.Drawing.Point(96, 24);
592 this.rdoPM.Name = "rdoPM";
593 this.rdoPM.Size = new System.Drawing.Size(72, 16);
594 this.rdoPM.TabIndex = 1;
595 this.rdoPM.Text = "PM Only";
596 //
597 // rdoAM
598 //
599 this.rdoAM.Location = new System.Drawing.Point(16, 24);
600 this.rdoAM.Name = "rdoAM";
601 this.rdoAM.Size = new System.Drawing.Size(72, 16);
602 this.rdoAM.TabIndex = 0;
603 this.rdoAM.Text = "AM Only";
604 //
605 // label1
606 //
607 this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
608 this.label1.Location = new System.Drawing.Point(6, 16);
609 this.label1.Name = "label1";
610 this.label1.Size = new System.Drawing.Size(136, 16);
611 this.label1.TabIndex = 57;
612 this.label1.Text = "Date Range:";
613 //
614 // groupBox2
615 //
616 this.groupBox2.Controls.Add(this.lstResults);
617 this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
618 this.groupBox2.Location = new System.Drawing.Point(0, 208);
619 this.groupBox2.Name = "groupBox2";
620 this.groupBox2.Size = new System.Drawing.Size(923, 189);
621 this.groupBox2.TabIndex = 57;
622 this.groupBox2.TabStop = false;
623 this.groupBox2.Text = "Search Result";
624 //
625 // lstResults
626 //
627 this.lstResults.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
628 this.colID,
629 this.colDate,
630 this.colDOW,
631 this.colStartTime,
632 this.colEndTime,
633 this.colResource,
634 this.colSlots,
635 this.colAccessType});
636 this.lstResults.Dock = System.Windows.Forms.DockStyle.Fill;
637 this.lstResults.FullRowSelect = true;
638 this.lstResults.GridLines = true;
639 this.lstResults.Location = new System.Drawing.Point(3, 16);
640 this.lstResults.MultiSelect = false;
641 this.lstResults.Name = "lstResults";
642 this.lstResults.Size = new System.Drawing.Size(917, 170);
643 this.lstResults.TabIndex = 0;
644 this.lstResults.UseCompatibleStateImageBehavior = false;
645 this.lstResults.View = System.Windows.Forms.View.Details;
646 this.lstResults.DoubleClick += new System.EventHandler(this.lstResults_DoubleClick);
647 //
648 // colID
649 //
650 this.colID.Text = "ID";
651 this.colID.Width = 0;
652 //
653 // colDate
654 //
655 this.colDate.Text = "Date";
656 this.colDate.Width = 91;
657 //
658 // colDOW
659 //
660 this.colDOW.Text = "Day of Week";
661 this.colDOW.Width = 80;
662 //
663 // colStartTime
664 //
665 this.colStartTime.Text = "Start Time";
666 this.colStartTime.Width = 87;
667 //
668 // colEndTime
669 //
670 this.colEndTime.Text = "End Time";
671 this.colEndTime.Width = 116;
672 //
673 // colResource
674 //
675 this.colResource.Text = "Resource";
676 this.colResource.Width = 370;
677 //
678 // colSlots
679 //
680 this.colSlots.Text = "Slots";
681 this.colSlots.Width = 47;
682 //
683 // colAccessType
684 //
685 this.colAccessType.Text = "Access Type";
686 this.colAccessType.Width = 101;
687 //
688 // DApptSearch
689 //
690 this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
691 this.CancelButton = this.cmdCancel;
692 this.ClientSize = new System.Drawing.Size(923, 501);
693 this.Controls.Add(this.groupBox2);
694 this.Controls.Add(this.groupBox1);
695 this.Controls.Add(this.pnlDescription);
696 this.Controls.Add(this.panel1);
697 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
698 this.Name = "DApptSearch";
699 this.Text = "Find Clinic Availability";
700 this.panel1.ResumeLayout(false);
701 this.panel1.PerformLayout();
702 this.pnlDescription.ResumeLayout(false);
703 this.grpDescription.ResumeLayout(false);
704 this.groupBox1.ResumeLayout(false);
705 this.groupBox1.PerformLayout();
706 this.grpDayOfWeek.ResumeLayout(false);
707 this.grpTimeOfDay.ResumeLayout(false);
708 this.groupBox2.ResumeLayout(false);
709 this.ResumeLayout(false);
710
711 }
712 #endregion
713
714 #region Event Handlers
715
716 private void cmdSearch_Click(object sender, System.EventArgs e)
717 {
718 //Tell user we are processing
719 this.Cursor = Cursors.WaitCursor;
720 this.lblMessage.Text = String.Empty;
721
722 //Get the control data into local vars
723 UpdateDialogData(false);
724 //Resource array, Begin date, Access type array, MTWTF , AM PM
725
726 //Get Availabilities and Appointments from the DB
727 //NB: m_sAmpm and m_sWeekDays don't have an effect on the M side side right now
728 m_dStart = m_dStart.Date; // move to 1200
729 m_dEnd = m_dEnd.Date.AddHours(23).AddMinutes(59).AddSeconds(59); //move to 235959
730 string sSearchInfo = "1|" + m_sAmpm + "|" + m_sWeekDays;
731 DataTable m_availTable = CGSchedLib.CreateAvailabilitySchedule(m_DocManager, m_alResources, m_dStart, m_dEnd, m_alAccessTypes, ScheduleType.Resource, sSearchInfo);
732 DataTable m_apptTable = CGSchedLib.CreateAppointmentSchedule(m_DocManager, m_alResources, m_dStart, m_dEnd);
733
734#if DEBUG
735 System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
736 stopwatch.Start();
737#endif
738 lstResultantAvailabilities = (from rowAV in m_availTable.AsEnumerable()
739
740 // Calculate the number of slots consumed in this availability by appointments
741 let slotsConsumed = (from appt in m_apptTable.AsEnumerable()
742 //If the resource is the same and the user selection overlaps, then...
743 where (rowAV.Field<string>("RESOURCE") == appt.Field<string>("RESOURCENAME")
744 && CalendarGrid.TimesOverlap(rowAV.Field<DateTime>("START_TIME"), rowAV.Field<DateTime>("END_TIME"), appt.Field<DateTime>("START_TIME"), appt.Field<DateTime>("END_TIME")))
745 // if appt starttime is before avail start time, only count against the avail starting from the availability start time
746 let startTimeToCountAgainstBlock = appt.Field<DateTime>("START_TIME") < rowAV.Field<DateTime>("START_TIME") ? rowAV.Field<DateTime>("START_TIME") : appt.Field<DateTime>("START_TIME")
747 // if appt endtime is after the avail ends, only count against the avail up to where the avail ends
748 let endTimeToCountAgainstBlock = appt.Field<DateTime>("END_TIME") > rowAV.Field<DateTime>("END_TIME") ? rowAV.Field<DateTime>("END_TIME") : appt.Field<DateTime>("END_TIME")
749 // theoretical minutes per slot for the availability
750 let minPerSlot = (rowAV.Field<DateTime>("END_TIME") - rowAV.Field<DateTime>("START_TIME")).TotalMinutes / rowAV.Field<int>("SLOTS")
751 // how many minutes does this appointment take away from the slot
752 let minPerAppt = (endTimeToCountAgainstBlock - startTimeToCountAgainstBlock).TotalMinutes
753 // how many slots the appointment takes up using this availability's scale
754 let slotsConsumed = minPerAppt / minPerSlot
755 select slotsConsumed).Sum()
756
757 // Subtract the number consumed from the original ones
758 let slotsLeft = (float)rowAV.Field<int>("SLOTS") - slotsConsumed
759 // filter by that value if it is at least one slot
760 where slotsLeft >= 1
761 // Sort by Start Time, then by Resource Name
762 orderby rowAV.Field<DateTime>("START_TIME"), rowAV.Field<string>("RESOURCE")
763 //return as a CGAvailability
764 select new CGAvailability
765 {
766 ResourceList = rowAV.Field<string>("RESOURCE"),
767 StartTime = rowAV.Field<DateTime>("START_TIME"),
768 EndTime = rowAV.Field<DateTime>("END_TIME"),
769 Slots = (int)slotsLeft,
770 // AccessTypeName is grabbed from the Access Type Table using a psuedojoin syntax.
771 // "ACCESS_TYPE" is the IEN of the AcceesType.
772 // Single or default is b/c we are expecting one result.
773 AccessTypeName = (from at in m_dsGlobal.Tables["AccessTypes"].AsEnumerable()
774 where at.Field<int>("BMXIEN")==Int32.Parse(rowAV.Field<string>("ACCESS_TYPE"))
775 select at.Field<string>("ACCESS_TYPE_NAME")).SingleOrDefault<string>(),
776 AvailabilityType = rowAV.Field<int>("AVAILABILITYID")
777 })
778 // convert to Generic List
779 .ToList<CGAvailability>();
780
781 // if specific access types are chosen, filter the results based on a join against them.
782 if (m_alAccessTypes.Count > 0)
783 lstResultantAvailabilities = (from av in lstResultantAvailabilities
784 join at in m_alAccessTypes.Cast<string>() on av.AccessTypeName equals at
785 select av).ToList<CGAvailability>();
786
787 // if user chose AM radio button, get morning appointments
788 // TimeSpan.FromHours(12) gets the number of ticks since Midnight
789 if (rdoAM.Checked) // less than 12 pm
790 {
791 lstResultantAvailabilities = (from av in lstResultantAvailabilities
792 where av.StartTime.TimeOfDay < TimeSpan.FromHours(12)
793 select av).ToList<CGAvailability>();
794 }
795 // if user chose PM radio button, get morning appointments
796 if (rdoPM.Checked) // after or equal to 12 pm
797 {
798 lstResultantAvailabilities = (from av in lstResultantAvailabilities
799 where av.StartTime.TimeOfDay >= TimeSpan.FromHours(12)
800 select av).ToList<CGAvailability>();
801 }
802
803 // if any of the days of week are checked, create a new list based on them
804 // and clear the original list, and join the new lists together
805 if (chkMon.Checked || chkTue.Checked || chkWed.Checked || chkThu.Checked || chkFri.Checked || chkSat.Checked || chkSun.Checked)
806 {
807
808 var lstMonday = new List<CGAvailability>();
809 var lstTuesday = new List<CGAvailability>();
810 var lstWednesday = new List<CGAvailability>();
811 var lstThursday = new List<CGAvailability>();
812 var lstFriday = new List<CGAvailability>();
813 var lstSaturday = new List<CGAvailability>();
814 var lstSunday = new List<CGAvailability>();
815
816 if (chkMon.Checked == true)
817 {
818 lstMonday = (from av in lstResultantAvailabilities
819 where av.StartTime.DayOfWeek == DayOfWeek.Monday
820 select av).ToList<CGAvailability>();
821 }
822
823 if (chkTue.Checked == true)
824 {
825 lstTuesday = (from av in lstResultantAvailabilities
826 where av.StartTime.DayOfWeek == DayOfWeek.Tuesday
827 select av).ToList<CGAvailability>();
828 }
829
830 if (chkWed.Checked == true)
831 {
832 lstWednesday = (from av in lstResultantAvailabilities
833 where av.StartTime.DayOfWeek == DayOfWeek.Wednesday
834 select av).ToList<CGAvailability>();
835
836 }
837
838 if (chkThu.Checked == true)
839 {
840 lstThursday = (from av in lstResultantAvailabilities
841 where av.StartTime.DayOfWeek == DayOfWeek.Thursday
842 select av).ToList<CGAvailability>();
843
844 }
845
846 if (chkFri.Checked == true)
847 {
848 lstFriday = (from av in lstResultantAvailabilities
849 where av.StartTime.DayOfWeek == DayOfWeek.Friday
850 select av).ToList<CGAvailability>();
851 }
852
853 if (chkSat.Checked == true)
854 {
855 lstSaturday = (from av in lstResultantAvailabilities
856 where av.StartTime.DayOfWeek == DayOfWeek.Saturday
857 select av).ToList<CGAvailability>();
858
859 }
860
861 if (chkSun.Checked == true)
862 {
863 lstSunday = (from av in lstResultantAvailabilities
864 where av.StartTime.DayOfWeek == DayOfWeek.Sunday
865 select av).ToList<CGAvailability>();
866
867 }
868
869
870 lstResultantAvailabilities.Clear();
871 lstResultantAvailabilities.AddRange(lstMonday);
872 lstResultantAvailabilities.AddRange(lstTuesday);
873 lstResultantAvailabilities.AddRange(lstWednesday);
874 lstResultantAvailabilities.AddRange(lstThursday);
875 lstResultantAvailabilities.AddRange(lstFriday);
876 lstResultantAvailabilities.AddRange(lstSaturday);
877 lstResultantAvailabilities.AddRange(lstSunday);
878
879 lstResultantAvailabilities.OrderBy(av => av.StartTime).ThenBy(av => av.ResourceList);
880 }
881
882
883
884#if DEBUG
885 System.Diagnostics.Debug.Write("LINQ took this long: " + stopwatch.ElapsedMilliseconds + "\n");
886 stopwatch = null;
887#endif
888
889 //Then, convert the availabilities to ListViewItems
890 var items = (from item in lstResultantAvailabilities
891 let s = new string[] {item.AvailabilityType.ToString(), item.StartTime.ToShortDateString(), item.StartTime.DayOfWeek.ToString(),item.StartTime.ToShortTimeString() ,item.EndTime.ToShortTimeString() ,item.ResourceList,item.Slots.ToString(),item.AccessTypeName}
892 let lvItem = new ListViewItem(s)
893 select lvItem).ToArray<ListViewItem>();
894
895 //--Updating Listview
896 lstResults.BeginUpdate(); //tell listview to suspend drawing for now
897 lstResults.Items.Clear(); //empty it from old data
898
899 if (items.Length > 0) lstResults.Items.AddRange(items); // add new data
900 else this.lblMessage.Text = "No available slots found!";
901
902 lstResults.EndUpdate(); // ok done adding items, draw now.
903 //--End Update Listview
904
905 //We are done
906 this.Cursor = Cursors.Default;
907 }
908
909 private void cboAccessTypeFilter_SelectionChangeCommitted(object sender, System.EventArgs e)
910 {
911 //Load Access Types listbox & filter
912 string sGroup = cboAccessTypeFilter.Text;
913 if (sGroup == "<Show All Access Types>")
914 {
915 LoadListBox("ALL");
916 }
917 else
918 {
919 LoadListBox("SELECTED");
920 }
921
922 }
923
924
925 private void lstResults_DoubleClick(object sender, EventArgs e)
926 {
927 ProcessChoice(sender, e);
928 }
929
930 private void btnAccept_Click(object sender, EventArgs e)
931 {
932 ProcessChoice(sender, e);
933 }
934
935 /// <summary>
936 /// Shared method to process a user's choice
937 /// </summary>
938 /// <param name="s">sender</param>
939 /// <param name="e">EventArgs</param>
940 private void ProcessChoice(object s, EventArgs e)
941 {
942 if (lstResults.SelectedIndices.Count == 0)
943 {
944 this.DialogResult = DialogResult.None;
945 lblMessage.Text = "No slot selected!";
946 return;
947 }
948
949 int availabilityKey = Int32.Parse(lstResults.SelectedItems[0].SubItems[0].Text);
950 _selectedAvailability = (from av in lstResultantAvailabilities
951 where av.AvailabilityType == availabilityKey
952 select av).Single<CGAvailability>();
953 this.DialogResult = DialogResult.OK;
954 }
955
956 /// <summary>
957 /// Adjust start date based on end date.
958 /// </summary>
959 /// <param name="sender"></param>
960 /// <param name="e"></param>
961 private void dtStart_ValueChanged(object sender, EventArgs e)
962 {
963 if (dtEnd.Value < dtStart.Value) dtEnd.Value = dtStart.Value;
964 }
965
966 /// <summary>
967 /// Adjust end date based on start date.
968 /// </summary>
969 /// <param name="sender"></param>
970 /// <param name="e"></param>
971 private void dtEnd_ValueChanged(object sender, EventArgs e)
972 {
973 if (dtStart.Value > dtEnd.Value) dtStart.Value = dtEnd.Value;
974 }
975
976 #endregion Event Handlers
977
978 #region Properties
979
980 /// <summary>
981 /// Gets the Availability Selected by the User in which to put an appointment
982 /// </summary>
983 public CGAvailability SelectedAvailability
984 {
985 get { return this._selectedAvailability; }
986 }
987
988 #endregion Properties
989
990
991 }
992}
Note: See TracBrowser for help on using the repository browser.