source: Scheduling/trunk/cs/bsdx0200GUISourceCode/CGView.cs@ 1511

Last change on this file since 1511 was 1511, checked in by Sam Habiel, 12 years ago

Fixed AddAppointmentEnabled to check for the presence of resources in a resource group; otherwise you are given the ability to make an appointment on the resource group itself which causes a crash. Fixes bug EHS#000342.

File size: 148.8 KB
RevLine 
[614]1using System;
2using System.Collections;
[1174]3using System.Collections.Generic;
[614]4using System.ComponentModel;
5using System.Windows.Forms;
6using System.Diagnostics;
7using System.Data;
8using System.Threading;
9using IndianHealthService.BMXNet;
[1073]10using System.Runtime.InteropServices;
[1110]11using System.Drawing.Printing;
[1112]12using System.Linq;
[614]13
14namespace IndianHealthService.ClinicalScheduling
15{
16 /// <summary>
[1069]17 /// Main Form: Shows Tree of Clinics and Calendar Grid
[614]18 /// </summary>
19 public class CGView : System.Windows.Forms.Form
20 {
21 private System.Windows.Forms.MainMenu mainMenu1;
22 private System.Windows.Forms.MenuItem mnuFile;
23 private System.Windows.Forms.MenuItem mnuTest;
24 private System.Windows.Forms.MenuItem mnuAppointment;
25 private System.Windows.Forms.MenuItem mnuNewAppointment;
26 private System.Windows.Forms.MenuItem mnu1Day;
27 private System.Windows.Forms.MenuItem mnu7Day;
28 private System.Windows.Forms.MenuItem menuItem4;
29 private System.Windows.Forms.MenuItem mnu5Day;
30 private System.Windows.Forms.MenuItem mnu10Minute;
31 private System.Windows.Forms.MenuItem mnu20Minute;
32 private System.Windows.Forms.MenuItem mnu30Minute;
33 private System.Windows.Forms.MenuItem mnuTimeScale;
34 private System.Windows.Forms.MenuItem mnu15Minute;
35 private System.Windows.Forms.MenuItem mnuOpenSchedule;
36 private System.Windows.Forms.MenuItem menuItem1;
37 private System.Windows.Forms.TreeView tvSchedules;
38 private System.Windows.Forms.MenuItem mnuViewScheduleTree;
39 private System.Windows.Forms.MenuItem mnuDeleteAppointment;
40 private System.Windows.Forms.MenuItem mnuTest1;
41 private System.Windows.Forms.Splitter splitter1;
42 private System.Windows.Forms.Splitter splitter2;
43 private System.Windows.Forms.StatusBar statusBar1;
44 private System.Windows.Forms.DateTimePicker dateTimePicker1;
45 private System.Windows.Forms.MenuItem mnuViewRightPanel;
46 private System.Windows.Forms.Panel panelRight;
47 private System.Windows.Forms.Panel panelTop;
48 private System.Windows.Forms.Panel panelCenter;
49 private System.Windows.Forms.Panel panelBottom;
50 private System.Windows.Forms.Label lblResource;
[1174]51 private System.Windows.Forms.ContextMenu ctxResourceTree;
[614]52 private System.Windows.Forms.MenuItem ctxOpenSchedule;
53 private System.Windows.Forms.MenuItem ctxEditAvailability;
54 private System.Windows.Forms.MenuItem ctxProperties;
55 private System.Windows.Forms.MenuItem mnuSchedulingManagment;
56 private System.Windows.Forms.MenuItem ctxFindAppt;
57 private System.Windows.Forms.MenuItem mnuFindAppt;
58 internal System.Windows.Forms.MenuItem mnuRPMSServer;
59 internal System.Windows.Forms.MenuItem mnuRPMSLogin;
60 private System.Windows.Forms.MenuItem mnuCheckIn;
61 private System.Windows.Forms.MenuItem menuItem3;
62 private System.Windows.Forms.MenuItem mnuHelpAbout;
63 private System.Windows.Forms.MenuItem mnuCalendar;
64 private System.Windows.Forms.MenuItem mnuHelp;
65 private System.Windows.Forms.MenuItem mnuClose;
66 private System.Windows.Forms.MenuItem mnuViewPatientAppts;
67 private IndianHealthService.ClinicalScheduling.CalendarGrid calendarGrid1;
68 private System.Windows.Forms.MenuItem mnuCopyAppointment;
69 private System.Windows.Forms.Panel panelClip;
70 private System.Windows.Forms.ListBox lstClip;
71 private System.Windows.Forms.Label label1;
72 private System.Windows.Forms.ContextMenu ctxApptClipMenu;
73 private System.Windows.Forms.MenuItem mnuRemoveClipItem;
74 private System.Windows.Forms.MenuItem mnuClearClipItems;
75 private System.Windows.Forms.MenuItem mnuEditAppointment;
76 private System.Windows.Forms.ContextMenu ctxCalendarGrid;
77 private System.Windows.Forms.MenuItem ctxCalGridAdd;
78 private System.Windows.Forms.MenuItem ctxCalGridEdit;
79 private System.Windows.Forms.MenuItem ctxCalGridDelete;
80 private System.Windows.Forms.MenuItem ctxCalGridCheckIn;
81 private System.Windows.Forms.MenuItem menuItem6;
82 private System.Windows.Forms.MenuItem menuItem7;
[788]83 private System.Windows.Forms.MenuItem mnuPrintReminderLetters;
[614]84 private System.Windows.Forms.MenuItem mnuPrintPatientLetter;
85 private System.Windows.Forms.MenuItem mnuPrintClinicSchedules;
86 private System.Windows.Forms.MenuItem ctxCalGridNoShow;
87 private System.Windows.Forms.MenuItem ctxCalGridNoShowUndo;
88 private System.Windows.Forms.MenuItem mnuNoShow;
89 private System.Windows.Forms.MenuItem mnuNoShowUndo;
90 private System.Windows.Forms.MenuItem mnuPrintRebookLetters;
91 private System.Windows.Forms.MenuItem mnuPrintCancellationLetters;
92 private System.Windows.Forms.MenuItem mnuWalkIn;
[1174]93 private System.Windows.Forms.MenuItem sepApptMenu1;
94 private System.Windows.Forms.MenuItem sepApptMenu2;
[614]95 private System.Windows.Forms.MenuItem ctxCalGridWalkin;
[1174]96 private System.Windows.Forms.MenuItem ctxCalGridSep1;
97 private System.Windows.Forms.MenuItem ctxCalGridSep2;
[614]98 private System.Windows.Forms.MenuItem mnuOpenMultipleSchedules;
99 private System.Windows.Forms.MenuItem mnuDisplayWalkIns;
100 private System.Windows.Forms.MenuItem mnuRPMSDivision;
[1174]101 private MenuItem ctxCalGridSep3;
[1110]102 private MenuItem ctxCalGridReprintApptSlip;
[1118]103 private MenuItem ctxCalGridUndoCheckin;
104 private MenuItem ctxPrintScheduleT0;
105 private MenuItem ctxPrintScheduleT1;
106 private MenuItem ctxPrintScheduleT3;
[1127]107 private MenuItem menuItem12;
108 private MenuItem mnuRefresh;
[1174]109 private MenuItem ctxCalGridMkRadAppt;
110 private MenuItem ctxCalGridCancelRadAppt;
111 private MenuItem mnuMkRadAppt;
112 private MenuItem mnuCancelRadAppt;
113 private MenuItem mnuUndoCheckin;
114 private MenuItem sepApptMenu3;
115 private MenuItem mnuReprintApptSlip;
[1474]116 private MenuItem mnuViewBrokerLog;
[614]117 private IContainer components;
118
119 #region Initialization
120 public CGView()
121 {
122 //
123 // Required for Windows Form Designer support
124 //
125 InitializeComponent();
126
127 m_nSlots = 0;
128 m_alSelectedTreeResourceArray = new ArrayList();
129 m_ClipList = new CGAppointments();
130
131 }
132
133 public void InitializeDocView(string sText)
134 {
[1474]135 this.Text = CGDocumentManager.Current.RemoteSession.User.Name;
[614]136 if (sText != null)
137 this.Text += " - " + sText;
[1474]138 if (CGDocumentManager.Current.RemoteSession.User.Division.Name != null)
139 this.Text += " - " + CGDocumentManager.Current.RemoteSession.User.Division.Name;
[614]140 }
141
142 public void InitializeDocView(CGDocument doc,
143 CGDocumentManager docMgr,
144 DateTime dStartDate,
145 string sText)
146 {
147 System.IntPtr pHandle = this.Handle;
148 this.DocManager = docMgr;
149 this.StartDate = dStartDate;
150 this.Document = doc;
[1073]151
152 //Rather strangely, this line is needed for God knows Why...
153 //Without it, the Grid tries to draw appointments, but can't.
154 //Making a constructor in the Calendar Grid itself didn't work. Don't know why.
155 //XXX: For later investigation.
156 this.Appointments = new CGAppointments();
157
158
[821]159 // Set username and division up top
[1474]160 this.Text = CGDocumentManager.Current.RemoteSession.User.Name;
[614]161 if (sText != null)
162 this.Text += " - " + sText;
[1474]163 if (CGDocumentManager.Current.RemoteSession.User.Division.Name != null)
164 this.Text += " - " + CGDocumentManager.Current.RemoteSession.User.Division.Name;
[614]165
[1474]166 CGDocumentManager.Current.RemoteSession.EventServices.RpmsEvent += BMXNetEventHandler;
[614]167 }
[1073]168
[614]169
170 #endregion initialization
171
172 #region Windows Form Designer generated code
173 /// <summary>
174 /// Required method for Designer support - do not modify
175 /// the contents of this method with the code editor.
176 /// </summary>
177 private void InitializeComponent()
178 {
179 this.components = new System.ComponentModel.Container();
180 System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CGView));
181 this.mainMenu1 = new System.Windows.Forms.MainMenu(this.components);
182 this.mnuFile = new System.Windows.Forms.MenuItem();
183 this.mnuOpenSchedule = new System.Windows.Forms.MenuItem();
184 this.mnuOpenMultipleSchedules = new System.Windows.Forms.MenuItem();
185 this.menuItem1 = new System.Windows.Forms.MenuItem();
186 this.mnuRPMSServer = new System.Windows.Forms.MenuItem();
187 this.mnuRPMSLogin = new System.Windows.Forms.MenuItem();
188 this.mnuRPMSDivision = new System.Windows.Forms.MenuItem();
189 this.menuItem3 = new System.Windows.Forms.MenuItem();
190 this.mnuSchedulingManagment = new System.Windows.Forms.MenuItem();
191 this.menuItem6 = new System.Windows.Forms.MenuItem();
192 this.mnuPrintClinicSchedules = new System.Windows.Forms.MenuItem();
[788]193 this.mnuPrintReminderLetters = new System.Windows.Forms.MenuItem();
[614]194 this.mnuPrintRebookLetters = new System.Windows.Forms.MenuItem();
195 this.mnuPrintCancellationLetters = new System.Windows.Forms.MenuItem();
196 this.mnuPrintPatientLetter = new System.Windows.Forms.MenuItem();
197 this.menuItem7 = new System.Windows.Forms.MenuItem();
198 this.mnuClose = new System.Windows.Forms.MenuItem();
199 this.mnuAppointment = new System.Windows.Forms.MenuItem();
200 this.mnuNewAppointment = new System.Windows.Forms.MenuItem();
[1174]201 this.mnuWalkIn = new System.Windows.Forms.MenuItem();
202 this.mnuMkRadAppt = new System.Windows.Forms.MenuItem();
[614]203 this.mnuEditAppointment = new System.Windows.Forms.MenuItem();
204 this.mnuDeleteAppointment = new System.Windows.Forms.MenuItem();
[1174]205 this.mnuCancelRadAppt = new System.Windows.Forms.MenuItem();
206 this.sepApptMenu1 = new System.Windows.Forms.MenuItem();
[614]207 this.mnuNoShow = new System.Windows.Forms.MenuItem();
208 this.mnuNoShowUndo = new System.Windows.Forms.MenuItem();
[1174]209 this.sepApptMenu2 = new System.Windows.Forms.MenuItem();
210 this.mnuCheckIn = new System.Windows.Forms.MenuItem();
211 this.mnuUndoCheckin = new System.Windows.Forms.MenuItem();
212 this.sepApptMenu3 = new System.Windows.Forms.MenuItem();
213 this.mnuFindAppt = new System.Windows.Forms.MenuItem();
[614]214 this.mnuCopyAppointment = new System.Windows.Forms.MenuItem();
215 this.mnuViewPatientAppts = new System.Windows.Forms.MenuItem();
[1174]216 this.mnuReprintApptSlip = new System.Windows.Forms.MenuItem();
[614]217 this.mnuCalendar = new System.Windows.Forms.MenuItem();
218 this.mnuDisplayWalkIns = new System.Windows.Forms.MenuItem();
219 this.mnu1Day = new System.Windows.Forms.MenuItem();
220 this.mnu5Day = new System.Windows.Forms.MenuItem();
221 this.mnu7Day = new System.Windows.Forms.MenuItem();
222 this.menuItem4 = new System.Windows.Forms.MenuItem();
223 this.mnuTimeScale = new System.Windows.Forms.MenuItem();
224 this.mnu10Minute = new System.Windows.Forms.MenuItem();
225 this.mnu15Minute = new System.Windows.Forms.MenuItem();
226 this.mnu20Minute = new System.Windows.Forms.MenuItem();
227 this.mnu30Minute = new System.Windows.Forms.MenuItem();
228 this.mnuViewScheduleTree = new System.Windows.Forms.MenuItem();
229 this.mnuViewRightPanel = new System.Windows.Forms.MenuItem();
[1127]230 this.menuItem12 = new System.Windows.Forms.MenuItem();
231 this.mnuRefresh = new System.Windows.Forms.MenuItem();
[614]232 this.mnuHelp = new System.Windows.Forms.MenuItem();
233 this.mnuHelpAbout = new System.Windows.Forms.MenuItem();
[1474]234 this.mnuViewBrokerLog = new System.Windows.Forms.MenuItem();
[614]235 this.mnuTest = new System.Windows.Forms.MenuItem();
236 this.mnuTest1 = new System.Windows.Forms.MenuItem();
237 this.tvSchedules = new System.Windows.Forms.TreeView();
[1174]238 this.ctxResourceTree = new System.Windows.Forms.ContextMenu();
[614]239 this.ctxOpenSchedule = new System.Windows.Forms.MenuItem();
240 this.ctxEditAvailability = new System.Windows.Forms.MenuItem();
241 this.ctxProperties = new System.Windows.Forms.MenuItem();
242 this.ctxFindAppt = new System.Windows.Forms.MenuItem();
[1118]243 this.ctxPrintScheduleT0 = new System.Windows.Forms.MenuItem();
244 this.ctxPrintScheduleT1 = new System.Windows.Forms.MenuItem();
[1124]245 this.ctxPrintScheduleT3 = new System.Windows.Forms.MenuItem();
[614]246 this.panelRight = new System.Windows.Forms.Panel();
247 this.panelClip = new System.Windows.Forms.Panel();
248 this.lstClip = new System.Windows.Forms.ListBox();
249 this.ctxApptClipMenu = new System.Windows.Forms.ContextMenu();
250 this.mnuRemoveClipItem = new System.Windows.Forms.MenuItem();
251 this.mnuClearClipItems = new System.Windows.Forms.MenuItem();
252 this.label1 = new System.Windows.Forms.Label();
253 this.panelTop = new System.Windows.Forms.Panel();
254 this.dateTimePicker1 = new System.Windows.Forms.DateTimePicker();
255 this.lblResource = new System.Windows.Forms.Label();
256 this.panelCenter = new System.Windows.Forms.Panel();
[1176]257 this.calendarGrid1 = new IndianHealthService.ClinicalScheduling.CalendarGrid();
[614]258 this.ctxCalendarGrid = new System.Windows.Forms.ContextMenu();
259 this.ctxCalGridAdd = new System.Windows.Forms.MenuItem();
[1174]260 this.ctxCalGridMkRadAppt = new System.Windows.Forms.MenuItem();
[614]261 this.ctxCalGridEdit = new System.Windows.Forms.MenuItem();
262 this.ctxCalGridDelete = new System.Windows.Forms.MenuItem();
[1174]263 this.ctxCalGridCancelRadAppt = new System.Windows.Forms.MenuItem();
[614]264 this.ctxCalGridCheckIn = new System.Windows.Forms.MenuItem();
[1118]265 this.ctxCalGridUndoCheckin = new System.Windows.Forms.MenuItem();
[1174]266 this.ctxCalGridSep1 = new System.Windows.Forms.MenuItem();
[614]267 this.ctxCalGridNoShow = new System.Windows.Forms.MenuItem();
268 this.ctxCalGridNoShowUndo = new System.Windows.Forms.MenuItem();
[1174]269 this.ctxCalGridSep2 = new System.Windows.Forms.MenuItem();
[614]270 this.ctxCalGridWalkin = new System.Windows.Forms.MenuItem();
[1174]271 this.ctxCalGridSep3 = new System.Windows.Forms.MenuItem();
[1110]272 this.ctxCalGridReprintApptSlip = new System.Windows.Forms.MenuItem();
[614]273 this.panelBottom = new System.Windows.Forms.Panel();
274 this.statusBar1 = new System.Windows.Forms.StatusBar();
275 this.splitter1 = new System.Windows.Forms.Splitter();
276 this.splitter2 = new System.Windows.Forms.Splitter();
277 this.panelRight.SuspendLayout();
278 this.panelClip.SuspendLayout();
279 this.panelTop.SuspendLayout();
280 this.panelCenter.SuspendLayout();
281 this.panelBottom.SuspendLayout();
282 this.SuspendLayout();
283 //
284 // mainMenu1
285 //
286 this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
287 this.mnuFile,
288 this.mnuAppointment,
289 this.mnuCalendar,
290 this.mnuHelp,
291 this.mnuTest});
292 //
293 // mnuFile
294 //
295 this.mnuFile.Index = 0;
296 this.mnuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
297 this.mnuOpenSchedule,
298 this.mnuOpenMultipleSchedules,
299 this.menuItem1,
300 this.mnuRPMSServer,
301 this.mnuRPMSLogin,
302 this.mnuRPMSDivision,
303 this.menuItem3,
304 this.mnuSchedulingManagment,
305 this.menuItem6,
306 this.mnuPrintClinicSchedules,
[788]307 this.mnuPrintReminderLetters,
[614]308 this.mnuPrintRebookLetters,
309 this.mnuPrintCancellationLetters,
310 this.mnuPrintPatientLetter,
311 this.menuItem7,
312 this.mnuClose});
313 this.mnuFile.Text = "&File";
314 this.mnuFile.Popup += new System.EventHandler(this.mnuFile_Popup);
315 //
316 // mnuOpenSchedule
317 //
318 this.mnuOpenSchedule.Enabled = false;
319 this.mnuOpenSchedule.Index = 0;
320 this.mnuOpenSchedule.Text = "&Open Schedule";
321 this.mnuOpenSchedule.Visible = false;
322 this.mnuOpenSchedule.Click += new System.EventHandler(this.mnuOpenSchedule_Click);
323 //
324 // mnuOpenMultipleSchedules
325 //
326 this.mnuOpenMultipleSchedules.Index = 1;
[794]327 this.mnuOpenMultipleSchedules.Shortcut = System.Windows.Forms.Shortcut.CtrlM;
[614]328 this.mnuOpenMultipleSchedules.Text = "Open M&ultiple Schedules";
329 this.mnuOpenMultipleSchedules.Click += new System.EventHandler(this.mnuOpenMultipleSchedules_Click);
330 //
331 // menuItem1
332 //
333 this.menuItem1.Index = 2;
334 this.menuItem1.Text = "-";
335 //
336 // mnuRPMSServer
337 //
338 this.mnuRPMSServer.Index = 3;
[1071]339 this.mnuRPMSServer.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftS;
[627]340 this.mnuRPMSServer.Text = "Change VistA &Server";
[614]341 this.mnuRPMSServer.Click += new System.EventHandler(this.mnuRPMSServer_Click);
342 //
343 // mnuRPMSLogin
344 //
345 this.mnuRPMSLogin.Index = 4;
[1071]346 this.mnuRPMSLogin.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftL;
[627]347 this.mnuRPMSLogin.Text = "Change VistA &Login";
[614]348 this.mnuRPMSLogin.Click += new System.EventHandler(this.mnuRPMSLogin_Click);
349 //
350 // mnuRPMSDivision
351 //
352 this.mnuRPMSDivision.Index = 5;
[1071]353 this.mnuRPMSDivision.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftD;
[627]354 this.mnuRPMSDivision.Text = "Change VistA &Division";
[614]355 this.mnuRPMSDivision.Click += new System.EventHandler(this.mnuRPMSDivision_Click);
356 //
357 // menuItem3
358 //
359 this.menuItem3.Index = 6;
360 this.menuItem3.Text = "-";
361 //
362 // mnuSchedulingManagment
363 //
364 this.mnuSchedulingManagment.Index = 7;
[788]365 this.mnuSchedulingManagment.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftM;
[614]366 this.mnuSchedulingManagment.Text = "Scheduling &Management";
367 this.mnuSchedulingManagment.Click += new System.EventHandler(this.mnuSchedulingManagment_Click);
368 //
369 // menuItem6
370 //
371 this.menuItem6.Index = 8;
372 this.menuItem6.Text = "-";
373 //
374 // mnuPrintClinicSchedules
375 //
376 this.mnuPrintClinicSchedules.Index = 9;
[772]377 this.mnuPrintClinicSchedules.Shortcut = System.Windows.Forms.Shortcut.CtrlP;
[614]378 this.mnuPrintClinicSchedules.Text = "&Print Clinic Schedules";
379 this.mnuPrintClinicSchedules.Click += new System.EventHandler(this.mnuPrintClinicSchedules_Click);
380 //
[788]381 // mnuPrintReminderLetters
[614]382 //
[788]383 this.mnuPrintReminderLetters.Index = 10;
[1174]384 this.mnuPrintReminderLetters.Shortcut = System.Windows.Forms.Shortcut.CtrlE;
[788]385 this.mnuPrintReminderLetters.Text = "Print Rem&inder Letters";
386 this.mnuPrintReminderLetters.Click += new System.EventHandler(this.mnuPrintReminderLetters_Click);
[614]387 //
388 // mnuPrintRebookLetters
389 //
390 this.mnuPrintRebookLetters.Index = 11;
[850]391 this.mnuPrintRebookLetters.Shortcut = System.Windows.Forms.Shortcut.CtrlR;
[614]392 this.mnuPrintRebookLetters.Text = "Print &Rebook Letters";
393 this.mnuPrintRebookLetters.Click += new System.EventHandler(this.mnuPrintRebookLetters_Click);
394 //
395 // mnuPrintCancellationLetters
396 //
397 this.mnuPrintCancellationLetters.Index = 12;
[788]398 this.mnuPrintCancellationLetters.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftC;
[614]399 this.mnuPrintCancellationLetters.Text = "Print C&ancellation Letters";
400 this.mnuPrintCancellationLetters.Click += new System.EventHandler(this.mnuPrintCancellationLetters_Click);
401 //
402 // mnuPrintPatientLetter
403 //
404 this.mnuPrintPatientLetter.Index = 13;
[789]405 this.mnuPrintPatientLetter.Shortcut = System.Windows.Forms.Shortcut.CtrlL;
[614]406 this.mnuPrintPatientLetter.Text = "Print Patient Le&tter";
407 this.mnuPrintPatientLetter.Click += new System.EventHandler(this.mnuPrintPatientLetter_Click);
408 //
409 // menuItem7
410 //
411 this.menuItem7.Index = 14;
412 this.menuItem7.Text = "-";
413 //
414 // mnuClose
415 //
416 this.mnuClose.Index = 15;
[789]417 this.mnuClose.Shortcut = System.Windows.Forms.Shortcut.CtrlW;
[614]418 this.mnuClose.Text = "&Close Schedule";
419 this.mnuClose.Click += new System.EventHandler(this.mnuClose_Click);
420 //
421 // mnuAppointment
422 //
423 this.mnuAppointment.Index = 1;
424 this.mnuAppointment.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
425 this.mnuNewAppointment,
[1174]426 this.mnuWalkIn,
427 this.mnuMkRadAppt,
[614]428 this.mnuEditAppointment,
429 this.mnuDeleteAppointment,
[1174]430 this.mnuCancelRadAppt,
431 this.sepApptMenu1,
[614]432 this.mnuNoShow,
433 this.mnuNoShowUndo,
[1174]434 this.sepApptMenu2,
435 this.mnuCheckIn,
436 this.mnuUndoCheckin,
437 this.sepApptMenu3,
438 this.mnuFindAppt,
[614]439 this.mnuCopyAppointment,
[1174]440 this.mnuViewPatientAppts,
441 this.mnuReprintApptSlip});
[614]442 this.mnuAppointment.Text = "&Appointment";
443 this.mnuAppointment.Popup += new System.EventHandler(this.mnuAppointment_Popup);
444 //
445 // mnuNewAppointment
446 //
447 this.mnuNewAppointment.Index = 0;
[1143]448 this.mnuNewAppointment.Shortcut = System.Windows.Forms.Shortcut.Ins;
[614]449 this.mnuNewAppointment.Text = "&New Appointment";
450 this.mnuNewAppointment.Click += new System.EventHandler(this.mnuNewAppointment_Click);
451 //
[1174]452 // mnuWalkIn
453 //
454 this.mnuWalkIn.Index = 1;
455 this.mnuWalkIn.Shortcut = System.Windows.Forms.Shortcut.ShiftIns;
456 this.mnuWalkIn.Text = "Create Wal&k-In Appointment";
457 this.mnuWalkIn.Click += new System.EventHandler(this.mnuWalkIn_Click);
458 //
459 // mnuMkRadAppt
460 //
461 this.mnuMkRadAppt.Index = 2;
462 this.mnuMkRadAppt.Shortcut = System.Windows.Forms.Shortcut.CtrlIns;
463 this.mnuMkRadAppt.Text = "Make Radiology Appointment";
464 this.mnuMkRadAppt.Click += new System.EventHandler(this.mnuMkRadAppt_Click);
465 //
[614]466 // mnuEditAppointment
467 //
[1174]468 this.mnuEditAppointment.Index = 3;
[1143]469 this.mnuEditAppointment.Shortcut = System.Windows.Forms.Shortcut.F2;
[614]470 this.mnuEditAppointment.Text = "&Edit Appointment";
471 this.mnuEditAppointment.Click += new System.EventHandler(this.mnuEditAppointment_Click);
472 //
473 // mnuDeleteAppointment
474 //
[1174]475 this.mnuDeleteAppointment.Index = 4;
[1143]476 this.mnuDeleteAppointment.Shortcut = System.Windows.Forms.Shortcut.Del;
[614]477 this.mnuDeleteAppointment.Text = "Cance&l Appointment";
478 this.mnuDeleteAppointment.Click += new System.EventHandler(this.mnuDeleteAppointment_Click);
479 //
[1174]480 // mnuCancelRadAppt
[614]481 //
[1174]482 this.mnuCancelRadAppt.Index = 5;
483 this.mnuCancelRadAppt.Shortcut = System.Windows.Forms.Shortcut.CtrlDel;
484 this.mnuCancelRadAppt.Text = "Cancel Radiology Appointment";
485 this.mnuCancelRadAppt.Click += new System.EventHandler(this.mnuCancelRadAppt_Click);
[614]486 //
[1174]487 // sepApptMenu1
488 //
489 this.sepApptMenu1.Index = 6;
490 this.sepApptMenu1.Text = "-";
491 //
[614]492 // mnuNoShow
493 //
[1174]494 this.mnuNoShow.Index = 7;
495 this.mnuNoShow.Shortcut = System.Windows.Forms.Shortcut.CtrlN;
[614]496 this.mnuNoShow.Text = "Mark as No Sho&w";
497 this.mnuNoShow.Click += new System.EventHandler(this.mnuNoShow_Click);
498 //
499 // mnuNoShowUndo
500 //
[1174]501 this.mnuNoShowUndo.Index = 8;
502 this.mnuNoShowUndo.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftN;
[614]503 this.mnuNoShowUndo.Text = "&Undo No Show";
504 this.mnuNoShowUndo.Click += new System.EventHandler(this.mnuNoShowUndo_Click);
505 //
[1174]506 // sepApptMenu2
[614]507 //
[1174]508 this.sepApptMenu2.Index = 9;
509 this.sepApptMenu2.Text = "-";
[614]510 //
[1174]511 // mnuCheckIn
[614]512 //
[1174]513 this.mnuCheckIn.Index = 10;
514 this.mnuCheckIn.Shortcut = System.Windows.Forms.Shortcut.CtrlI;
515 this.mnuCheckIn.Text = "Check &In Patient";
516 this.mnuCheckIn.Click += new System.EventHandler(this.mnuCheckIn_Click);
[614]517 //
[1174]518 // mnuUndoCheckin
[614]519 //
[1174]520 this.mnuUndoCheckin.Index = 11;
521 this.mnuUndoCheckin.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftI;
522 this.mnuUndoCheckin.Text = "Undo Checkin";
523 this.mnuUndoCheckin.Click += new System.EventHandler(this.mnuUndoCheckin_Click);
[614]524 //
[1174]525 // sepApptMenu3
526 //
527 this.sepApptMenu3.Index = 12;
528 this.sepApptMenu3.Text = "-";
529 //
[614]530 // mnuFindAppt
531 //
[1174]532 this.mnuFindAppt.Index = 13;
[1124]533 this.mnuFindAppt.Shortcut = System.Windows.Forms.Shortcut.CtrlF;
[1143]534 this.mnuFindAppt.Text = "&Find Empty Slots";
[614]535 this.mnuFindAppt.Click += new System.EventHandler(this.mnuFindAppt_Click);
536 //
[1174]537 // mnuCopyAppointment
[614]538 //
[1174]539 this.mnuCopyAppointment.Index = 14;
540 this.mnuCopyAppointment.Shortcut = System.Windows.Forms.Shortcut.CtrlC;
541 this.mnuCopyAppointment.Text = "&Copy Appointment to Clipboard";
542 this.mnuCopyAppointment.Click += new System.EventHandler(this.mnuCopyAppointment_Click);
[614]543 //
544 // mnuViewPatientAppts
545 //
[1174]546 this.mnuViewPatientAppts.Index = 15;
547 this.mnuViewPatientAppts.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftZ;
[614]548 this.mnuViewPatientAppts.Text = "&View Patient Appointments";
549 this.mnuViewPatientAppts.Click += new System.EventHandler(this.mnuViewPatientAppts_Click);
550 //
[1174]551 // mnuReprintApptSlip
552 //
553 this.mnuReprintApptSlip.Index = 16;
554 this.mnuReprintApptSlip.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftP;
555 this.mnuReprintApptSlip.Text = "Reprint Appointment Slip";
556 this.mnuReprintApptSlip.Click += new System.EventHandler(this.mnuReprintApptSlip_Click);
557 //
[614]558 // mnuCalendar
559 //
560 this.mnuCalendar.Index = 2;
561 this.mnuCalendar.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
562 this.mnuDisplayWalkIns,
563 this.mnu1Day,
564 this.mnu5Day,
565 this.mnu7Day,
566 this.menuItem4,
567 this.mnuTimeScale,
568 this.mnuViewScheduleTree,
[1127]569 this.mnuViewRightPanel,
570 this.menuItem12,
571 this.mnuRefresh});
[614]572 this.mnuCalendar.Text = "&View";
573 //
574 // mnuDisplayWalkIns
575 //
576 this.mnuDisplayWalkIns.Checked = true;
577 this.mnuDisplayWalkIns.Index = 0;
[1174]578 this.mnuDisplayWalkIns.Shortcut = System.Windows.Forms.Shortcut.F12;
[614]579 this.mnuDisplayWalkIns.Text = "&Display Walk-Ins";
580 this.mnuDisplayWalkIns.Click += new System.EventHandler(this.mnuDisplayWalkIns_Click);
581 //
582 // mnu1Day
583 //
584 this.mnu1Day.Index = 1;
[794]585 this.mnu1Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl1;
[614]586 this.mnu1Day.Text = "&1-Day View";
587 this.mnu1Day.Click += new System.EventHandler(this.mnu1Day_Click);
588 //
589 // mnu5Day
590 //
591 this.mnu5Day.Index = 2;
[794]592 this.mnu5Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl5;
[614]593 this.mnu5Day.Text = "&5-Day View";
594 this.mnu5Day.Click += new System.EventHandler(this.mnu5Day_Click);
595 //
596 // mnu7Day
597 //
598 this.mnu7Day.Index = 3;
[794]599 this.mnu7Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl7;
[614]600 this.mnu7Day.Text = "&7-Day View";
601 this.mnu7Day.Click += new System.EventHandler(this.mnu7Day_Click);
602 //
603 // menuItem4
604 //
605 this.menuItem4.Index = 4;
606 this.menuItem4.Text = "-";
607 //
608 // mnuTimeScale
609 //
610 this.mnuTimeScale.Index = 5;
611 this.mnuTimeScale.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
612 this.mnu10Minute,
613 this.mnu15Minute,
614 this.mnu20Minute,
615 this.mnu30Minute});
616 this.mnuTimeScale.Text = "&Time Scale";
617 //
618 // mnu10Minute
619 //
[1124]620 this.mnu10Minute.Enabled = false;
[614]621 this.mnu10Minute.Index = 0;
[794]622 this.mnu10Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl0;
[614]623 this.mnu10Minute.Text = "&10-Minute";
624 this.mnu10Minute.Click += new System.EventHandler(this.mnu10Minute_Click);
625 //
626 // mnu15Minute
627 //
[1124]628 this.mnu15Minute.Enabled = false;
[614]629 this.mnu15Minute.Index = 1;
[794]630 this.mnu15Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl4;
[614]631 this.mnu15Minute.Text = "1&5-Minute";
632 this.mnu15Minute.Click += new System.EventHandler(this.mnu15Minute_Click);
633 //
634 // mnu20Minute
635 //
[1124]636 this.mnu20Minute.Enabled = false;
[614]637 this.mnu20Minute.Index = 2;
[794]638 this.mnu20Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl3;
[614]639 this.mnu20Minute.Text = "&20-Minute";
640 this.mnu20Minute.Click += new System.EventHandler(this.mnu20Minute_Click);
641 //
642 // mnu30Minute
643 //
[1124]644 this.mnu30Minute.Enabled = false;
[614]645 this.mnu30Minute.Index = 3;
[794]646 this.mnu30Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl2;
[614]647 this.mnu30Minute.Text = "&30-Minute";
648 this.mnu30Minute.Click += new System.EventHandler(this.mnu30Minute_Click);
649 //
650 // mnuViewScheduleTree
651 //
[1174]652 this.mnuViewScheduleTree.Checked = true;
[614]653 this.mnuViewScheduleTree.Index = 6;
[1174]654 this.mnuViewScheduleTree.Shortcut = System.Windows.Forms.Shortcut.F4;
[614]655 this.mnuViewScheduleTree.Text = "&Schedule Tree";
656 this.mnuViewScheduleTree.Click += new System.EventHandler(this.mnuViewScheduleTree_Click);
657 //
658 // mnuViewRightPanel
659 //
660 this.mnuViewRightPanel.Index = 7;
661 this.mnuViewRightPanel.Text = "&Appointment Clipboard";
662 this.mnuViewRightPanel.Click += new System.EventHandler(this.mnuViewRightPanel_Click);
663 //
[1127]664 // menuItem12
665 //
666 this.menuItem12.Index = 8;
667 this.menuItem12.Text = "-";
668 //
669 // mnuRefresh
670 //
671 this.mnuRefresh.Index = 9;
672 this.mnuRefresh.Shortcut = System.Windows.Forms.Shortcut.F5;
673 this.mnuRefresh.Text = "Refresh Data";
674 this.mnuRefresh.Click += new System.EventHandler(this.mnuRefresh_Click);
675 //
[614]676 // mnuHelp
677 //
678 this.mnuHelp.Index = 3;
679 this.mnuHelp.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
[1474]680 this.mnuHelpAbout,
681 this.mnuViewBrokerLog});
[614]682 this.mnuHelp.Text = "&Help";
683 //
684 // mnuHelpAbout
685 //
686 this.mnuHelpAbout.Index = 0;
687 this.mnuHelpAbout.Text = "&About";
688 this.mnuHelpAbout.Click += new System.EventHandler(this.mnuHelpAbout_Click);
689 //
[1474]690 // mnuViewBrokerLog
691 //
692 this.mnuViewBrokerLog.Index = 1;
693 this.mnuViewBrokerLog.Text = "&View Broker Log";
694 this.mnuViewBrokerLog.Click += new System.EventHandler(this.mnuViewBrokerLog_Click);
695 //
[614]696 // mnuTest
697 //
698 this.mnuTest.Enabled = false;
699 this.mnuTest.Index = 4;
700 this.mnuTest.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
701 this.mnuTest1});
702 this.mnuTest.Text = "&Test";
703 this.mnuTest.Visible = false;
704 //
705 // mnuTest1
706 //
707 this.mnuTest1.Index = 0;
708 this.mnuTest1.Text = "Test1";
709 //
710 // tvSchedules
711 //
712 this.tvSchedules.BackColor = System.Drawing.SystemColors.ControlLight;
[1174]713 this.tvSchedules.ContextMenu = this.ctxResourceTree;
[614]714 this.tvSchedules.Dock = System.Windows.Forms.DockStyle.Left;
715 this.tvSchedules.HotTracking = true;
716 this.tvSchedules.Location = new System.Drawing.Point(0, 0);
717 this.tvSchedules.Name = "tvSchedules";
[1474]718 this.tvSchedules.Size = new System.Drawing.Size(128, 389);
[614]719 this.tvSchedules.Sorted = true;
720 this.tvSchedules.TabIndex = 1;
721 this.tvSchedules.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvSchedules_AfterSelect);
[1106]722 this.tvSchedules.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tvSchedules_NodeMouseClick);
[1027]723 this.tvSchedules.DoubleClick += new System.EventHandler(this.tvSchedules_DoubleClick);
[1106]724 this.tvSchedules.MouseEnter += new System.EventHandler(this.tvSchedules_MouseEnter);
[614]725 //
[1174]726 // ctxResourceTree
[614]727 //
[1174]728 this.ctxResourceTree.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
[614]729 this.ctxOpenSchedule,
730 this.ctxEditAvailability,
731 this.ctxProperties,
[1118]732 this.ctxFindAppt,
733 this.ctxPrintScheduleT0,
734 this.ctxPrintScheduleT1,
735 this.ctxPrintScheduleT3});
[1174]736 this.ctxResourceTree.Popup += new System.EventHandler(this.contextMenu1_Popup);
[614]737 //
738 // ctxOpenSchedule
739 //
740 this.ctxOpenSchedule.DefaultItem = true;
741 this.ctxOpenSchedule.Index = 0;
742 this.ctxOpenSchedule.Text = "&Open Schedule";
743 this.ctxOpenSchedule.Click += new System.EventHandler(this.ctxOpenSchedule_Click);
744 //
745 // ctxEditAvailability
746 //
747 this.ctxEditAvailability.Index = 1;
748 this.ctxEditAvailability.Text = "&Edit Resource Availability";
749 this.ctxEditAvailability.Click += new System.EventHandler(this.ctxEditAvailability_Click);
750 //
751 // ctxProperties
752 //
753 this.ctxProperties.Index = 2;
[1118]754 this.ctxProperties.Text = "P&roperties";
[614]755 this.ctxProperties.Click += new System.EventHandler(this.ctxProperties_Click);
756 //
757 // ctxFindAppt
758 //
759 this.ctxFindAppt.Index = 3;
[1143]760 this.ctxFindAppt.Text = "&Find Empty Slots";
[614]761 this.ctxFindAppt.Click += new System.EventHandler(this.ctxFindAppt_Click);
762 //
[1118]763 // ctxPrintScheduleT0
764 //
765 this.ctxPrintScheduleT0.Index = 4;
766 this.ctxPrintScheduleT0.Text = "Print Clinic Schedule(s) (T+&0)";
767 this.ctxPrintScheduleT0.Click += new System.EventHandler(this.ctxPrintScheduleT0_Click);
768 //
769 // ctxPrintScheduleT1
770 //
771 this.ctxPrintScheduleT1.Index = 5;
772 this.ctxPrintScheduleT1.Text = "Print Clinic Schedule(s) (T+&1)";
773 this.ctxPrintScheduleT1.Click += new System.EventHandler(this.ctxPrintScheduleT1_Click);
774 //
[1124]775 // ctxPrintScheduleT3
776 //
777 this.ctxPrintScheduleT3.Index = 6;
778 this.ctxPrintScheduleT3.Text = "Print Clinic Schedule(s) (T+&3)";
779 this.ctxPrintScheduleT3.Click += new System.EventHandler(this.ctxPrintScheduleT3_Click);
780 //
[614]781 // panelRight
782 //
783 this.panelRight.Controls.Add(this.panelClip);
784 this.panelRight.Dock = System.Windows.Forms.DockStyle.Right;
[1106]785 this.panelRight.Location = new System.Drawing.Point(996, 0);
[614]786 this.panelRight.Name = "panelRight";
[1474]787 this.panelRight.Size = new System.Drawing.Size(128, 389);
[614]788 this.panelRight.TabIndex = 3;
789 this.panelRight.Visible = false;
790 //
791 // panelClip
792 //
793 this.panelClip.Controls.Add(this.lstClip);
794 this.panelClip.Controls.Add(this.label1);
795 this.panelClip.Dock = System.Windows.Forms.DockStyle.Top;
796 this.panelClip.Location = new System.Drawing.Point(0, 0);
797 this.panelClip.Name = "panelClip";
798 this.panelClip.Size = new System.Drawing.Size(128, 448);
799 this.panelClip.TabIndex = 0;
800 //
801 // lstClip
802 //
803 this.lstClip.AllowDrop = true;
804 this.lstClip.ContextMenu = this.ctxApptClipMenu;
805 this.lstClip.DisplayMember = "PatientName";
806 this.lstClip.Dock = System.Windows.Forms.DockStyle.Fill;
807 this.lstClip.Location = new System.Drawing.Point(0, 32);
808 this.lstClip.Name = "lstClip";
[1027]809 this.lstClip.Size = new System.Drawing.Size(128, 416);
[614]810 this.lstClip.TabIndex = 0;
811 this.lstClip.SelectedIndexChanged += new System.EventHandler(this.lstClip_SelectedIndexChanged);
812 this.lstClip.DragDrop += new System.Windows.Forms.DragEventHandler(this.lstClip_DragDrop);
[1027]813 this.lstClip.DragEnter += new System.Windows.Forms.DragEventHandler(this.lstClip_DragEnter);
814 this.lstClip.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lstClip_MouseDown);
[614]815 this.lstClip.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lstClip_MouseMove);
816 //
817 // ctxApptClipMenu
818 //
819 this.ctxApptClipMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
820 this.mnuRemoveClipItem,
821 this.mnuClearClipItems});
822 this.ctxApptClipMenu.Popup += new System.EventHandler(this.ctxApptClipMenu_Popup);
823 //
824 // mnuRemoveClipItem
825 //
826 this.mnuRemoveClipItem.Index = 0;
827 this.mnuRemoveClipItem.Text = "Remove Item";
828 this.mnuRemoveClipItem.Click += new System.EventHandler(this.mnuRemoveClipItem_Click);
829 //
830 // mnuClearClipItems
831 //
832 this.mnuClearClipItems.Index = 1;
833 this.mnuClearClipItems.Text = "Clear All";
834 this.mnuClearClipItems.Click += new System.EventHandler(this.mnuClearClipItems_Click);
835 //
836 // label1
837 //
838 this.label1.Dock = System.Windows.Forms.DockStyle.Top;
839 this.label1.Location = new System.Drawing.Point(0, 0);
840 this.label1.Name = "label1";
841 this.label1.Size = new System.Drawing.Size(128, 32);
842 this.label1.TabIndex = 1;
843 this.label1.Text = "Appointment Clipboard";
844 this.label1.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
845 //
846 // panelTop
847 //
848 this.panelTop.Controls.Add(this.dateTimePicker1);
849 this.panelTop.Controls.Add(this.lblResource);
850 this.panelTop.Dock = System.Windows.Forms.DockStyle.Top;
851 this.panelTop.Location = new System.Drawing.Point(128, 0);
852 this.panelTop.Name = "panelTop";
[1106]853 this.panelTop.Size = new System.Drawing.Size(868, 24);
[614]854 this.panelTop.TabIndex = 6;
855 //
856 // dateTimePicker1
857 //
858 this.dateTimePicker1.Dock = System.Windows.Forms.DockStyle.Right;
859 this.dateTimePicker1.DropDownAlign = System.Windows.Forms.LeftRightAlignment.Right;
[1106]860 this.dateTimePicker1.Location = new System.Drawing.Point(662, 0);
[614]861 this.dateTimePicker1.Name = "dateTimePicker1";
[1097]862 this.dateTimePicker1.Size = new System.Drawing.Size(206, 20);
[614]863 this.dateTimePicker1.TabIndex = 1;
[1066]864 this.dateTimePicker1.CloseUp += new System.EventHandler(this.dateTimePicker1_CloseUp);
865 this.dateTimePicker1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.dateTimePicker1_KeyPress);
866 this.dateTimePicker1.Leave += new System.EventHandler(this.dateTimePicker1_Leave);
[614]867 //
868 // lblResource
869 //
870 this.lblResource.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
871 this.lblResource.ForeColor = System.Drawing.SystemColors.Highlight;
872 this.lblResource.Location = new System.Drawing.Point(8, 5);
873 this.lblResource.Name = "lblResource";
874 this.lblResource.Size = new System.Drawing.Size(456, 19);
875 this.lblResource.TabIndex = 2;
876 //
877 // panelCenter
878 //
879 this.panelCenter.Controls.Add(this.calendarGrid1);
880 this.panelCenter.Dock = System.Windows.Forms.DockStyle.Fill;
881 this.panelCenter.Location = new System.Drawing.Point(136, 24);
882 this.panelCenter.Name = "panelCenter";
[1474]883 this.panelCenter.Size = new System.Drawing.Size(857, 341);
[614]884 this.panelCenter.TabIndex = 7;
885 //
886 // ctxCalendarGrid
887 //
888 this.ctxCalendarGrid.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
889 this.ctxCalGridAdd,
[1174]890 this.ctxCalGridMkRadAppt,
[614]891 this.ctxCalGridEdit,
892 this.ctxCalGridDelete,
[1174]893 this.ctxCalGridCancelRadAppt,
[614]894 this.ctxCalGridCheckIn,
[1118]895 this.ctxCalGridUndoCheckin,
[1174]896 this.ctxCalGridSep1,
[614]897 this.ctxCalGridNoShow,
898 this.ctxCalGridNoShowUndo,
[1174]899 this.ctxCalGridSep2,
[804]900 this.ctxCalGridWalkin,
[1174]901 this.ctxCalGridSep3,
[1110]902 this.ctxCalGridReprintApptSlip});
[614]903 this.ctxCalendarGrid.Popup += new System.EventHandler(this.ctxCalendarGrid_Popup);
904 //
905 // ctxCalGridAdd
906 //
907 this.ctxCalGridAdd.Index = 0;
908 this.ctxCalGridAdd.Text = "Add Appointment";
909 this.ctxCalGridAdd.Click += new System.EventHandler(this.ctxCalGridAdd_Click);
910 //
[1174]911 // ctxCalGridMkRadAppt
912 //
913 this.ctxCalGridMkRadAppt.Index = 1;
914 this.ctxCalGridMkRadAppt.Text = "Make Radiology Appointment";
915 this.ctxCalGridMkRadAppt.Click += new System.EventHandler(this.ctxCalGridMkRadAppt_Click);
916 //
[614]917 // ctxCalGridEdit
918 //
[1174]919 this.ctxCalGridEdit.Index = 2;
[614]920 this.ctxCalGridEdit.Text = "Edit Appointment";
921 this.ctxCalGridEdit.Click += new System.EventHandler(this.ctxCalGridEdit_Click);
922 //
923 // ctxCalGridDelete
924 //
[1174]925 this.ctxCalGridDelete.Index = 3;
[614]926 this.ctxCalGridDelete.Text = "Cancel Appointment";
927 this.ctxCalGridDelete.Click += new System.EventHandler(this.ctxCalGridDelete_Click);
928 //
[1174]929 // ctxCalGridCancelRadAppt
930 //
931 this.ctxCalGridCancelRadAppt.Index = 4;
932 this.ctxCalGridCancelRadAppt.Text = "Cancel Radiology Appointment";
933 this.ctxCalGridCancelRadAppt.Click += new System.EventHandler(this.ctxCalGridCancelRadAppt_Click);
934 //
[614]935 // ctxCalGridCheckIn
936 //
[1174]937 this.ctxCalGridCheckIn.Index = 5;
[614]938 this.ctxCalGridCheckIn.Text = "Check In Patient";
939 this.ctxCalGridCheckIn.Click += new System.EventHandler(this.ctxCalGridCheckIn_Click);
940 //
[1118]941 // ctxCalGridUndoCheckin
942 //
[1174]943 this.ctxCalGridUndoCheckin.Index = 6;
[1118]944 this.ctxCalGridUndoCheckin.Text = "&Undo Check In";
945 this.ctxCalGridUndoCheckin.Click += new System.EventHandler(this.ctxCalGridUndoCheckin_Click);
946 //
[1174]947 // ctxCalGridSep1
[614]948 //
[1174]949 this.ctxCalGridSep1.Index = 7;
950 this.ctxCalGridSep1.Text = "-";
[614]951 //
952 // ctxCalGridNoShow
953 //
[1174]954 this.ctxCalGridNoShow.Index = 8;
[614]955 this.ctxCalGridNoShow.Text = "Mark as No Show";
956 this.ctxCalGridNoShow.Click += new System.EventHandler(this.ctxCalGridNoShow_Click);
957 //
958 // ctxCalGridNoShowUndo
959 //
[1174]960 this.ctxCalGridNoShowUndo.Index = 9;
[614]961 this.ctxCalGridNoShowUndo.Text = "Undo NoShow";
962 this.ctxCalGridNoShowUndo.Click += new System.EventHandler(this.ctxCalGridNoShowUndo_Click);
963 //
[1174]964 // ctxCalGridSep2
[614]965 //
[1174]966 this.ctxCalGridSep2.Index = 10;
967 this.ctxCalGridSep2.Text = "-";
[614]968 //
969 // ctxCalGridWalkin
970 //
[1174]971 this.ctxCalGridWalkin.Index = 11;
[614]972 this.ctxCalGridWalkin.Text = "Create Wal&k-In Appointment";
973 this.ctxCalGridWalkin.Click += new System.EventHandler(this.ctxCalGridWalkin_Click);
974 //
[1174]975 // ctxCalGridSep3
[804]976 //
[1174]977 this.ctxCalGridSep3.Index = 12;
978 this.ctxCalGridSep3.Text = "-";
[804]979 //
[1110]980 // ctxCalGridReprintApptSlip
[821]981 //
[1174]982 this.ctxCalGridReprintApptSlip.Index = 13;
[1110]983 this.ctxCalGridReprintApptSlip.Text = "&Reprint Appointment Slip";
984 this.ctxCalGridReprintApptSlip.Click += new System.EventHandler(this.ctxCalGridReprintApptSlip_Click);
[821]985 //
[614]986 // panelBottom
987 //
988 this.panelBottom.Controls.Add(this.statusBar1);
989 this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
[1474]990 this.panelBottom.Location = new System.Drawing.Point(136, 365);
[614]991 this.panelBottom.Name = "panelBottom";
[1106]992 this.panelBottom.Size = new System.Drawing.Size(857, 24);
[614]993 this.panelBottom.TabIndex = 8;
994 //
995 // statusBar1
996 //
997 this.statusBar1.Dock = System.Windows.Forms.DockStyle.Fill;
998 this.statusBar1.Location = new System.Drawing.Point(0, 0);
999 this.statusBar1.Name = "statusBar1";
[1106]1000 this.statusBar1.Size = new System.Drawing.Size(857, 24);
[614]1001 this.statusBar1.SizingGrip = false;
1002 this.statusBar1.TabIndex = 0;
1003 //
1004 // splitter1
1005 //
1006 this.splitter1.Location = new System.Drawing.Point(128, 24);
1007 this.splitter1.Name = "splitter1";
[1474]1008 this.splitter1.Size = new System.Drawing.Size(8, 365);
[614]1009 this.splitter1.TabIndex = 9;
1010 this.splitter1.TabStop = false;
1011 //
1012 // splitter2
1013 //
1014 this.splitter2.Dock = System.Windows.Forms.DockStyle.Right;
[1106]1015 this.splitter2.Location = new System.Drawing.Point(993, 24);
[614]1016 this.splitter2.Name = "splitter2";
[1474]1017 this.splitter2.Size = new System.Drawing.Size(3, 365);
[614]1018 this.splitter2.TabIndex = 10;
1019 this.splitter2.TabStop = false;
1020 //
[1474]1021 // calendarGrid1
1022 //
1023 this.calendarGrid1.AllowDrop = true;
1024 this.calendarGrid1.Appointments = null;
1025 this.calendarGrid1.ApptDragSource = null;
1026 this.calendarGrid1.AutoScroll = true;
1027 this.calendarGrid1.AutoScrollMinSize = new System.Drawing.Size(600, 1898);
1028 this.calendarGrid1.AvailabilityArray = null;
1029 this.calendarGrid1.BackColor = System.Drawing.SystemColors.Window;
1030 this.calendarGrid1.Columns = 5;
1031 this.calendarGrid1.ContextMenu = this.ctxCalendarGrid;
1032 this.calendarGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
1033 this.calendarGrid1.DrawWalkIns = true;
1034 this.calendarGrid1.GridBackColor = null;
1035 this.calendarGrid1.GridEnter = false;
1036 this.calendarGrid1.Location = new System.Drawing.Point(0, 0);
1037 this.calendarGrid1.Name = "calendarGrid1";
1038 this.calendarGrid1.Resources = ((System.Collections.ArrayList)(resources.GetObject("calendarGrid1.Resources")));
1039 this.calendarGrid1.SelectedAppointment = 0;
1040 this.calendarGrid1.Size = new System.Drawing.Size(857, 341);
1041 this.calendarGrid1.StartDate = new System.DateTime(2003, 1, 27, 0, 0, 0, 0);
1042 this.calendarGrid1.TabIndex = 0;
1043 this.calendarGrid1.TimeScale = 20;
1044 this.calendarGrid1.CGAppointmentChanged += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentChanged);
1045 this.calendarGrid1.CGAppointmentAdded += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentAdded);
1046 this.calendarGrid1.CGSelectionChanged += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGSelectionChangedHandler(this.calendarGrid1_CGSelectionChanged);
1047 this.calendarGrid1.DoubleClick += new System.EventHandler(this.calendarGrid1_DoubleClick);
1048 this.calendarGrid1.MouseEnter += new System.EventHandler(this.calendarGrid1_MouseEnter);
1049 //
[614]1050 // CGView
1051 //
1052 this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
[1474]1053 this.ClientSize = new System.Drawing.Size(1124, 389);
[614]1054 this.Controls.Add(this.panelCenter);
1055 this.Controls.Add(this.panelBottom);
1056 this.Controls.Add(this.splitter2);
1057 this.Controls.Add(this.splitter1);
1058 this.Controls.Add(this.panelTop);
1059 this.Controls.Add(this.panelRight);
1060 this.Controls.Add(this.tvSchedules);
1061 this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
1062 this.Menu = this.mainMenu1;
1063 this.Name = "CGView";
1064 this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
1065 this.Text = "CGView";
1066 this.Activated += new System.EventHandler(this.CGView_Activated);
1067 this.Closing += new System.ComponentModel.CancelEventHandler(this.CGView_Closing);
[1027]1068 this.Load += new System.EventHandler(this.CGView_Load);
1069 this.CursorChanged += new System.EventHandler(this.CGView_CursorChanged);
[614]1070 this.panelRight.ResumeLayout(false);
1071 this.panelClip.ResumeLayout(false);
1072 this.panelTop.ResumeLayout(false);
1073 this.panelCenter.ResumeLayout(false);
1074 this.panelBottom.ResumeLayout(false);
1075 this.ResumeLayout(false);
1076
1077 }
1078 #endregion
1079
1080 #region Fields
1081
1082 private CGDocument m_Document;
1083 private CGDocumentManager m_DocManager;
1084 private int m_nSlots;
1085 private ArrayList m_alSelectedTreeResourceArray = new ArrayList();
1086 private string m_sDocName;
1087 private CGAppointments m_ClipList;
1088 private bool m_bDragDropStart = false;
1089 private Hashtable m_htOverbook;
1090 private Hashtable m_htModifySchedule;
1091 private Hashtable m_htChangeAppts;
1092
1093 #endregion Fields
1094
1095 #region Properties
1096
1097 /// <summary>
1098 /// Access the CalendarGrid associated with this view
1099 /// </summary>
1100 public CalendarGrid CGrid
1101 {
1102 get
1103 {
1104 return this.calendarGrid1;
1105 }
1106 }
1107
1108 /// <summary>
1109 /// Accesses the document associated with this view
1110 /// </summary>
1111 public CGDocument Document
1112 {
1113 get
1114 {
1115 return this.m_Document;
1116 }
1117 set
1118 {
1119 this.m_Document = value;
1120 }
1121 }
1122
1123 public CGDocumentManager DocManager
1124 {
1125 get
1126 {
1127 return m_DocManager;
1128 }
1129 set
1130 {
1131 m_DocManager = value;
1132 }
1133 }
1134
1135 public DateTime StartDate
1136 {
1137 get
1138 {
1139 return this.calendarGrid1.StartDate;
1140 }
1141 set
1142 {
1143 this.calendarGrid1.StartDate = value;
1144 }
1145 }
1146
1147 public CGAppointments Appointments
1148 {
1149 get
1150 {
1151 return this.calendarGrid1.Appointments;
1152 }
1153 set
1154 {
1155 this.calendarGrid1.Appointments = value;
1156 }
1157 }
1158
1159
1160 #endregion
1161
1162 #region AppointmentMenu Handlers
1163
1164 private void mnuAppointment_Popup(object sender, System.EventArgs e)
1165 {
[1174]1166 // our flags
1167 bool _findApptsEnabled = (this.Document.Resources.Count > 0)? true : false ;
1168 bool _addApptsEnabled = AddAppointmentEnabled();
1169 bool _editApptsEnabled = EditAppointmentEnabled();
1170 bool _isRadAppt = IsThisARadiologyResource();
1171 bool _noShowEnabled = NoShowEnabled();
1172 bool _undoCheckinEnabled = UndoCheckinEnabled();
1173 //end flags
[614]1174
[1174]1175 mnuNewAppointment.Enabled = _addApptsEnabled && !_isRadAppt;
1176 mnuWalkIn.Enabled = _addApptsEnabled && !_isRadAppt;
1177 mnuMkRadAppt.Enabled = _isRadAppt && _addApptsEnabled;
[614]1178
[1174]1179 mnuEditAppointment.Enabled = _editApptsEnabled && !_isRadAppt;
1180 mnuDeleteAppointment.Enabled = _editApptsEnabled && !_isRadAppt;
1181 mnuCancelRadAppt.Enabled = _isRadAppt && _editApptsEnabled;
1182 mnuNoShow.Enabled = _noShowEnabled && _editApptsEnabled;
1183 mnuNoShowUndo.Enabled = !_noShowEnabled && _editApptsEnabled;
1184 mnuCheckIn.Enabled = _editApptsEnabled && !_isRadAppt;
1185 mnuUndoCheckin.Enabled = _undoCheckinEnabled && !_isRadAppt;
[614]1186
[1174]1187 mnuFindAppt.Enabled = _findApptsEnabled;
1188 mnuCopyAppointment.Enabled = _editApptsEnabled && !_isRadAppt;
1189 mnuViewPatientAppts.Enabled = true;
1190 mnuReprintApptSlip.Enabled = _editApptsEnabled;
[614]1191 }
1192
1193 private void mnuCheckIn_Click(object sender, System.EventArgs e)
1194 {
1195 AppointmentCheckIn();
1196 }
1197
1198 private void mnuCopyAppointment_Click(object sender, System.EventArgs e)
1199 {
1200 //For each appointment in the grid's selected list,
1201 //add to the clip list
1202 //and add to m_ClipList
1203 try
1204 {
1205 foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
1206 {
[1174]1207 if (m_ClipList.AppointmentTable.Contains((int)a.AppointmentKey))
[614]1208 {
1209 return;
1210 }
1211 m_ClipList.AddAppointment(a);
[1174]1212 lstClip.Items.Add(a);
[614]1213 }
1214 }
1215 catch (Exception ex)
1216 {
1217 string s = ex.Message;
1218 Debug.Write(s);
1219 return;
1220 }
1221 }
1222
1223 private void mnuDeleteAppointment_Click(object sender, System.EventArgs e)
1224 {
1225 AppointmentDelete();
1226 }
1227
1228 private void mnuEditAppointment_Click(object sender, System.EventArgs e)
1229 {
1230 AppointmentEdit();
1231 }
1232
1233 private void mnuNewAppointment_Click(object sender, System.EventArgs e)
1234 {
1235 AppointmentAddNew();
1236 }
1237
1238 private void mnuNoShow_Click(object sender, System.EventArgs e)
1239 {
1240 AppointmentNoShow(true);
1241 }
1242
1243 private void mnuNoShowUndo_Click(object sender, System.EventArgs e)
1244 {
1245 AppointmentNoShow(false);
1246 }
1247
[1118]1248 private void ctxCalGridUndoCheckin_Click(object sender, EventArgs e)
1249 {
1250 AppointmentUndoCheckin();
1251 }
1252
[1174]1253 private void mnuMkRadAppt_Click(object sender, EventArgs e)
1254 {
1255 AppointmentAddNewRadiology();
1256 }
1257
1258 private void mnuCancelRadAppt_Click(object sender, EventArgs e)
1259 {
1260 AppointmentDeleteOneRadiology();
1261 }
1262
1263 private void mnuUndoCheckin_Click(object sender, EventArgs e)
1264 {
1265 AppointmentUndoCheckin();
1266 }
1267
1268 private void mnuReprintApptSlip_Click(object sender, EventArgs e)
1269 {
1270 int apptID = this.CGrid.SelectedAppointment;
1271 if (apptID <= 0) return;
1272
1273 CGAppointment a = (CGAppointment)this.Appointments.AppointmentTable[apptID];
1274
1275 PrintAppointmentSlip(a);
1276 }
1277
[614]1278 #endregion AppointmentMenu Handlers
1279
1280 #region ContextMenu1 Handlers
1281
1282 private void contextMenu1_Popup(object sender, System.EventArgs e)
1283 {
1284 //Enable/disable OpenSchedule and Find Appointment options
1285 bool bEnabled = (m_alSelectedTreeResourceArray.Count > 0)? true : false ;
1286 this.ctxOpenSchedule.Enabled = bEnabled;
1287 this.ctxFindAppt.Enabled = bEnabled;
[1118]1288 this.ctxPrintScheduleT0.Enabled = bEnabled;
1289 this.ctxPrintScheduleT1.Enabled = bEnabled;
1290 this.ctxPrintScheduleT3.Enabled = bEnabled;
[614]1291
1292 //properties not supported now
1293 this.ctxProperties.Enabled = false;
1294 this.ctxProperties.Visible = false;
1295
1296 //Enable/disable Availability menu option
1297 if (m_alSelectedTreeResourceArray.Count != 1)
1298 {
1299 this.ctxEditAvailability.Enabled = false;
1300 return;
1301 }
1302
1303 if (this.DocManager.ScheduleManager == true)
1304 {
1305 ctxEditAvailability.Enabled = true;
1306 return;
1307 }
1308
1309 string sResource = (string) m_alSelectedTreeResourceArray[0];
1310 DataTable dt = this.DocManager.GlobalDataSet.Tables["ResourceUser"];
1311 DataView dv = new DataView(dt, "", "RESOURCENAME ASC", DataViewRowState.OriginalRows);
[1474]1312 string sDuz = CGDocumentManager.Current.RemoteSession.User.Duz;
[614]1313 bool bModSchedule = false;
1314 DataRowView[] drvA = dv.FindRows(sResource);
1315 if (drvA.Length == 0)
1316 {
1317 this.ctxEditAvailability.Enabled = false;
1318 }
1319 else
1320 {
1321 string sModSchedule = "NO";
1322 foreach (DataRowView drv in drvA)
1323 {
1324 if (drv["USERID"].ToString() == sDuz)
1325 {
1326 sModSchedule = drv["MODIFY_SCHEDULE"].ToString();
1327 break;
1328 }
1329 }
1330
1331 bModSchedule = (sModSchedule == "YES")?true:false;
1332 this.ctxEditAvailability.Enabled = bModSchedule;
1333 }
1334 }
1335
1336 private void ctxEditAvailability_Click(object sender, System.EventArgs e)
1337 {
1338 this.EditScheduleAvailability();
1339 }
1340
1341 private void ctxOpenSchedule_Click(object sender, System.EventArgs e)
1342 {
1343 OpenSelectedSchedule(m_alSelectedTreeResourceArray, DateTime.Today);
1344 }
1345
[1118]1346 private void ctxPrintScheduleT0_Click(object sender, EventArgs e)
1347 {
1348 PrintClinicSchedule(DateTime.Today, DateTime.Today);
1349 }
1350
1351 private void ctxPrintScheduleT1_Click(object sender, EventArgs e)
1352 {
1353 PrintClinicSchedule(DateTime.Today.AddDays(1), DateTime.Today.AddDays(1));
1354 }
1355
1356 private void ctxPrintScheduleT3_Click(object sender, EventArgs e)
1357 {
1358 PrintClinicSchedule(DateTime.Today.AddDays(3), DateTime.Today.AddDays(3));
1359 }
1360
[614]1361 private void ctxProperties_Click(object sender, System.EventArgs e)
1362 {
1363 //TODO: Implement Properties dialog
1364 MessageBox.Show("TODO: Implement Properties dialog");
1365 }
1366
1367 private void ctxFindAppt_Click(object sender, System.EventArgs e)
1368 {
1369 FindAvailableAppointment(m_alSelectedTreeResourceArray);
1370 }
1371
1372 #endregion ContextMenu1 Handlers
1373
1374 #region ctxApptClipMenu Handlers
1375
1376 private void mnuClearClipItems_Click(object sender, System.EventArgs e)
1377 {
1378 this.m_ClipList.ClearAllAppointments();
1379 lstClip.Items.Clear();
1380 }
1381
1382 private void mnuRemoveClipItem_Click(object sender, System.EventArgs e)
1383 {
1384 int i = lstClip.SelectedIndex;
1385 CGAppointment a = (CGAppointment) lstClip.SelectedItem;
1386 int nKey = a.AppointmentKey;
1387 if (i > -1)
1388 {
1389 m_ClipList.RemoveAppointment(nKey);
1390 lstClip.Items.RemoveAt(i);
1391 }
1392 }
1393
1394 private void ctxApptClipMenu_Popup(object sender, System.EventArgs e)
1395 {
1396 mnuClearClipItems.Enabled = (m_ClipList.AppointmentTable.Count > 0);
1397 mnuRemoveClipItem.Enabled = (lstClip.SelectedIndex > -1);
1398 }
1399
1400 #endregion ctxApptClipMenu Handlers
1401
1402 #region ctxCalGridMenu Handlers
1403
1404 private void ctxCalendarGrid_Popup(object sender, System.EventArgs e)
1405 {
[1176]1406 // our flags
1407 bool _findApptsEnabled = (this.Document.Resources.Count > 0) ? true : false;
1408 bool _addApptsEnabled = AddAppointmentEnabled();
1409 bool _editApptsEnabled = EditAppointmentEnabled();
1410 bool _isRadAppt = IsThisARadiologyResource();
1411 bool _noShowEnabled = NoShowEnabled();
1412 bool _undoCheckinEnabled = UndoCheckinEnabled();
1413 //end flags
[1174]1414
[1176]1415 if (_isRadAppt)//this is a radiology resource
[1174]1416 {
1417 ctxCalGridAdd.Visible = false;
1418 ctxCalGridDelete.Visible = false;
1419 ctxCalGridEdit.Visible = false;
1420 ctxCalGridCheckIn.Visible = false;
1421 ctxCalGridNoShow.Visible = false;
1422 ctxCalGridNoShowUndo.Visible = false;
1423 ctxCalGridWalkin.Visible = false;
1424 ctxCalGridUndoCheckin.Visible = false;
1425 ctxCalGridSep1.Visible = false;
1426 ctxCalGridSep2.Visible = false;
1427
1428 ctxCalGridMkRadAppt.Visible = true;
1429 ctxCalGridCancelRadAppt.Visible = true;
1430
1431
1432 }
1433
1434 else // this is a normal resource
1435 {
1436 ctxCalGridAdd.Visible = true;
1437 ctxCalGridDelete.Visible = true;
1438 ctxCalGridEdit.Visible = true;
1439 ctxCalGridCheckIn.Visible = true;
1440 ctxCalGridNoShow.Visible = true;
1441 ctxCalGridNoShowUndo.Visible = true;
1442 ctxCalGridWalkin.Visible = true;
1443 ctxCalGridUndoCheckin.Visible = true;
1444 ctxCalGridSep1.Visible = true;
1445 ctxCalGridSep2.Visible = true;
1446
1447 ctxCalGridMkRadAppt.Visible = false;
1448 ctxCalGridCancelRadAppt.Visible = false;
1449 }
[1176]1450
1451 //Toggle availability of make, edit, checkin and delete appointments etc
[614]1452 //based on whether appropriate element is selected.
[1176]1453 ctxCalGridAdd.Enabled = _addApptsEnabled && !_isRadAppt;
1454 ctxCalGridWalkin.Enabled = _addApptsEnabled && !_isRadAppt;
1455 ctxCalGridEdit.Enabled = _editApptsEnabled && !_isRadAppt;;
1456 ctxCalGridDelete.Enabled = _editApptsEnabled && !_isRadAppt;
[1174]1457
[1176]1458 ctxCalGridCheckIn.Enabled = _editApptsEnabled && !_isRadAppt;
1459 ctxCalGridUndoCheckin.Enabled = _undoCheckinEnabled && !_isRadAppt;
1460 ctxCalGridNoShow.Enabled = _noShowEnabled && _editApptsEnabled;
1461 ctxCalGridNoShowUndo.Enabled = !_noShowEnabled && _editApptsEnabled;
1462 ctxCalGridReprintApptSlip.Enabled = _editApptsEnabled;
1463
[1174]1464 //if the rad ones are visible, then these apply
[1176]1465 ctxCalGridMkRadAppt.Enabled = _isRadAppt && _addApptsEnabled;
1466 ctxCalGridCancelRadAppt.Enabled = _isRadAppt && _editApptsEnabled;
[804]1467 }
[614]1468
1469 private void ctxCalGridAdd_Click(object sender, System.EventArgs e)
1470 {
1471 AppointmentAddNew();
1472 }
1473
1474 private void calendarGrid1_DoubleClick(object sender, System.EventArgs e)
1475 {
1476 if (calendarGrid1.SelectedAppointment > 0)
1477 AppointmentEdit();
1478 }
1479
1480 private void ctxCalGridEdit_Click(object sender, System.EventArgs e)
1481 {
1482 AppointmentEdit();
1483 }
1484
1485 private void ctxCalGridDelete_Click(object sender, System.EventArgs e)
1486 {
1487 AppointmentDelete();
1488 }
1489
1490 private void ctxCalGridCheckIn_Click(object sender, System.EventArgs e)
1491 {
1492 AppointmentCheckIn();
1493 }
1494
1495 private void ctxCalGridNoShow_Click(object sender, System.EventArgs e)
1496 {
1497 AppointmentNoShow(true);
1498 }
1499
1500 private void ctxCalGridNoShowUndo_Click(object sender, System.EventArgs e)
1501 {
1502 AppointmentNoShow(false);
1503 }
1504
[1174]1505 private void ctxCalGridMkRadAppt_Click(object sender, EventArgs e)
1506 {
1507 AppointmentAddNewRadiology();
1508 }
1509
1510 private void ctxCalGridCancelRadAppt_Click(object sender, EventArgs e)
1511 {
1512 AppointmentDeleteOneRadiology();
1513 }
1514
[1110]1515 private void ctxCalGridReprintApptSlip_Click(object sender, EventArgs e)
[804]1516 {
[1110]1517 int apptID = this.CGrid.SelectedAppointment;
1518 if (apptID <= 0) return;
1519
1520 CGAppointment a = (CGAppointment) this.Appointments.AppointmentTable[apptID];
[1111]1521
1522 PrintAppointmentSlip(a);
[804]1523 }
1524
[614]1525 #endregion ctxCalGridMenu Handlers
1526
1527 #region Methods
1528
[1174]1529 /// <summary>
1530 /// Decides whether this is a Radiology Resource. Local Helper to decide what menu items to enable/display
1531 /// </summary>
1532 /// <returns></returns>
1533 private bool IsThisARadiologyResource()
1534 {
1535 //I don't like this logic!!! but works for now!
1536 //Note: I use banana peeling model below
1537
1538 //If no cell is selected AND no appointment is selected, then it's false
1539 if (this.calendarGrid1.SelectedRange.Cells.CellCount < 1 && this.calendarGrid1.SelectedAppointment < 1)
1540 return false;
1541
1542 //If an appointment is selected then...
1543 if (this.calendarGrid1.SelectedAppointment > 0)
1544 {
1545 CGAppointment appt = this.Appointments.AppointmentTable[this.calendarGrid1.SelectedAppointment] as CGAppointment;
1546 if (appt == null) return false; //appt doesn't exist; old appointment and grid wasn't refreshed yet
1547 if (appt.RadiologyExamIEN.HasValue && appt.RadiologyExamIEN.Value > 0) return true; //this appointment is a radiology appointment since it has that member
1548 else return false;
1549
1550 }
1551
1552 //Otherwise, we are for sure dealing with a cell.
1553 //We need to determine if the cell resource is mapped to a Radiology Hospital Location.
1554 DateTime dStart;
1555 DateTime dEnd;
1556 string sResource;
1557
1558 // Get resource
1559 bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
1560
1561 // If we fail, return false (but this is not supposed to ever happen)
1562 if (bRet == false)
1563 {
1564 return false;
1565 }
1566
1567 // see if resource is mapped to a Radiology Hospital Location.
1568 return IsThisARadiologyResource(sResource);
1569 }
1570
1571 private bool IsThisARadiologyResource(string sResource)
1572 {
[1474]1573 //smh - change in v 1.7... if the resource is not linked to a PIMS clinic, this method fails.
1574 //This happens if there is just one resource that is not linked, which makes it impossible to
1575 //make any appointments, because this method gets called at any time a menu is opened.
1576 //So we change res.Field<int> to res.Field<int?>
1577
[1174]1578 // see if resource is mapped to a Radiology Hospital Location.
1579 return ( //select all Hospital Locations which are radiology locations
1580 from hl in CGDocumentManager.Current.GlobalDataSet.Tables["HospitalLocation"].AsEnumerable()
1581 where hl.Field<string>("IS_RADIOLOGY_LOCATION") == "1"
1582 //join this to the resources table using the foreign ID (plain jane relational join)
1583 join res in CGDocumentManager.Current.GlobalDataSet.Tables["Resources"].AsEnumerable()
[1474]1584 //on hl.Field<int>("HOSPITAL_LOCATION_ID") equals res.Field<int>("HOSPITAL_LOCATION_ID") //change in 1.7
1585 on hl.Field<int>("HOSPITAL_LOCATION_ID") equals res.Field<int?>("HOSPITAL_LOCATION_ID")
[1174]1586 //then filter this down to the resource that we have
1587 where res.Field<string>("RESOURCE_NAME") == sResource
1588 //if we have any row left, then it is true.
1589 select hl).Any();
1590 }
1591
[614]1592 private bool EditAppointmentEnabled()
1593 {
1594 try
1595 {
1596 //Call here if there is a selected appointment in the grid
1597 if (calendarGrid1.SelectedAppointment < 1)
1598 return false;
1599 CGAppointment appt = (CGAppointment)this.Appointments.AppointmentTable[calendarGrid1.SelectedAppointment];
1600 string sResource = appt.Resource;
1601 return EditAppointmentEnabled(sResource);
1602
1603 }
1604 catch (Exception ex)
1605 {
1606 string sMsg = ex.Message;
1607 return false;
1608 }
1609 }
1610
1611 private bool EditAppointmentEnabled(string sResource)
1612 {
1613
1614 bool bManager = this.DocManager.ScheduleManager;
1615 if (bManager == true)
1616 {
1617 return (true);
1618 }
1619 else
1620 {
1621 bool bModAppts;
1622 bModAppts = (bool)this.m_htChangeAppts[sResource];
1623 return bModAppts;
1624 }
1625 }
1626
1627 private bool AddAppointmentEnabled()
1628 {
[1511]1629 //new in 1.7: If there are no resources in the resource group, just say false.
1630 //otherwise, we end up with being able to add appointments to empty resource groups.
1631 if (this.Document.Resources.Count == 0)
1632 return false;
1633
1634 //No cells selected for appointment. False.
[614]1635 if (this.calendarGrid1.SelectedRange.Cells.CellCount < 1)
1636 return false;
1637
[1511]1638 //If manager, can always make appointment
[614]1639 bool bManager = this.DocManager.ScheduleManager;
1640 if (bManager == true)
1641 {
1642 return (true);
1643 }
[1511]1644 // otherwise, check permissions, then check slots.
[614]1645 else
1646 {
1647 DateTime dStart = DateTime.Today;
1648 DateTime dEnd = DateTime.Today;
1649 string sResource = "";
1650 bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
1651 if (bRet == false)
1652 {
1653 return false;
1654 }
1655 bool bSlotsAvailable;
1656 bool bOverbook;
1657 bool bModSchedule;
1658 bool bModAppts;
1659 bOverbook = (bool)this.m_htOverbook[sResource];
1660 bModSchedule = (bool)this.m_htModifySchedule[sResource];
1661 bModAppts = (bool)this.m_htChangeAppts[sResource];
1662 if (bModAppts == false)
1663 return false;
1664
[1176]1665 CGAvailability resultantAvail;
1666 m_nSlots = m_Document.SlotsAvailable(dStart, dEnd, sResource, this.calendarGrid1.TimeScale, out resultantAvail);
1667
[614]1668 bSlotsAvailable = (this.m_nSlots > 0);
1669 return ((bSlotsAvailable) || (bModSchedule) || (bOverbook));
1670 }
1671 }
1672
[1118]1673 private bool NoShowEnabled()
1674 {
1675 if (calendarGrid1.SelectedAppointment < 1)
1676 return false;
1677 CGAppointment appt = (CGAppointment)this.Appointments.AppointmentTable[calendarGrid1.SelectedAppointment];
1678 return !appt.NoShow;
1679 }
1680
1681 private bool UndoCheckinEnabled()
1682 {
1683 if (calendarGrid1.SelectedAppointment < 1) return false;
1684 CGAppointment appt = (CGAppointment)this.Appointments.AppointmentTable[calendarGrid1.SelectedAppointment];
1685 return appt.CheckInTime.Ticks > 0;
1686 }
1687
[614]1688 /// <summary>
1689 /// Clean up any resources being used.
1690 /// </summary>
1691 protected override void Dispose( bool disposing )
1692 {
1693 if( disposing )
1694 {
1695 if(components != null)
1696 {
1697 components.Dispose();
1698 }
1699 }
1700 base.Dispose( disposing );
1701 }
1702
[1106]1703 void UpdateStatusBar(DateTime dStart, DateTime dEnd, CGAvailability av)
[614]1704 {
[1106]1705 System.Text.StringBuilder sbMsg = new System.Text.StringBuilder(100);
1706 sbMsg.Append(dStart.ToShortTimeString() + " to " + dEnd.ToShortTimeString());
1707 if (av != null && m_nSlots > 0)
[614]1708 {
[1106]1709 sbMsg.Append(String.Format(" has {0} slot(s) available for {1}. ", m_nSlots.ToString(), av.AccessTypeName));
1710 }
[614]1711 else
1712 {
[1106]1713 sbMsg.Append(": No appointment slots available. ");
[614]1714 }
1715
[1106]1716 if (av != null)
1717 {
1718 sbMsg.Append(String.Format("Source Block: {0} to {1} with {2} slot(s) of type {3}",
1719 av.StartTime.ToShortTimeString(),
1720 av.EndTime.ToShortTimeString(),
1721 av.Slots.ToString(),
1722 av.AccessTypeName));
1723
1724 sbMsg.Append(". ");
1725
1726 if (av.Note.Trim().Length > 0) sbMsg.Append("Note: " + av.Note + ".");
1727 }
1728
1729 this.statusBar1.Text = sbMsg.ToString();
[614]1730 }
1731
1732 private void EditScheduleAvailability()
1733 {
1734 CGAVDocument doc = new CGAVDocument();
1735 try
1736 {
1737 //If resource already open, then navigate to its window
1738 CGAVView v =this.DocManager.GetAVViewByResource(m_alSelectedTreeResourceArray);
1739
1740 if (v != null)
1741 {
1742 v.Activate();
1743 }
1744 else
1745 {
1746 //If not already open, get a lock and open it
1747 doc.DocManager = this.DocManager;
1748 for (int j=0; j < m_alSelectedTreeResourceArray.Count; j++)
1749 {
1750 doc.AddResource((string) m_alSelectedTreeResourceArray[j]);
1751 }
1752 doc.DocName = this.m_sDocName;
1753
1754 //Get preferred time scale from resource info
1755
1756 DataTable dt = this.DocManager.GlobalDataSet.Tables["Resources"];
1757 DataView dv = new DataView(dt, "", "RESOURCE_NAME ASC", DataViewRowState.OriginalRows);
1758 int nScale = 60;
1759 int nTest=0;
1760 string sResource;
1761 int nDataRow;
1762 DataRowView drv;
1763 string sResourceID="";
1764 for (int j=0; j < m_alSelectedTreeResourceArray.Count; j++)
1765 {
1766 sResource = (string) m_alSelectedTreeResourceArray[j];
1767 nDataRow = dv.Find(sResource);
1768 Debug.Assert(nDataRow != -1);
1769 drv = dv[nDataRow];
1770 if (drv["TIMESCALE"].ToString() == "")
1771 {
1772 nTest = 15; //15 minute default
1773 }
1774 else
1775 {
1776 nTest = (int) drv["TIMESCALE"];
1777 }
1778 nScale = (nTest < nScale)?nTest : nScale ;
1779 sResourceID = drv["RESOURCEID"].ToString();
1780 }
1781
1782 doc.ResourceID = Convert.ToInt32(sResourceID);
1783
[1474]1784 bool bLock = CGDocumentManager.Current.RemoteSession.Lock("^BSDXRES(" + sResourceID + ")", "+");
[614]1785 if (bLock == false)
1786 {
1787 throw new BMXNetException("Another user is currently editing availability for this resource. Try later.");
1788 }
1789
1790 doc.OnOpenDocument();
1791 v =this.DocManager.GetAVViewByResource(m_alSelectedTreeResourceArray);
1792 CalendarGrid cg = v.CGrid;
1793
1794 cg.TimeScale = nScale;
1795
1796 //Position grid to 0700
[1069]1797 cg.PositionGrid(7);
[614]1798 }
1799 }
1800 catch (Exception ex)
1801 {
[620]1802 MessageBox.Show("Unable to edit availability for " + m_sDocName + " schedule. " + ex.Message, "Clinical Scheduling");
[614]1803 this.m_DocManager.CloseAllViews(doc);
1804 return;
1805 }
1806 }
1807
[1070]1808 /// <summary>
1809 /// Opens a view of the Schedule a user requested to open at a specific date
1810 /// </summary>
1811 /// <param name="sSelectedTreeResourceArray">A set of resources to open (?pending more investigation)</param>
1812 /// <param name="dDate">Date at which to show the Grid</param>
[614]1813 private void OpenSelectedSchedule(ArrayList sSelectedTreeResourceArray, DateTime dDate)
1814 {
1815 //If resource already open, then navigate to its window
[1124]1816 CGView v = this.DocManager.GetViewByResource(sSelectedTreeResourceArray);
[614]1817 if (v != null)
1818 {
1819 v.Activate();
1820 v.dateTimePicker1.Value = dDate;
[1106]1821 v.RequestRefreshGrid();
[1070]1822 return;
[614]1823 }
[1070]1824
[1073]1825 //So if it is not a view that's already open, it means we have to grab the data for
1826 //So we tell the user to wait wait wait
1827 this.Cursor = Cursors.WaitCursor;
1828 this.LoadSplash(); //Open "Loading" splash
1829
1830
1831 //If this Document has no resources then use it (happens when the GUI has nothing open, typically after log-in)
[1070]1832 //Else, create a new document
1833 CGDocument doc;
1834 if (this.Document.m_sResourcesArray.Count == 0)
1835 {
1836 doc = this.Document;
1837 }
[614]1838 else
1839 {
[1070]1840 doc = new CGDocument();
1841 doc.DocManager = this.DocManager;
1842 }
[1066]1843
[1070]1844 //Add resources to Document
1845 for (int j=0; j < sSelectedTreeResourceArray.Count; j++)
1846 {
1847 doc.AddResource((string) sSelectedTreeResourceArray[j]);
1848 }
1849
1850 doc.DocName = this.m_sDocName;
[1066]1851
[1070]1852 try
1853 {
[1124]1854 doc.OnOpenDocument(dDate); //this typically creates a new view
[1070]1855 }
[1066]1856
[1070]1857 catch (Exception ex)
1858 {
1859 MessageBox.Show("Unable to open " + m_sDocName + " schedule. " + ex.Message, "Clinical Scheduling");
1860 this.m_DocManager.CloseAllViews(doc);
1861 return;
1862 }
1863
[1124]1864 //We are doing this--again--to fetch the view we just opened in OnOpenDocument
1865 //XXX: Yes, I know, this totally sucks. But I don't fully grasp the whole thing yet to refactor it.
[1070]1866 v =this.DocManager.GetViewByResource(sSelectedTreeResourceArray);
[1071]1867
[1073]1868 //Position the Grid to start at a certain day.
[1071]1869 //XXX: This must be a better way to do this.
1870 v.dateTimePicker1.Value = dDate;
1871 v.StartDate = doc.StartDate;
[1070]1872
1873 //Get preferred time scale from resource info
1874 //If more than one resource, get smallest time scale
1875 CalendarGrid cg = v.CGrid;
1876 DataTable dt = this.DocManager.GlobalDataSet.Tables["Resources"];
1877 DataView dv = new DataView(dt, "", "RESOURCE_NAME ASC", DataViewRowState.OriginalRows);
1878 int nScale = 60;
1879 int nTest=0;
1880 string sResource;
1881 int nDataRow;
1882 DataRowView drv;
1883 for (int j=0; j < sSelectedTreeResourceArray.Count; j++)
1884 {
1885 sResource = (string) sSelectedTreeResourceArray[j];
1886 nDataRow = dv.Find(sResource);
1887 Debug.Assert(nDataRow != -1);
1888 drv = dv[nDataRow];
1889 if (drv["TIMESCALE"].ToString() == "")
[614]1890 {
[1070]1891 nTest = 15; //15 minute default
[614]1892 }
[1070]1893 else
[614]1894 {
[1070]1895 nTest = (int) drv["TIMESCALE"];
[614]1896 }
[1070]1897 nScale = (nTest < nScale)?nTest : nScale ;
1898 }
[614]1899
[1070]1900 cg.TimeScale = nScale;
[614]1901
[1070]1902 cg.PositionGrid(7);
[614]1903
[1124]1904 //new code for v 1.5 //smh
1905 //Disable entries that would make time scale smaller b/c users should not be able to
1906 //make appointments for smaller time scales
1907 if (nScale >= 10)
1908 {
1909 v.mnu10Minute.Enabled = true;
1910 v.mnu15Minute.Enabled = true;
1911 v.mnu20Minute.Enabled = true;
1912 v.mnu30Minute.Enabled = true;
1913 }
1914 if (nScale >= 15)
1915 {
1916 v.mnu10Minute.Enabled = false;
1917 v.mnu15Minute.Enabled = true;
1918 v.mnu20Minute.Enabled = true;
1919 v.mnu30Minute.Enabled = true;
1920 }
1921 if (nScale >= 20)
1922 {
1923 v.mnu10Minute.Enabled = false;
1924 v.mnu15Minute.Enabled = false;
1925 v.mnu20Minute.Enabled = true;
1926 v.mnu30Minute.Enabled = true;
1927 }
1928 if (nScale >= 30)
1929 {
1930 v.mnu10Minute.Enabled = false;
1931 v.mnu15Minute.Enabled = false;
1932 v.mnu20Minute.Enabled = false;
1933 v.mnu30Minute.Enabled = true;
1934 }
1935 if (nScale >= 60)
1936 {
1937 v.mnu10Minute.Enabled = false;
1938 v.mnu15Minute.Enabled = false;
1939 v.mnu20Minute.Enabled = false;
1940 v.mnu30Minute.Enabled = false;
1941 }
1942 //end new code
1943
[1070]1944 //Get the OverBook and ModifySchedule permissions from ResourceUser table
1945 //and populate the hashtables
1946 string sOverbook;
1947 string sModSchedule;
1948 string sModAppts;
1949 bool bOverbook;
1950 bool bModSchedule;
1951 bool bModAppts;
1952 v.m_htOverbook = new Hashtable(sSelectedTreeResourceArray.Count);
1953 v.m_htModifySchedule = new Hashtable(sSelectedTreeResourceArray.Count);
1954 v.m_htChangeAppts = new Hashtable(sSelectedTreeResourceArray.Count);
1955 dt = this.DocManager.GlobalDataSet.Tables["ResourceUser"];
1956 dv = new DataView(dt, "", "RESOURCENAME ASC", DataViewRowState.OriginalRows);
[1474]1957 dv.RowFilter = String.Format("USERNAME = '{0}'", CGDocumentManager.Current.RemoteSession.User.Name.Replace("'", "''"));
[1233]1958
[1070]1959 for (int j=0; j < dv.Count; j++)
1960 {
1961 drv = dv[j];
1962 sResource = drv["RESOURCENAME"].ToString();
1963 sOverbook = drv["OVERBOOK"].ToString();
1964 bOverbook = (sOverbook == "YES")?true:false;
1965 sModSchedule = drv["MODIFY_SCHEDULE"].ToString();
1966 bModSchedule = (sModSchedule == "YES")?true:false;
1967 sModAppts = drv["MODIFY_APPOINTMENTS"].ToString();
1968 bModAppts = (sModAppts == "YES")?true:false;
1969 v.m_htOverbook[sResource] = bOverbook;
1970 v.m_htModifySchedule[sResource] = bModSchedule;
1971 v.m_htChangeAppts[sResource] = bModAppts;
1972 }
[614]1973
[1070]1974 //For programmers and scheduling managers, set all permissions for all resources
1975 if (this.DocManager.ScheduleManager == true)
1976 {
1977 dt = this.DocManager.GlobalDataSet.Tables["Resources"];
1978 foreach (DataRow dr in dt.Rows)
[614]1979 {
[1070]1980 sResource = dr["RESOURCE_NAME"].ToString();
1981 v.m_htOverbook[sResource] = true;
1982 v.m_htModifySchedule[sResource] = true;
1983 v.m_htChangeAppts[sResource] = true;
[614]1984 }
[1070]1985 }
[614]1986
[1070]1987 v.calendarGrid1.SetOverlapTable();
1988 v.calendarGrid1.Refresh();
[1073]1989
1990 // Set cursor back and stop splash screen
1991 this.Cursor = Cursors.Default;
1992 StopSplash();
[614]1993 }
1994
1995 private void LoadTree()
1996 {
1997 //Navigate from ResourceGroup table to Resources table
1998 DataRow[] arrRows;
1999 DataRelation dr = DocManager.GlobalDataSet.Relations["GroupResource"];
2000 string sGroup;
2001 string sResource;
2002 int nIndex = 0;
2003 foreach (DataRow r in DocManager.GlobalDataSet.Tables["ResourceGroup"].Rows)
2004 {
2005 sGroup = r["RESOURCE_GROUP"].ToString();
2006 TreeNode deptNode = new TreeNode(sGroup);
2007 nIndex = this.tvSchedules.Nodes.Add(deptNode);
2008 tvSchedules.Nodes[nIndex].Tag = "Dept";
2009 arrRows = r.GetChildRows(dr);
2010 for (int i=0; i< arrRows.Length; i++)
2011 {
2012 sResource = arrRows[i]["RESOURCE_NAME"].ToString();
2013 TreeNode resNode = new TreeNode(sResource);
2014 int nResIndex = deptNode.Nodes.Add(resNode);
2015 deptNode.Nodes[nResIndex].Tag = "Resource";
2016 }
2017 }
2018 }
2019
2020 public void CreateNewSchedule()
2021 {
2022 //Create a new document and open it
2023 CGDocument doc = new CGDocument();
2024 doc.DocManager = this.DocManager;
2025 try
2026 {
[1106]2027 doc.OnOpenDocument(DateTime.Today);
[614]2028 }
2029 catch (Exception ex)
2030 {
[620]2031 MessageBox.Show("Unable to open " + m_sDocName + " schedule. " + ex.Message, "Clinical Scheduling");
[614]2032 this.m_DocManager.CloseAllViews(doc);
2033 return;
2034 }
2035 }
2036
2037 private void AppointmentEdit()
2038 {
2039 try
2040 {
2041 int nApptID = this.calendarGrid1.SelectedAppointment;
2042 Debug.Assert(nApptID != 0);
2043
2044 CGAppointment a = (CGAppointment) this.Appointments.AppointmentTable[nApptID];
2045
2046 DAppointPage dAppt = new DAppointPage();
2047 dAppt.DocManager = this.m_DocManager;
2048 dAppt.InitializePage(a);
2049
2050 calendarGrid1.CGToolTip.Active = false;
2051
2052 if (dAppt.ShowDialog(this) == DialogResult.Cancel)
2053 {
2054 calendarGrid1.CGToolTip.Active = true;
2055 return;
2056 }
2057 calendarGrid1.CGToolTip.Active = true;
2058
2059 string sNote = dAppt.Note;
2060
2061 //Call Document to edit appointment
2062 this.Document.EditAppointment(a, sNote);
2063
[1143]2064 if (dAppt.PrintAppointmentSlip)
2065 {
2066 PrintAppointmentSlip(a);
2067 }
2068
2069 //Redraw appointments
2070 this.UpdateArrays();
2071
2072 //Then tell RPMS that we are updated
2073 RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
[614]2074 }
2075 catch (Exception ex)
2076 {
2077 Debug.Write("CGView.AppointmentEdit Failed: " + ex.Message);
2078 }
2079 }
2080
2081 /// <summary>
[1118]2082 /// Marks all selected appointments as No Show from this.calendarGrid1.SelectedAppointments
[614]2083 /// </summary>
[1118]2084 /// <param name="bNoShow">True - Mark as noshow; False - undo noshow</param>
[614]2085 private void AppointmentNoShow(bool bNoShow)
2086 {
2087
2088 //bNoShow indicates whether to mark or un-mark as noshow
2089 bool bMarked = false; //Indicates at least one attempt to mark as noshow succeeded
2090 bool bRebook = false; //Stores user's response to auto-rebook dialog question
[1118]2091 CGAppointments alRebookList = new CGAppointments(); // list of appointments to rebook
2092
2093 DNoShow dlg = new DNoShow(); // no show dialog
2094
2095 if (bNoShow == true) // if noshowing, show the dialog to ask the user
[614]2096 {
2097 if (dlg.ShowDialog(this) == DialogResult.Cancel)
2098 {
2099 return;
2100 }
2101 }
2102
2103 bRebook = dlg.AutoRebook;
2104
2105 foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
2106 {
2107 int nApptID = a.AppointmentKey;
2108 Debug.Assert(nApptID != 0);
2109 try
2110 {
[1118]2111 if ((bNoShow == true) // if no-showing
[614]2112 &&
2113 (a.StartTime.Date > DateTime.Today.Date)
2114 &&
[620]2115 (MessageBox.Show(this, "The appointment for " + a.PatientName + " is in the future. Are you sure you want to No-Show?", "Windows Scheduling", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK))
[614]2116 {
2117 }
[1118]2118 else // otherwise, make or undo show
[614]2119 {
[1118]2120 string sError = Document.AppointmentNoShow(a, bNoShow);
[614]2121 if (sError != "1")
2122 throw new Exception(sError);
2123
2124 bMarked = true;
2125 }
2126 }
2127 catch (Exception ex)
2128 {
[620]2129 MessageBox.Show("Unable to mark appointment No Show: " + ex.Message, "Clinical Scheduling");
[614]2130 }
[1118]2131
[614]2132 if (bRebook == true)
2133 {
2134 try
2135 {
2136 CGAppointment aRebook;
2137 int nMinimumdays = dlg.RebookStartDays;
2138 int nMaximumdays = dlg.RebookMaxDays;
2139 int nAccessType = dlg.RebookAccessType;
2140 //-1 means use current type
2141
2142 if (nAccessType == -1)
2143 {
2144 //Get access type from grid
2145 int nRow = 0;
2146 int nCol = 0;
2147 CGCell cgCell = new CGCell();
2148 this.calendarGrid1.GetCellFromTime(a.StartTime, ref nRow, ref nCol, true , a.Resource);
2149 cgCell.CellColumn = nCol;
2150 cgCell.CellRow = nRow;
2151 this.calendarGrid1.GetTypeFromCell(cgCell, out nAccessType);
2152 a.AccessTypeID = nAccessType;
2153 }
2154 string sResult = Document.AutoRebook(a, nAccessType, nMinimumdays, nMaximumdays, out aRebook);
2155 if (sResult == "1")
2156 {
2157 //Add appointment to list of rebooked appointments
2158 alRebookList.AddAppointment(a);
2159 }
2160 else
2161 {
2162 MessageBox.Show("Unable to rebook this patient: " + a.PatientName);
2163 }
2164
2165 }
2166 catch (Exception ex)
2167 {
2168 MessageBox.Show("Unable to rebook: " + ex.Message);
2169 }
2170 }
[1118]2171
2172 if (bMarked == true)
2173 {
2174 //Notify other scheduling users that this schedule has changed
2175 try
2176 {
2177 //this.Document.RefreshDocument(); no need for this; event raised back and prompts refresh itself.
2178 RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
2179 }
2180 catch (Exception ex)
2181 {
2182 Debug.Write(ex.Message);
2183 }
2184 this.calendarGrid1.Invalidate();
2185 }
2186 }
2187 AutoRebookFromList(alRebookList);
[614]2188 }
2189
[1118]2190 /// <summary>
2191 /// Prints Auto Rebook Letters; does nothing else to DB!!!
2192 /// </summary>
2193 /// <param name="alRebookList">List of appointments</param>
[614]2194 private void AutoRebookFromList(CGAppointments alRebookList)
2195 {
2196 //Print AutoRebook letters.
2197 if (alRebookList.AppointmentCount > 0)
2198 {
2199 //build |-delimited list of ApptIDs to pass to BSDX REBOOK LIST
2200 string sApptIDList = "";
2201
2202 System.Collections.ArrayList a = new ArrayList();
2203
2204 foreach (CGAppointment appt in alRebookList.AppointmentTable.Values)
2205 {
2206 string sApptID = appt.AppointmentKey.ToString() + "|";
2207 sApptIDList += sApptID;
2208 if (a.Contains(appt.Resource) == false)
2209 a.Add(appt.Resource);
2210 }
[789]2211
2212 // Print rebooks
[614]2213 string sClinicList = "";
2214 foreach (string sRes in a)
2215 {
2216 sClinicList = sClinicList + sRes + "|";
2217 }
[788]2218 DPatientLetter dpl = new DPatientLetter();
2219 dpl.InitializeFormRebookLetters(this.DocManager, sClinicList, sApptIDList);
[614]2220 dpl.ShowDialog(this);
2221 }
2222 }
2223
2224 /// <summary>
[1174]2225 /// Delete one Radiology Appointment
2226 /// </summary>
2227 private void AppointmentDeleteOneRadiology()
2228 {
2229 Debug.Assert(this.calendarGrid1.SelectedAppointment > 0);
2230
2231 CGAppointment a = this.Appointments.AppointmentTable[this.calendarGrid1.SelectedAppointment] as CGAppointment;
2232
2233 Debug.Assert(a.RadiologyExamIEN.HasValue);
2234
[1186]2235 //Can we cancel the appointment?
2236 bool _canCancel = CGDocumentManager.Current.DAL.CanCancelRadExam(a.RadiologyExamIEN.Value);
2237
2238 if (!_canCancel)
2239 {
[1190]2240 MessageBox.Show(this, "This appointment cannot be cancelled.\nReason:\nThe exam associated with this appointment is active/complete/discontinued.");
[1186]2241 return;
2242 }
2243
2244 //Prior to making expensive db calls, tell the grid nothing is selected anymore so nobody would try to pick it up later
[1174]2245 this.calendarGrid1.SelectedAppointment = 0;
2246
[1176]2247 //Now, Cancel the appointment
2248 this.Document.DeleteAppointment(a.AppointmentKey);
2249
[1174]2250 //Cancel Radiology Exam
2251 CGDocumentManager.Current.DAL.CancelRadiologyExam(a.PatientID, a.RadiologyExamIEN.Value);
2252
2253 //redraw the grid to display new set of appointments after this appt was removed.
2254 this.UpdateArrays();
[1176]2255
[1186]2256 //Tell other instances that this schedule has been updated
[1176]2257 RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
[1174]2258 }
2259
2260 /// <summary>
[614]2261 /// Delete appointment ApptID
2262 /// </summary>
2263 /// <param name="nApptID"></param>
2264 /// <returns></returns>
2265 private string AppointmentDeleteOne(int nApptID)
2266 {
2267 return Document.DeleteAppointment(nApptID);
2268 }
2269
2270 /// <summary>
2271 /// Delete all selected appointments
2272 /// </summary>
[1118]2273 private void AppointmentDelete()
2274 {
2275 calendarGrid1.CGToolTip.Active = false;
2276 CGAppointments alRebookList = new CGAppointments();
[614]2277
[1118]2278 // check to see if any appointment is checked in first
2279 foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
2280 {
2281 if (a.CheckInTime.Ticks > 0)
2282 {
[1159]2283 MessageBox.Show("You must undo the check-in first before removing the appointment.");
[1118]2284 return;
2285 }
2286 }
[614]2287
[1118]2288 DCancelAppt dCancel = new DCancelAppt();
2289 dCancel.InitializePage(this.m_DocManager);
2290 if (dCancel.ShowDialog(this) != DialogResult.OK)
2291 {
2292 calendarGrid1.CGToolTip.Active = true;
2293 return;
2294 }
[614]2295
[1174]2296 //At this point, the appointment will be deleted...
2297 //Remove the Selected Appointment from the grid because we don't anybody to think there's still
2298 //an appointment selected while we are still updating the grid
2299 this.calendarGrid1.SelectedAppointment = 0;
2300
[1118]2301 bool bClinic = dCancel.ClinicCancelled;
2302 int nReason = dCancel.CancelReason;
2303 string sRemarks = dCancel.CancelRemarks;
2304 bool bRebook = dCancel.AutoRebook;
2305 int nRebookStart = dCancel.RebookStartDays;
2306 int nRebookMax = dCancel.RebookMaxDays;
2307 int nRebookAccessType = dCancel.RebookAccessType;
[614]2308
[1118]2309 calendarGrid1.CGToolTip.Active = true;
[614]2310
[1118]2311 foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
2312 {
2313
2314 int nApptID = a.AppointmentKey;
2315 Debug.Assert(nApptID != 0);
2316 try
2317 {
2318 string sError = Document.DeleteAppointment(nApptID, bClinic, nReason, sRemarks);
2319 if (sError != "")
2320 throw new Exception(sError);
[614]2321
[1118]2322 this.UpdateArrays(); //Redraw this calendar grid
[614]2323
[1118]2324 if (bRebook == true)
2325 {
2326 try
2327 {
2328 //TODO: Parameterize or dialogize the minum and maximum rebook days
2329 CGAppointment aRebook;
2330 int nMinimumdays = nRebookStart;
2331 int nMaximumdays = nRebookMax;
2332 string sResult = Document.AutoRebook(a, nRebookAccessType, nMinimumdays, nMaximumdays, out aRebook);
2333 if (sResult == "1")
2334 {
2335 //Add appointment to list of rebooked appointments
2336 alRebookList.AddAppointment(a);
2337 }
[1084]2338
[1118]2339 }
2340 catch (Exception ex)
2341 {
2342 MessageBox.Show("Unable to rebook: " + ex.Message);
2343 }
2344 }
[614]2345
[1118]2346 RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
2347 }
2348 catch (Exception ex)
2349 {
2350 MessageBox.Show("Unable to delete appointment. " + ex.Message, "Clinical Scheduling");
2351 }
[614]2352
[1118]2353
2354 if (alRebookList.AppointmentCount > 0)
2355 {
2356 AutoRebookFromList(alRebookList);
2357 }
2358 }
2359 }
2360
[614]2361 private void AppointmentCheckIn()
2362 {
2363 int nApptID = this.calendarGrid1.SelectedAppointment;
2364 Debug.Assert(nApptID != 0);
2365
[1083]2366 //smh
2367 //CGAppointment a = (CGAppointment) this.Appointments.AppointmentTable[nApptID];
2368 CGAppointment a = (CGAppointment)this.Document.Appointments.AppointmentTable[nApptID];
[614]2369 try
2370 {
2371 bool bAlreadyCheckedIn = false;
2372 if (a.CheckInTime.Ticks > 0)
2373 bAlreadyCheckedIn = true;
2374
2375 if ((bAlreadyCheckedIn == false)
2376 &&
2377 (a.StartTime.Date > DateTime.Today.Date))
2378 {
[620]2379 MessageBox.Show(this, "It is too early to check in " + a.PatientName, "Windows Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]2380 return;
2381 }
[1062]2382
[614]2383 DCheckIn dlgCheckin = new DCheckIn();
[1111]2384 dlgCheckin.InitializePage(a);
[614]2385 calendarGrid1.CGToolTip.Active = false;
2386 if (dlgCheckin.ShowDialog(this) != DialogResult.OK)
2387 {
2388 calendarGrid1.CGToolTip.Active = true;
2389 return;
2390 }
2391 calendarGrid1.CGToolTip.Active = true;
2392
[1112]2393 if (bAlreadyCheckedIn != true)
2394 {
2395 DateTime dtCheckIn = dlgCheckin.CheckInTime;
[614]2396
[1112]2397 //Tell appointment that it is checked in, for proper coloring;
2398 //When you refresh from the DB, it will have this property.
2399 a.CheckInTime = DateTime.Now;
[614]2400
[1112]2401 //Save to Database
2402 this.Document.CheckInAppointment(nApptID, dtCheckIn);
2403 }
[1111]2404
2405 //Get Provider (XXXXXXXX: NOT SAVED TO THE DATABASE RIGHT NOW)
2406 a.Provider = dlgCheckin.Provider;
[1083]2407
[1111]2408 // Print Routing Slip if user checks that box...
[1062]2409 if (dlgCheckin.PrintRouteSlip)
[1111]2410 this.PrintRoutingSlip(a);
[804]2411
[1097]2412 //redraw grid
[614]2413 this.calendarGrid1.Invalidate();
2414 }
2415 catch (Exception ex)
2416 {
[620]2417 MessageBox.Show("Error checking in patient: " + ex.Message, "Clinical Scheduling");
[614]2418 }
2419
2420 }
2421
[1118]2422 private void AppointmentUndoCheckin()
2423 {
2424 Debug.Assert(calendarGrid1.SelectedAppointment > 0);
2425
2426 foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
2427 {
[1127]2428
[1118]2429 string msg; //out var
2430 bool didweSucceed = Document.AppointmentUndoCheckin(a, out msg);
2431
2432 if (!didweSucceed)
2433 {
2434 MessageBox.Show("Error: " + msg);
2435 continue;
2436 }
2437
2438 RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
2439 }
2440
2441 this.UpdateArrays();
2442 }
2443
[614]2444 private void AppointmentAddWalkin()
2445 {
2446 try
2447 {
[1125]2448
[614]2449
2450 //Get Time and Resource from Selected Cell
2451 DateTime dStart = DateTime.Today;
2452 DateTime dEnd = DateTime.Today;
2453 string sResource = "";
2454 bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
2455 if (bRet == false)
2456 return;
2457
2458 TimeSpan tsDuration = dEnd - dStart;
2459 int nDuration = (int) tsDuration.TotalMinutes;
2460 Debug.Assert(nDuration > 0);
2461
2462 /*
2463 * 8-10-05 Added check to prevent walkin from being created
2464 * on a date later than today.
2465 */
2466
2467 if (dStart.Date > DateTime.Today.Date)
2468 {
[620]2469 MessageBox.Show(this, "You cannot create a walk-in appointment for a date in the future.\n Select today's date and try again.", "Windows Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]2470 return;
2471 }
2472
[964]2473 // Added check for making Walk-ins in the past. 9/28/2010
2474 if (dStart.Date < DateTime.Today.Date)
2475 {
2476 var result = MessageBox.Show("Are you sure you want to make a Walk-in in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
2477 if (result == DialogResult.No) return;
2478 }
2479
[614]2480 /*
2481 * 8-10-05 Added overbook prompt for walkin
2482 */
[1083]2483 //SMH: Takes too long to do.
2484 //this.Document.RefreshDocument();
[1106]2485 CGAvailability resultantAvail;
[614]2486
[1106]2487 m_nSlots = m_Document.SlotsAvailable(dStart, dEnd, sResource, this.calendarGrid1.TimeScale, out resultantAvail);
2488
[614]2489 if (m_nSlots < 1)
2490 {
[620]2491 DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time. Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
[614]2492 if (dr != DialogResult.Yes)
2493 {
2494 return;
2495 }
2496 }
2497
2498 //Display a dialog to collect Patient Name
2499 DPatientLookup dPat = new DPatientLookup();
2500 dPat.DocManager = m_DocManager;
2501
2502 int nAccessTypeID = 0;
2503 bRet = calendarGrid1.GetSelectedType(out nAccessTypeID);
2504
2505 if (dPat.ShowDialog(this) == DialogResult.Cancel)
2506 {
2507 return;
2508 }
2509
[1125]2510 CGAppointment appt = new CGAppointment();
[614]2511 appt.PatientID = Convert.ToInt32(dPat.PatientIEN);
2512 appt.PatientName = dPat.PatientName;
2513 appt.StartTime = dStart;
2514 appt.EndTime = dEnd;
2515 appt.Resource = sResource;
2516 appt.HealthRecordNumber = dPat.HealthRecordNumber;
2517
[1125]2518 appt.Patient = new Patient
2519 {
2520 DFN = Convert.ToInt32(dPat.PatientIEN),
2521 ID = dPat.PatientPID,
2522 Name = dPat.PatientName,
2523 HRN = dPat.HealthRecordNumber,
2524 DOB = dPat.PatientDOB
2525 };
2526
[1083]2527 //smh: Takes too long
2528 //this.Document.RefreshDocument();
[614]2529
2530 //Call Document to add a walkin appointment
2531 int nApptID = this.Document.CreateAppointment(appt, true);
2532
2533 //Now check them in.
2534 calendarGrid1.SelectedAppointment = nApptID;
2535 AppointmentCheckIn();
2536
[1125]2537 //Show the new set of appointments by calling UpdateArrays.
[1083]2538 this.UpdateArrays();
2539
[1118]2540 RaiseRPMSEvent("BSDX SCHEDULE", appt.Resource);
[614]2541 }
2542 catch (Exception ex)
2543 {
[1083]2544 string msg;
[1474]2545 if (M.Piece(ex.Message, "~", 1) == "-10") // -10 means that BSDXAPI reported an error.
2546 msg = M.Piece(ex.Message, "~", 4);
[1083]2547 else
2548 msg = ex.Message;
[614]2549
[1083]2550 MessageBox.Show("VISTA says: \r\n" + msg, "Unable to Make Walk-in Appointment");
2551 return;
[614]2552 }
2553 }
2554
2555 private void AppointmentAddNew()
2556 {
2557 try
2558 {
2559 //Get Time and Resource from Selected Cell
2560 DateTime dStart = DateTime.Today;
2561 DateTime dEnd = DateTime.Today;
2562 string sResource = "";
2563 bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
2564 if (bRet == false)
2565 return;
[964]2566
2567 // Added check for making Walk-ins in the past. 9/28/2010
2568 if (dStart.Date < DateTime.Today.Date)
2569 {
2570 var result = MessageBox.Show("Are you sure you want to make an appointment in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
2571 if (result == DialogResult.No) return;
2572 }
2573
[614]2574 //Test dStart for Holiday
2575 DataView dvHoliday = new DataView(this.DocManager.GlobalDataSet.Tables["HOLIDAY"]);
2576 dvHoliday.Sort="DATE ASC";
2577 int nFind = dvHoliday.Find(dStart.Date);
2578 if (nFind > -1)
2579 {
2580 string sHoliday = "";
2581 DataRowView drv = dvHoliday[nFind];
2582 sHoliday = drv["NAME"].ToString();
[620]2583 if (MessageBox.Show(this, dStart.ToShortDateString() + " is a holiday (" + sHoliday + "). Are you sure you want to make this appointment?","Clinical Scheduling", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
[614]2584 return;
2585 }
2586
[1083]2587 //Sam: takes too long. Remove this call; deal with the issue of concurrent appointments another way.
2588 //this.Document.RefreshDocument();
[1106]2589 CGAvailability resultantAvail;
2590 m_nSlots = m_Document.SlotsAvailable(dStart, dEnd, sResource, this.calendarGrid1.TimeScale, out resultantAvail);
[614]2591
2592 if (m_nSlots < 1)
2593 {
[620]2594 DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time. Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
[614]2595 if (dr != DialogResult.Yes)
2596 {
2597 return;
2598 }
2599 }
2600
2601 //Display a dialog to collect Patient Name
2602 DPatientLookup dPat = new DPatientLookup();
2603 dPat.DocManager = m_DocManager;
2604
2605 int nAccessTypeID = 0;
2606 bRet = calendarGrid1.GetSelectedType(out nAccessTypeID);
2607
2608 if (dPat.ShowDialog(this) == DialogResult.Cancel)
2609 {
2610 return;
2611 }
2612
2613 //Call the appointment dialog to collect the appointment info
2614 Debug.Assert(dPat.PatientIEN != "");
2615 DAppointPage dAppt = new DAppointPage();
2616 dAppt.DocManager = this.m_DocManager;
2617 string sNote = "";
[1106]2618 dAppt.InitializePage(dPat.PatientIEN, dStart, dEnd, sResource, sNote, nAccessTypeID);
[614]2619
2620 if (dAppt.ShowDialog(this) == DialogResult.Cancel)
2621 {
2622 return;
2623 }
2624
[1106]2625 CGAppointment appt = dAppt.Appointment;
2626
2627 // old way of making an appointment
2628 /*new CGAppointment();
[614]2629 appt.PatientID = Convert.ToInt32(dPat.PatientIEN);
2630 appt.PatientName = dPat.PatientName;
2631 appt.StartTime = dStart;
2632 appt.EndTime = dEnd;
2633 appt.Resource = sResource;
2634 appt.Note = dAppt.Note;
2635 appt.HealthRecordNumber = dPat.HealthRecordNumber;
2636 appt.AccessTypeID = nAccessTypeID;
[1106]2637 */
[614]2638
[1083]2639 //Call Document to add a new appointment. Document adds appointment to CGAppointments array.
[614]2640 this.Document.CreateAppointment(appt);
[794]2641
[1111]2642
[1106]2643 if (dAppt.PrintAppointmentSlip)
2644 {
[1111]2645 PrintAppointmentSlip(appt);
[1106]2646 }
2647
[1083]2648 //Show the new set of appointments by calling UpdateArrays. Fetches Document's CGAppointments
2649 this.UpdateArrays();
[1118]2650
2651 RaiseRPMSEvent("BSDX SCHEDULE", appt.Resource);
[614]2652 }
2653 catch (Exception ex)
[1083]2654 {
2655 string msg;
[1474]2656 if (M.Piece(ex.Message, "~", 1) == "-10") // -10 means that BSDXAPI reported an error.
2657 msg = M.Piece(ex.Message, "~", 4);
[1083]2658 else
2659 msg = ex.Message;
2660
2661 MessageBox.Show("VISTA says: \r\n" + msg, "Unable to Make Appointment");
[614]2662 return;
[1083]2663 }
[614]2664 }
2665
[1174]2666 /// <summary>
2667 /// Add a new Radiology Appointment to VISTA (ÒÝÊì as my mom calls it)
2668 /// </summary>
2669 private void AppointmentAddNewRadiology()
2670 {
[1176]2671 try
2672 {
2673 DateTime dStart, dEnd; //return vales for below
2674 string sResource; //ditto
2675 int nAccessTypeID = 0; //ditto
[1174]2676
[1176]2677 this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
2678 this.calendarGrid1.GetSelectedType(out nAccessTypeID);
[1174]2679
[1176]2680 Debug.Assert(sResource != null);
2681 Debug.Assert(dStart > DateTime.MinValue);
[1174]2682
[1176]2683 //Get Slots
2684 CGAvailability resultantAvail;
2685 m_nSlots = m_Document.SlotsAvailable(dStart, dEnd, sResource, this.calendarGrid1.TimeScale, out resultantAvail);
[1174]2686
[1176]2687 if (m_nSlots < 1)
2688 {
2689 DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time. Do you want to overbook this appointment?", "Clinical Scheduling", MessageBoxButtons.YesNo);
2690 if (dr != DialogResult.Yes)
2691 {
2692 return;
2693 }
2694 }
[1174]2695
[1176]2696 //Display a dialog to collect Patient Name
2697 DPatientLookup dPat = new DPatientLookup();
2698 dPat.DocManager = m_DocManager;
[1174]2699
[1176]2700 if (dPat.ShowDialog(this) == DialogResult.Cancel)
2701 {
2702 return;
2703 }
[1174]2704
[1176]2705 int DFN = Int32.Parse(dPat.PatientIEN);
2706 // Hospital Location IEN
2707 int hlIEN = (from resource in CGDocumentManager.Current.GlobalDataSet.Tables["Resources"].AsEnumerable()
2708 where resource.Field<string>("RESOURCE_NAME") == sResource
2709 select resource.Field<int>("HOSPITAL_LOCATION_ID")).FirstOrDefault();
[1174]2710
[1176]2711 //Get Radiology Exams from the DB
2712 List<RadiologyExam> _radExams = CGDocumentManager.Current.DAL.GetRadiologyExamsForPatientinHL(DFN, hlIEN);
[1174]2713
[1176]2714 //If none found...
2715 if (!_radExams.Any())
2716 {
2717 MessageBox.Show("Patient does not have any radiology exams to register.");
2718 return;
2719 }
[1174]2720
[1176]2721 //Display a form for the user to select radiology exams.
2722 DRadExamsSelect _radform = new DRadExamsSelect(_radExams);
[1174]2723
[1176]2724 if (_radform.ShowDialog() == DialogResult.Cancel) return;
[1174]2725
[1176]2726 //Get some return values
2727 int _examien = _radform.ExamIEN;
2728 string _procedurename = _radform.ProcedureName;
[1174]2729
[1176]2730 //Now create and save the appointment
2731 CGAppointment appt = new CGAppointment();
2732 string _sNote = "Radiology Exam (" + _examien + "): " + _procedurename;
2733 appt.CreateAppointment(dStart, dEnd, _sNote, 0, sResource);
2734 appt.PatientID = Int32.Parse(dPat.PatientIEN);
2735 appt.PatientName = dPat.PatientName;
2736 appt.AccessTypeID = nAccessTypeID;
2737 appt.RadiologyExamIEN = _examien;
2738 appt.Patient = new Patient
2739 {
2740 DFN = Convert.ToInt32(dPat.PatientIEN),
2741 ID = dPat.PatientPID,
2742 Name = dPat.PatientName,
2743 HRN = dPat.HealthRecordNumber,
2744 DOB = dPat.PatientDOB
2745 };
[1174]2746
[1176]2747 this.Document.CreateAppointment(appt);
[1174]2748
[1176]2749 //Save Radiology Exam Schedule Info to Radiology Package
2750 CGDocumentManager.Current.DAL.ScheduleRadiologyExam(DFN, _examien, dStart);
2751
2752 //Print Appointment Slip if requested
2753 if (_radform.PrintAppointmentSlip) this.PrintAppointmentSlip(appt);
2754
2755 //Now redraw the grid to display the new appointments
2756 this.UpdateArrays();
2757
2758 //Raise event to other clients
2759 RaiseRPMSEvent("BSDX SCHEDULE", appt.Resource);
2760 }
2761 catch (Exception ex)
2762 {
2763 string msg;
[1474]2764 if (M.Piece(ex.Message, "~", 1) == "-10") // -10 means that BSDXAPI reported an error.
2765 msg = M.Piece(ex.Message, "~", 4);
[1176]2766 else
2767 msg = ex.Message;
2768
2769 MessageBox.Show("VISTA says: \r\n" + msg, "Unable to Make Appointment");
2770 return;
2771 }
[1174]2772 }
2773
2774
[1073]2775 #region BMX Event Processing and Callbacks
2776 /// <summary>
2777 /// Loosely typed delegate used several times below.
2778 /// </summary>
2779 delegate void OnUpdateScheduleDelegate();
2780
2781 /// <summary>
2782 /// Subscription point for each CGView to process BMX events polled from the server
2783 /// </summary>
2784 /// <param name="obj">Not used</param>
2785 /// <param name="e">BMXEvent Args:
2786 /// e.BMXEvent is free text for Event Type; e.BMXParam is free text for Event Arguments</param>
[1474]2787 private void BMXNetEventHandler(Object obj, RemoteEventArgs e)
[1073]2788 {
2789 try
2790 {
2791 // if this class is undefined (e.g. if the user just closed the form, do nothing
2792 if (this == null) return;
2793
2794 // if event is Autofire event
[1474]2795 if (e.EventType == "BMXNet AutoFire")
[1073]2796 {
2797 Debug.Write("CGView caught AutoFire event.\n");
2798
2799 //Create a delegate to OnUpdateSchedule and call Async
2800 //Once Async Call is done, go to OnUpdateScheduleCallback
2801 OnUpdateScheduleDelegate ousd = new OnUpdateScheduleDelegate(OnUpdateSchedule);
2802 ousd.BeginInvoke(OnUpdateScheduleCallback, null);
2803
2804 return;
2805 }
2806
2807 // if event is BSDX SCHEDULE
[1474]2808 else if (e.EventType == "BSDX SCHEDULE")
[1073]2809 {
2810 //See if any of the resources in the event argument matches BSDX Schedule.
2811 //If yes, fire off the delegate
2812 string sResourceName;
2813 for (int j = 0; j < m_Document.m_sResourcesArray.Count; j++)
2814 {
2815 sResourceName = m_Document.m_sResourcesArray[j].ToString();
[1474]2816 if (e.Details == sResourceName)
[1073]2817 {
2818 Debug.Write("CGView caught BSDX SCHEDULE event.\n");
2819
2820 //Create a delegate to OnUpdateSchedule and call Async
2821 //Once Async Call is done, go to OnUpdateScheduleCallb
2822 OnUpdateScheduleDelegate ousd = new OnUpdateScheduleDelegate(OnUpdateSchedule);
2823 ousd.BeginInvoke(OnUpdateScheduleCallback, null);
2824
2825 break;
2826 }
2827 }
2828 }
2829 }
2830 catch (Exception ex)
2831 {
2832 Debug.Write(ex.Message);
2833 }
2834 }
2835
2836 /// <summary>
2837 /// Update Appointments and Availabilites using Document.RefreshDocumentAsync on a different thread
2838 /// </summary>
2839 /// <remarks>
2840 /// This method is expected to be called asynchornously.
2841 /// </remarks>
[614]2842 public void OnUpdateSchedule()
2843 {
2844 try
2845 {
[1073]2846 m_Document.RefreshDocumentAsync(); //new
[614]2847 }
2848 catch (Exception ex)
2849 {
[620]2850 MessageBox.Show("Unable to refresh document " + ex.Message, "Clinical Scheduling");
[614]2851 }
2852 }
2853
[825]2854 /// <summary>
[1073]2855 /// Callback for when OnUpdateSchedule is done. Triggers the Grid to redraw itself by calling UpdateArrays.
2856 /// </summary>
2857 /// <param name="itfAR">not used</param>
2858 /// <remarks>Calls UpdateArrays via this.Invoke to make sure that the grid is redrawn on the UI thread</remarks>
2859 private void OnUpdateScheduleCallback(IAsyncResult itfAR)
2860 {
2861 OnUpdateScheduleDelegate d = new OnUpdateScheduleDelegate(UpdateArrays);
[1095]2862
2863 //try catch just in case that the view closed in the meantime.
2864 try
2865 {
2866 this.Invoke(d);
2867 }
2868 catch (InvalidOperationException)
2869 {
2870 return;
2871 }
[1073]2872 }
2873
2874 /// <summary>
2875 /// Create a new event in RPMS. Wrapper around BMXConnectInfo.RaiseEvent
2876 /// </summary>
2877 /// <param name="sEvent">Name of Event to Raise</param>
2878 /// <param name="sParams">Parameter of Event to Raise</param>
2879 public void RaiseRPMSEvent(string sEvent, string sParams)
2880 {
2881 try
2882 {
2883 //Signal RPMS to raise an event
[1474]2884 CGDocumentManager.Current.RemoteSession.EventServices.TriggerEvent(sEvent, sParams, false);
[1073]2885 }
2886 catch (Exception ex)
2887 {
2888 Debug.Write(ex.Message);
2889 }
2890 }
2891
2892 #endregion
2893
2894 /// <summary>
[825]2895 /// This is how you set how the grid will look
2896 /// </summary>
[614]2897 public void UpdateArrays()
2898 {
[1066]2899 // Make sure that we are called synchronously
[614]2900 Debug.Assert(this.InvokeRequired == false,"CGView.UpdateArrays InvokeRequired");
[821]2901 // This is where you set how the grid will look
[1083]2902
2903 //Create Deep copy of Availability Array
2904 ArrayList availArrayCopy = new ArrayList();
2905 foreach (CGAvailability av in this.m_Document.AvailabilityArray)
2906 availArrayCopy.Add(av);
2907
[614]2908 try
2909 {
[1073]2910 //Tell the grid about Avails, Appts, and Resources.
[1083]2911 this.calendarGrid1.AvailabilityArray = availArrayCopy;
[1073]2912 //Appts are cloned b/c if we tie into the class directly, we shoot off errors when we manipulate it.
[1083]2913 this.calendarGrid1.Appointments = (CGAppointments)this.m_Document.Appointments.Clone();
[614]2914 this.calendarGrid1.Resources = this.m_Document.Resources;
[1073]2915 //Redraw the calendar grid
[821]2916 this.calendarGrid1.OnUpdateArrays(); // this draws the Calendar
[614]2917 this.lblResource.Text = this.m_Document.DocName;
2918 this.calendarGrid1.Invalidate();
2919 }
2920 catch (Exception ex)
2921 {
[620]2922 MessageBox.Show("Unable to update arrays " + ex.Message, "Clinical Scheduling");
[614]2923 }
2924 }
2925
2926 private void SchedulingManagement()
2927 {
2928 try
2929 {
[1474]2930 bool bLock = CGDocumentManager.Current.RemoteSession.Lock("^BSDXMGR", "+");
[614]2931 if (bLock == false)
2932 {
2933 throw new Exception("Another user is currently in Scheduling Management. Try later.");
2934 }
2935
2936 DManagement dMgm = new DManagement();
2937 dMgm.InitializeDialog(this.m_DocManager);
2938
2939 if (dMgm.ShowDialog(this) == DialogResult.Cancel)
2940 {
2941 }
2942
2943 m_DocManager.GlobalDataSet.Tables["ResourceUser"].Clear();
2944 m_DocManager.LoadResourceUserTable(false);
[1474]2945 bLock = CGDocumentManager.Current.RemoteSession.Lock("^BSDXMGR", "-");
[614]2946 }
2947 catch (ApplicationException aex)
2948 {
2949 string sMsg = aex.Message;
2950 MessageBox.Show("Unable to acquire transmit lock. Try later.");
2951 }
2952 catch (Exception ex)
2953 {
[620]2954 MessageBox.Show("Scheduling Management Error: " + ex.Message, "Clinical Scheduling");
[614]2955 }
2956 }
2957
2958 public void UpdateTree()
2959 {
2960 this.tvSchedules.Nodes.Clear();
2961 this.LoadTree();
2962 }
2963
2964 public void ViewPatientAppointments()
2965 {
2966 try
2967 {
2968 //Display a dialog to collect Patient Name
2969 DPatientLookup dPat = new DPatientLookup();
2970 dPat.DocManager = m_DocManager;
2971 if (dPat.ShowDialog(this) == DialogResult.Cancel)
2972 {
2973 return;
2974 }
2975
2976 Debug.Assert(dPat.PatientIEN != "");
2977 int nPatientID = Convert.ToInt32(dPat.PatientIEN);
2978 ViewPatientAppointments(nPatientID);
2979 }
2980 catch (Exception ex)
2981 {
[620]2982 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]2983 }
2984 }
2985
2986 public void ViewPatientAppointments(int PatientID)
2987 {
2988 DPatientApptDisplay dPa = new DPatientApptDisplay();
2989
2990 dPa.InitializeForm(this.DocManager, PatientID);
2991
2992
2993 if (dPa.ShowDialog(this) != DialogResult.Cancel)
2994 {
2995
2996 }
2997
2998 }
2999
3000 private void FindAvailableAppointment(ArrayList alResourceArray)
3001 {
3002 DApptSearch dSearch = new DApptSearch();
3003 dSearch.InitializePage(alResourceArray, this.m_DocManager);
3004 if (dSearch.ShowDialog(this) == DialogResult.Cancel)
3005 return;
3006
[1097]3007 CGAvailability av = dSearch.SelectedAvailability;
3008
[614]3009 ArrayList alResource = new ArrayList();
[1097]3010 alResource.Add(av.ResourceList);
3011 DateTime sDate = av.StartTime;
3012 m_sDocName = av.ResourceList;
[614]3013 OpenSelectedSchedule(alResource, sDate);
3014
3015 }
3016
3017 #endregion Methods
3018
3019 #region Events
3020
[1073]3021 /// <summary>
3022 /// Special import to get the GetActiveWindow method from Win32
3023 /// </summary>
3024 /// <returns>Windows Handle number for Foregreound Active Window</returns>
3025 [DllImport("user32.dll")]
3026 static extern IntPtr GetActiveWindow();
3027
3028 /// <summary>
3029 /// If a mouse enters the grid, check if the grid is on the active form first before stealing the focus
3030 /// </summary>
3031 /// <param name="sender"></param>
3032 /// <param name="e"></param>
3033 private void calendarGrid1_MouseEnter(object sender, EventArgs e)
3034 {
3035 if (GetActiveWindow() == this.Handle)
3036 calendarGrid1.Focus();
3037 }
[1106]3038
3039 /// <summary>
3040 /// If mouse enters the Tree Section, check if the grid is on the active form first before stealing the focus
3041 /// </summary>
3042 /// <param name="sender"></param>
3043 /// <param name="e"></param>
3044 private void tvSchedules_MouseEnter(object sender, EventArgs e)
3045 {
3046 if (GetActiveWindow() == this.Handle)
3047 tvSchedules.Focus();
3048 }
[1073]3049
3050 private void CGView_Load(object sender, System.EventArgs e)
[614]3051 {
3052 Debug.Assert (this.Document != null);
3053
3054 //Register the view
3055 CGDocumentManager.Current.RegisterDocumentView(this.Document, this);
3056
3057 //Load the Group-Resource treeview
3058 LoadTree();
3059
3060 this.SetDesktopLocation(this.DesktopLocation.X + 10, this.DesktopLocation.Y + 10);
[1071]3061
3062 //Show the Form
3063 this.Activate();
[1106]3064
3065 //Set focus on the calendar grid
3066 this.calendarGrid1.Focus();
[614]3067 }
3068
3069 private void mnuOpenSchedule_Click(object sender, System.EventArgs e)
3070 {
3071 CreateNewSchedule();
3072 }
3073
3074 private void mnu1Day_Click(object sender, System.EventArgs e)
3075 {
3076 DateTime dtPicker = dateTimePicker1.Value;
3077 DateTime DayOnly = new DateTime(dtPicker.Year, dtPicker.Month, dtPicker.Day);
3078 this.calendarGrid1.StartDate = DayOnly;
3079 this.calendarGrid1.Columns = 1;
3080 }
3081
3082 private void mnu5Day_Click(object sender, System.EventArgs e)
3083 {
3084 if (this.calendarGrid1.Columns == 1)
3085 {
3086 this.StartDate = this.Document.StartDate;
3087 }
3088
3089 this.calendarGrid1.Columns = 5;
3090 this.Document.m_nColumnCount = 5; // MJL 1/17/2007
[1066]3091 RequestRefreshGrid();
[614]3092 }
3093
3094 private void mnu7Day_Click(object sender, System.EventArgs e)
3095 {
3096 this.calendarGrid1.Columns = 7;
3097 this.Document.m_nColumnCount = 7; // MJL 1/17/2007
[1066]3098 RequestRefreshGrid();
[614]3099 }
3100
3101 private void mnu10Minute_Click(object sender, System.EventArgs e)
3102 {
3103 CalendarGrid cg = this.calendarGrid1;
3104 cg.TimeScale = 10;
[1069]3105 cg.PositionGrid(7);
[614]3106 }
3107
3108 private void mnu15Minute_Click(object sender, System.EventArgs e)
3109 {
3110 CalendarGrid cg = this.calendarGrid1;
3111 cg.TimeScale = 15;
[1069]3112 cg.PositionGrid(7);
[614]3113 }
3114
3115 private void mnu20Minute_Click(object sender, System.EventArgs e)
3116 {
3117 CalendarGrid cg = this.calendarGrid1;
3118 cg.TimeScale = 20;
[1069]3119 cg.PositionGrid(7);
[614]3120 }
3121
3122 private void mnu30Minute_Click(object sender, System.EventArgs e)
3123 {
3124 CalendarGrid cg = this.calendarGrid1;
3125 cg.TimeScale = 30;
[1069]3126 cg.PositionGrid(7);
[614]3127 }
3128
3129 private void mnuViewScheduleTree_Click(object sender, System.EventArgs e)
3130 {
3131 this.mnuViewScheduleTree.Checked = this.tvSchedules.Visible;
3132 this.tvSchedules.Visible = !(this.tvSchedules.Visible);
3133 this.mnuViewScheduleTree.Checked = !(this.mnuViewScheduleTree.Checked);
3134 }
3135
3136
[1106]3137
[614]3138 private void tvSchedules_DoubleClick(object sender, System.EventArgs e)
3139 {
3140 if (m_alSelectedTreeResourceArray == null)
3141 return;
3142 if (m_alSelectedTreeResourceArray.Count < 1)
3143 {
3144 if (this.tvSchedules.SelectedNode.Text != "")
3145 {
3146 SetResourceArrayFromGroup(tvSchedules.SelectedNode.Text);
3147 }
3148 else
3149 {
3150 return;
3151 }
3152 }
3153 OpenSelectedSchedule(m_alSelectedTreeResourceArray, DateTime.Today);
3154 }
3155
3156 //20041109 Added
3157 private void SetResourceArrayFromGroup(string sGroup)
3158 {
3159 //Navigate from ResourceGroup table to Resources table
3160 DataRow[] arrRows;
3161 DataRelation dr = DocManager.GlobalDataSet.Relations["GroupResource"];
3162 DataRow r = DocManager.GlobalDataSet.Tables["ResourceGroup"].Rows.Find(sGroup);
3163 arrRows = r.GetChildRows(dr);
3164 for (int i=0; i< arrRows.Length; i++)
3165 {
3166 string sResource = arrRows[i]["RESOURCE_NAME"].ToString();
3167 m_alSelectedTreeResourceArray.Add(sResource);
3168 }
3169 m_sDocName = sGroup;
3170 }
3171
3172 public void SyncTree()
3173 {
3174
3175 }
3176
[1106]3177
[614]3178 private void tvSchedules_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
[1106]3179 {
[614]3180 m_alSelectedTreeResourceArray = new ArrayList();
3181 string sResource = e.Node.FullPath;
3182 string[] ss = sResource.Split((char) 92);
3183 int l = ss.GetUpperBound(0);
3184
3185 if (l == 0) //a resource group was checked, so get all underying resources
3186 {
3187 SetResourceArrayFromGroup(ss[0]);
3188 }
3189 else
3190 {
3191 sResource = ss[l];
3192 m_alSelectedTreeResourceArray.Add(ss[1]);
3193 }
3194
3195 m_sDocName = ss[l];
3196 return;
3197
3198 }
3199
[1106]3200 /// <summary>
3201 /// Makes sure that the node gets selected no matter where we click.
3202 /// Incidentally, Invokes AfterSelect event.
3203 /// </summary>
3204 /// <param name="sender"></param>
3205 /// <param name="e"></param>
3206 private void tvSchedules_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
3207 {
3208 e.Node.TreeView.SelectedNode = e.Node;
3209 }
3210
[614]3211 private void CGView_Closing(object sender, System.ComponentModel.CancelEventArgs e)
3212 {
3213 try
3214 {
[1474]3215 CGDocumentManager.Current.RemoteSession.EventServices.RpmsEvent -= BMXNetEventHandler;
[614]3216 this.calendarGrid1.CloseGrid();
3217 }
3218 catch (Exception ex)
3219 {
3220 Debug.Write("CGView_Closing exception: " + ex.Message + "\n");
3221 }
3222 }
3223
3224 private void mnuViewRightPanel_Click(object sender, System.EventArgs e)
3225 {
3226 this.mnuViewRightPanel.Checked = this.panelRight.Visible;
3227 this.panelRight.Visible = !(this.panelRight.Visible);
3228 this.mnuViewRightPanel.Checked = !(this.mnuViewRightPanel.Checked);
3229 }
3230
3231
3232 private void calendarGrid1_CGSelectionChanged(object sender, IndianHealthService.ClinicalScheduling.CGSelectionChangedArgs e)
3233 {
[1106]3234 CGAvailability resultantAvail;
3235 m_nSlots = m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, this.calendarGrid1.TimeScale, out resultantAvail);
3236 UpdateStatusBar(e.StartTime, e.EndTime, resultantAvail);
[614]3237 }
3238
[1084]3239 /// <summary>
3240 /// Fired during drag and drop, on the drop action.
3241 /// </summary>
3242 /// <param name="sender"></param>
3243 /// <param name="e"></param>
[614]3244 private void calendarGrid1_CGAppointmentChanged(object sender, IndianHealthService.ClinicalScheduling.CGAppointmentChangedArgs e)
3245 {
3246 try
3247 {
[1174]3248 // added April 13 2011
3249 // Can't edit radiology appointments (Why? b/c it's intimately tied to Radiology Entry of the Hosp Loc)
3250 if (e.Appointment.RadiologyExamIEN.HasValue && e.Appointment.RadiologyExamIEN.Value > 0)
3251 {
3252 MessageBox.Show("You cannot move a radiology appointment.", "Clinical Scheduling");
3253 return;
3254 }
3255
3256 // added May 5 2011
3257 // Can't move an appointment to a radiology resource
3258 if (IsThisARadiologyResource(e.Resource))
3259 {
3260 MessageBox.Show("You cannot move an appointment to a radiology location.", "Clinical Scheduling");
3261 return;
3262 }
3263
[614]3264 if (e.Appointment.CheckInTime.Ticks > 0)
3265 {
[1174]3266 MessageBox.Show("You cannot change the appointment time because the patient has already checked in.", "Clinical Scheduling");
[614]3267 return;
3268 }
3269
[964]3270 // Added check for making Walk-ins/appts in the past. 9/28/2010 //smh
3271 if (e.StartTime < DateTime.Today.Date)
3272 {
3273 var result = MessageBox.Show("Are you sure you want to make an appointment in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
3274 if (result == DialogResult.No) return;
3275 }
3276
[1084]3277 //Can user edit destination resource?
[614]3278 if (EditAppointmentEnabled(e.Resource) == false)
3279 return;
[1084]3280
3281 //Can user edit original schedule?
[614]3282 if (EditAppointmentEnabled(e.Appointment.Resource) == false)
3283 return;
3284
[620]3285 if (MessageBox.Show("Are you sure you want to move this appointment?", "Clinical Scheduling", MessageBoxButtons.YesNo) != DialogResult.Yes)
[614]3286 return;
3287
3288 //20040909 Cherokee Replaced this block with following
3289 // if (m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, out sAccessType, out sAvailabilityMessage) < 1)
3290 // {
3291 // MessageBox.Show("There are no appointment slots available for the selected time.");
3292 // return;
3293 // }
3294 bool bOverbook =false;
3295 if (m_htOverbook.Count > 0)
3296 {
3297 bOverbook = (bool) this.m_htOverbook[e.Resource.ToString()];
3298 }
3299 bool bModSchedule =false;
3300 if (m_htModifySchedule.Count > 0)
3301 {
3302 bModSchedule = (bool) this.m_htModifySchedule[e.Resource.ToString()];
3303 }
[1106]3304 CGAvailability resultantAvail;
3305 bool bSlotsAvailable = (m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, this.calendarGrid1.TimeScale, out resultantAvail) > 0);
[614]3306 if (!((bSlotsAvailable) || (bModSchedule) || (bOverbook) ))
3307 {
3308 MessageBox.Show("There are no appointment slots available for the selected time.");
3309 return;
3310 }
3311
3312 /*
3313 * 7-19-05 Added overbook prompt
3314 */
3315 if (bSlotsAvailable == false)
3316 {
[620]3317 DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time. Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
[614]3318 if (dr != DialogResult.Yes)
3319 {
3320 return;
3321 }
3322 }
3323
[1084]3324 //Create a new appointment using old data for patient demographics and note and new data
3325 //for StartTime, EndTime, Resource, AccessTypeID
3326 CGAppointment appt = new CGAppointment();
3327 appt.PatientID = e.Appointment.PatientID;
3328 appt.PatientName = e.Appointment.PatientName;
3329 appt.StartTime = e.StartTime;
3330 appt.EndTime = e.EndTime;
3331 appt.Resource = e.Resource;
3332 appt.Note = e.Appointment.Note;
3333 appt.HealthRecordNumber = e.Appointment.HealthRecordNumber;
3334 appt.AccessTypeID = e.AccessTypeID;
[1143]3335 appt.Patient = e.Appointment.Patient;
3336
[1084]3337 this.Document.CreateAppointment(appt);
3338
3339 //CGAppointment a = new CGAppointment();
3340 //a.StartTime = e.StartTime;
3341 ////e.Appointment.StartTime = e.StartTime
3342 //a.EndTime = e.EndTime;
3343 ////e.Appointment.EndTime = e.EndTime;
3344 //a.Resource = e.Resource;
3345 ////e.Appointment.Resource = e.Resource;
3346 //a.AccessTypeID = e.AccessTypeID;
3347 ////e.Appointment.AccessTypeID = e.AccessTypeID;
3348 //m_Document.CreateAppointment(a);
[614]3349
[964]3350
3351 string sError = AppointmentDeleteOne(e.Appointment.AppointmentKey);
3352 if (sError != "")
[614]3353 {
3354 MessageBox.Show(sError);
3355 return;
3356 }
3357
3358 }
3359 catch (Exception ex)
3360 {
[620]3361 MessageBox.Show("Unable to change appointment " + ex.Message, "Clinical Scheduling");
[1084]3362 //this.m_DocManager.UpdateViews();
[614]3363 return;
3364 }
3365 finally
3366 {
[1084]3367 this.UpdateArrays();
[614]3368 }
3369 try
3370 {
3371 RaiseRPMSEvent("BSDX SCHEDULE" , e.Resource);
3372 if (e.Resource != e.OldResource)
3373 RaiseRPMSEvent("BSDX SCHEDULE", e.OldResource);
[1084]3374
3375 //That will take too long. Don't do it. Try and see what happens when you come
3376 //this.m_DocManager.UpdateViews(e.Resource, e.OldResource);
[614]3377 }
3378 catch (Exception ex)
3379 {
3380 Debug.Write(ex.Message);
3381 }
3382 }
3383
3384 private void mnuSchedulingManagment_Click(object sender, System.EventArgs e)
3385 {
3386 SchedulingManagement();
3387 }
3388
3389 private void mnuFile_Popup(object sender, System.EventArgs e)
3390 {
3391 this.mnuSchedulingManagment.Enabled = DocManager.ScheduleManager;
3392 }
3393
3394 private void mnuFindAppt_Click(object sender, System.EventArgs e)
3395 {
3396 FindAvailableAppointment(this.Document.Resources);
3397 }
3398
3399 private void mnuRPMSServer_Click(object sender, System.EventArgs e)
3400 {
3401 //Handled by DocumentManager class
3402 }
3403
3404 private void mnuRPMSLogin_Click(object sender, System.EventArgs e)
3405 {
3406 //Handled by DocumentManager class
3407 }
3408
3409 private void CGView_Activated(object sender, System.EventArgs e)
3410 {
3411 calendarGrid1.GridEnter = true;
3412 }
3413
3414 private void mnuHelpAbout_Click(object sender, System.EventArgs e)
3415 {
[620]3416 MessageBox.Show("Clinical Scheduling Version " + Application.ProductVersion, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Information);
[614]3417 }
3418
3419 private void ImplementMsg()
3420 {
[620]3421 MessageBox.Show("Clinical Scheduling", "TODO: Implement this function");
[614]3422 }
3423
3424 private void mnuClose_Click(object sender, System.EventArgs e)
3425 {
3426 DialogResult dr = MessageBox.Show("Are you sure you want to close this schedule?", Application.ProductName, MessageBoxButtons.OKCancel);
3427 if (dr != DialogResult.OK)
3428 return;
3429
3430 this.Close();
3431 }
3432
3433 private void mnuViewPatientAppts_Click(object sender, System.EventArgs e)
3434 {
3435 ViewPatientAppointments();
3436 }
3437
3438 private void lstClip_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
3439 {
3440 bool b = e.Data.GetDataPresent(typeof(CGAppointment));
3441 if (b == true)
3442 {
3443 e.Effect = DragDropEffects.Move;
3444 }
3445 else
3446 {
3447 e.Effect = DragDropEffects.None;
3448 }
3449
3450 }
3451
3452 private void lstClip_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
3453 {
3454 try
3455 {
3456 CGAppointment a = (CGAppointment) e.Data.GetData(typeof(CGAppointment));
3457 if (m_ClipList.AppointmentTable.Contains((int) a.AppointmentKey))
3458 {
3459 return;
3460 }
[1186]3461
3462 if (a.RadiologyExamIEN.HasValue)
3463 {
3464 MessageBox.Show("Cannot move a radiology appointment to the clipboard");
3465 return;
3466 }
3467
[614]3468 m_ClipList.AddAppointment(a);
3469 lstClip.Items.Add(a);
3470 }
3471 catch(Exception ex)
3472 {
3473 Debug.Write(ex.Message);
3474 }
3475
3476 }
3477
3478 private void lstClip_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
3479 {
3480 m_bDragDropStart = false;
3481 }
3482
3483 private void lstClip_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
3484 {
3485 try
3486 {
3487 if ((m_bDragDropStart == false)&&(lstClip.SelectedIndex > -1))
3488 {
3489 CGAppointment a = (CGAppointment) lstClip.Items[lstClip.SelectedIndex];
3490 this.calendarGrid1.ApptDragSource = "list";
3491 DragDropEffects effect = DoDragDrop(a, DragDropEffects.Move);
3492 m_bDragDropStart = true;
3493 }
3494 }
3495 catch (Exception ex)
3496 {
3497 Debug.Write(ex.Message);
3498 }
3499 }
3500
3501 private void calendarGrid1_CGAppointmentAdded(object sender, IndianHealthService.ClinicalScheduling.CGAppointmentChangedArgs e)
3502 {
3503 try
3504 {
3505 bool bSlotsAvailable;
3506 bool bOverbook;
3507 bool bModSchedule;
3508 bool bModAppts;
3509
3510 if (this.EditAppointmentEnabled(e.Appointment.Resource) == false)
3511 return;
3512
3513 bModAppts = (bool) this.m_htChangeAppts[e.Resource.ToString()];
3514 if (bModAppts == false)
3515 return;
3516
[964]3517 // Added check for making Walk-ins/appts in the past. 9/28/2010 //smh
3518 if (e.StartTime < DateTime.Today.Date)
3519 {
3520 var result = MessageBox.Show("Are you sure you want to make an appointment in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
3521 if (result == DialogResult.No) return;
3522 }
3523
3524
[614]3525 bOverbook = (bool) this.m_htOverbook[e.Resource.ToString()];
3526 bModSchedule = (bool) this.m_htModifySchedule[e.Resource.ToString()];
[1106]3527 CGAvailability resultantAvail;
[614]3528
[1106]3529 bSlotsAvailable = (m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, this.calendarGrid1.TimeScale, out resultantAvail) > 0);
3530
[614]3531 if (!((bSlotsAvailable) || (bModSchedule) || (bOverbook) ))
3532 {
3533 MessageBox.Show("There are no appointment slots available for the selected time.");
3534 return;
3535 }
3536
3537 /*
3538 * 7-19-05 Added overbook prompt
3539 */
3540 if (bSlotsAvailable == false)
3541 {
[620]3542 DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time. Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
[614]3543 if (dr != DialogResult.Yes)
3544 {
3545 return;
3546 }
3547 }
3548
3549 e.Appointment.StartTime = e.StartTime;
3550 e.Appointment.EndTime = e.EndTime;
3551 e.Appointment.Resource = e.Resource;
3552 e.Appointment.AccessTypeID = e.AccessTypeID;
3553 m_Document.CreateAppointment(e.Appointment);
3554 }
3555 catch (Exception ex)
3556 {
[620]3557 MessageBox.Show("Unable to add new appointment " + ex.Message, "Clinical Scheduling");
[614]3558 return;
3559 }
3560 try
3561 {
3562 RaiseRPMSEvent("BSDX SCHEDULE" , e.Resource);
3563 if (e.Resource != e.OldResource)
3564 RaiseRPMSEvent("BSDX SCHEDULE", e.OldResource);
3565 this.m_DocManager.UpdateViews(e.Resource, e.OldResource);
3566 }
3567 catch (Exception ex)
3568 {
3569 Debug.Write(ex.Message);
3570 }
3571 }
3572
3573 private void lstClip_SelectedIndexChanged(object sender, System.EventArgs e)
3574 {
3575
3576 }
3577
3578 private void mnuPrintClinicSchedules_Click(object sender, System.EventArgs e)
3579 {
3580 try
3581 {
3582 DSelectLetterClinics ds = new DSelectLetterClinics();
3583 ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Clinic Schedules");
3584 ds.SetupForReports();
3585 if (ds.ShowDialog(this) != DialogResult.OK)
3586 return;
3587
3588 //get the resource names and call the letter printer
3589
3590 string sClinics = ds.SelectedClinics;
3591 DateTime dtBegin = ds.BeginDate;
3592 DateTime dtEnd = ds.EndDate;
3593
3594 DPatientLetter dpl = new DPatientLetter();
3595 dpl.InitializeFormClinicSchedule(this.DocManager, sClinics, dtBegin, dtEnd);
3596 dpl.ShowDialog(this);
3597
3598 }
3599 catch(Exception ex)
3600 {
[620]3601 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]3602 }
3603 }
3604
[788]3605 private void mnuPrintReminderLetters_Click(object sender, System.EventArgs e)
[614]3606 {
3607 try
3608 {
3609 DSelectLetterClinics ds = new DSelectLetterClinics();
3610 ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Reminder Letters");
3611 if (ds.ShowDialog(this) != DialogResult.OK)
3612 return;
3613
3614 //get the resource names and call the letter printer
3615
3616 string sClinics = ds.SelectedClinics;
3617 DateTime dtBegin = ds.BeginDate;
3618 DateTime dtEnd = ds.EndDate;
3619
3620 DPatientLetter dpl = new DPatientLetter();
[788]3621 dpl.InitializeFormPatientReminderLetters(this.DocManager, sClinics, dtBegin, dtEnd);
[614]3622 dpl.ShowDialog(this);
3623
3624 }
3625 catch(Exception ex)
3626 {
[620]3627 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]3628 }
3629
3630 }
3631
3632 private void mnuPrintRebookLetters_Click(object sender, System.EventArgs e)
3633 {
3634 try
3635 {
3636 DSelectLetterClinics ds = new DSelectLetterClinics();
3637 ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Clinic Rebook Letters");
3638 if (ds.ShowDialog(this) != DialogResult.OK)
3639 return;
3640
[788]3641 //Call the letter printer
[614]3642 DPatientLetter dpl = new DPatientLetter();
[788]3643 dpl.InitializeFormRebookLetters(this.DocManager, ds.SelectedClinics, ds.BeginDate, ds.EndDate);
[614]3644 dpl.ShowDialog(this);
3645
3646 }
3647 catch(Exception ex)
3648 {
[620]3649 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]3650 }
3651 }
3652
3653 private void mnuPrintPatientLetter_Click(object sender, System.EventArgs e)
3654 {
[772]3655 ViewPatientAppointments();
[614]3656 }
3657
3658 private void mnuRPMSDivision_Click(object sender, System.EventArgs e)
3659 {
3660 this.DocManager.ChangeDivision(this);
3661 }
3662
3663 private void CGView_CursorChanged(object sender, System.EventArgs e)
3664 {
3665
3666 }
3667
3668 private void mnuDisplayWalkIns_Click(object sender, System.EventArgs e)
3669 {
3670 calendarGrid1.DrawWalkIns = !(calendarGrid1.DrawWalkIns);
3671 mnuDisplayWalkIns.Checked = calendarGrid1.DrawWalkIns;
3672 calendarGrid1.SetOverlapTable();
3673 calendarGrid1.Refresh();
3674 }
3675
3676 private void mnuOpenMultipleSchedules_Click(object sender, System.EventArgs e)
3677 {
3678
3679 try
3680 {
3681 DSelectSchedules ds = new DSelectSchedules();
3682 ds.InitializePage(this.m_DocManager.GlobalDataSet, "Open Multiple Schedules");
3683 if (ds.ShowDialog(this) != DialogResult.OK)
3684 return;
3685
3686 //get the resource names and open schedules
3687
3688 ArrayList sResources = ds.SelectedClinics;
3689 if (ds.SingleWindow == true)
3690 {
3691 m_sDocName = (ds.GroupWindowName == "")?"Multiple Selected Schedules":ds.GroupWindowName;
3692 OpenSelectedSchedule( sResources, DateTime.Today);
3693 }
3694 else
3695 {
3696 foreach (string sResource in sResources)
3697 {
3698 ArrayList alSingle = new ArrayList(1);
3699 alSingle.Add(sResource);
3700 m_sDocName = sResource;
3701 OpenSelectedSchedule( alSingle, DateTime.Today);
3702 }
3703 }
3704 return;
3705
3706 }
3707 catch(Exception ex)
3708 {
[620]3709 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]3710 }
3711
3712 }
3713
3714 private void ctxCalGridWalkin_Click(object sender, System.EventArgs e)
3715 {
3716 AppointmentAddWalkin();
3717 }
3718
3719 private void mnuWalkIn_Click(object sender, System.EventArgs e)
3720 {
3721 AppointmentAddWalkin();
3722 }
3723
3724 private void mnuPrintCancellationLetters_Click(object sender, System.EventArgs e)
3725 {
3726 try
3727 {
3728 DSelectLetterClinics ds = new DSelectLetterClinics();
3729 ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Clinic Cancellation Letters");
3730 if (ds.ShowDialog(this) != DialogResult.OK)
3731 return;
3732
3733 //get the resource names and call the letter printer
3734
3735 string sClinics = ds.SelectedClinics;
3736 DateTime dtBegin = ds.BeginDate;
3737 DateTime dtEnd = ds.EndDate;
3738
3739 DPatientLetter dpl = new DPatientLetter();
3740
[788]3741 dpl.InitializeFormCancellationLetters(this.DocManager, sClinics, dtBegin, dtEnd);
[614]3742 dpl.ShowDialog(this);
3743 }
3744 catch(Exception ex)
3745 {
[620]3746 MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
[614]3747 }
3748 }
3749
[1111]3750 private void PrintRoutingSlip(CGAppointment appt)
[804]3751 {
[1112]3752 //get this appointment's order
3753 //Today's appointments
3754 var todaysAppts = (from lkappts in this.Document.Appointments.AppointmentTable.Values.Cast<CGAppointment>()
[1126]3755 where lkappts.StartTime > appt.StartTime.Date && lkappts.StartTime < appt.StartTime.AddDays(1).Date && lkappts.Resource == appt.Resource
[1112]3756 orderby lkappts.StartTime
3757 select lkappts).ToList();
3758
3759 //Find the order of the appointment
3760 int apptOrder = todaysAppts.FindIndex(eachappt => eachappt.StartTime == appt.StartTime && eachappt.PatientID == appt.PatientID);
3761
3762 //Index is zero based, so add 1
3763 apptOrder++;
3764
3765 //Send that to the routing slip as a parameter
[1111]3766 PrintDocument pd = new PrintDocument() { DocumentName = "Routing Slip for Appt " + appt.AppointmentKey };
[1112]3767 pd.PrintPage += (object s, System.Drawing.Printing.PrintPageEventArgs e) => CGDocumentManager.Current.PrintingObject.PrintRoutingSlip(appt, apptOrder, e);
[1111]3768 pd.Print();
[804]3769 }
3770
[1111]3771 private void PrintAppointmentSlip(CGAppointment appt)
3772 {
3773 PrintDocument pd = new PrintDocument() { DocumentName = "Appointment Slip for Appt " + appt.AppointmentKey }; //Autoinit for DocName
3774 pd.PrintPage += (object s, System.Drawing.Printing.PrintPageEventArgs e) => CGDocumentManager.Current.PrintingObject.PrintAppointmentSlip(appt, e);
3775 pd.Print();
3776 }
3777
[1066]3778
[1083]3779 /// <summary>
3780 /// Update Selection of date if user does not pick a date/time
3781 /// </summary>
3782 /// <param name="sender"></param>
3783 /// <param name="e"></param>
[1066]3784 private void dateTimePicker1_Leave(object sender, EventArgs e)
3785 {
3786 if (this.Document.SelectedDate != dateTimePicker1.Value.Date)
3787 RequestRefreshGrid();
3788 }
[614]3789
[1083]3790 /// <summary>
3791 /// Handle Selection of Date via mouse from datetimepicker dropdown
3792 /// </summary>
3793 /// <param name="sender"></param>
3794 /// <param name="e"></param>
[1066]3795 private void dateTimePicker1_CloseUp(object sender, EventArgs e)
3796 {
3797 if (this.Document.SelectedDate != dateTimePicker1.Value.Date)
3798 RequestRefreshGrid();
3799 }
[614]3800
[1083]3801 /// <summary>
3802 /// Handle Enter and Escape key on dateTimePicker
3803 /// </summary>
3804 /// <param name="sender"></param>
3805 /// <param name="e"></param>
[1066]3806 private void dateTimePicker1_KeyPress(object sender, KeyPressEventArgs e)
3807 {
3808 //if enter key is pressed:
3809 // Tell windows that we are handling this
3810 // Request a Refresh Grid if the date is different
3811 // Set-Focus to Calendar Grid
3812 if (e.KeyChar == (char)Keys.Enter)
3813 {
3814 e.Handled = true;
[614]3815
[1066]3816 if (this.Document.SelectedDate != dateTimePicker1.Value.Date)
3817 RequestRefreshGrid();
3818
3819 this.CGrid.Focus();
3820 }
[614]3821
[1066]3822 //if escape key is pressed:
3823 // Tell windows that we are handling this
3824 // Set-Focus to Calendar Grid
3825 if (e.KeyChar == (char)Keys.Escape)
3826 {
3827 e.Handled = true;
3828 this.CGrid.Focus();
3829 }
3830 }
[804]3831
[1127]3832 private void mnuRefresh_Click(object sender, EventArgs e)
3833 {
3834 ForceRefreshGrid();
3835 }
[804]3836
[1066]3837 #endregion events
3838
[1111]3839 /// <summary>
3840 /// Refresh grid if needed.
3841 /// </summary>
[1066]3842 void RequestRefreshGrid()
3843 {
[1070]3844 DateTime dDate = dateTimePicker1.Value.Date;
3845 // Change Date on Document
[1066]3846 this.Document.SelectedDate = dDate;
[1071]3847
3848 // Do we need to update?
3849 bool isRefreshNeeded = this.Document.IsRefreshNeeded();
3850
[1070]3851 //Splash when loading and change Cursor
[1071]3852 if (isRefreshNeeded)
3853 {
3854 this.Cursor = Cursors.WaitCursor;
3855 LoadSplash();
3856 this.Document.RefreshDocument();
3857 StopSplash();
3858 this.Cursor = Cursors.Default;
3859 }
[1070]3860
[1071]3861
[1066]3862 if (this.Document.Resources.Count == 1)
3863 {
3864 if (this.calendarGrid1.Columns > 1)
3865 {
3866 this.StartDate = this.Document.StartDate;
3867 }
3868 else
3869 {
3870 this.StartDate = this.Document.SelectedDate;
3871 }
3872 }
3873 else
3874 {
3875 this.StartDate = this.Document.SelectedDate;
3876 }
[1070]3877
3878 //Is this needed? -- Yes it is. There is a bug in the drawing code for the calendar
3879 //First time it draws, it draws appointments, but not availability slots
3880 //Second time it draws, it both appointments and availabilites
3881 //XXX: Need to investigate
[1066]3882 this.Document.UpdateAllViews();
3883 }
3884
[1127]3885 /// <summary>
3886 /// This forces a grid refresh.
3887 /// </summary>
3888 void ForceRefreshGrid()
3889 {
3890 if (this.Document.m_sResourcesArray.Count == 0) return;
3891 this.Cursor = Cursors.WaitCursor;
3892 LoadSplash();
[1128]3893 this.Document.RefreshSchedule();
[1127]3894 this.UpdateArrays();
3895 StopSplash();
3896 this.Cursor = Cursors.Default;
3897 }
3898
[1143]3899 //private delegate DialogResult dLoadingSplash(IWin32Window owner);
3900 string _tempStatusBartext;
[1070]3901
3902 /// <summary>
[1143]3903 /// Loads a splash that says "Loading" -- removed it april 13 2010
[1070]3904 /// </summary>
3905 private void LoadSplash()
3906 {
[1143]3907 _tempStatusBartext = this.statusBar1.Text;
3908 this.statusBar1.Text = "Refreshing Schedule...";
3909 //_loadingSplash = new LoadingSplash();
3910 //_loadingSplash.StartPosition = FormStartPosition.CenterScreen; //XXX: Don't like this, but will do for now.
3911 //_loadingSplash.UseWaitCursor = true; // tell user we are working
3912 //_loadingSplash.Show(this);
3913 //Thread threadSplash = new Thread(tstart);
3914 //threadSplash.IsBackground = true;
3915 //threadSplash.Name = "Loading Thread";
3916 //threadSplash.Start(this);
3917
3918 //Thread threadSplash = new Thread(new ThreadStart(() => _loadingSplash.ShowDialog())); // lambda
3919 //threadSplash.IsBackground = true; //expendable thread -- exit even if still running.
3920 //threadSplash.Name = "Loading Thread";
3921 //threadSplash.Start();
[1070]3922 }
3923
3924 private void StopSplash()
3925 {
[1143]3926 this.statusBar1.Text = _tempStatusBartext;
[1070]3927 }
3928
[1106]3929
[1118]3930 private void PrintClinicSchedule(DateTime dStart, DateTime dEnd)
3931 {
3932 DPatientLetter dpl = new DPatientLetter();
[1106]3933
[1118]3934 int[] resourceIENs = (from resource in CGDocumentManager.Current.GlobalDataSet.Tables["Resources"].AsEnumerable()
3935 join resource_name in m_alSelectedTreeResourceArray.Cast<string>() on resource.Field<string>("RESOURCE_NAME") equals resource_name
3936 select resource.Field<int>("RESOURCEID")
3937 ).ToArray<int>();
[1106]3938
[1118]3939 // + | is an oddity in the Mumps code which I haven't investigated yet.
3940 dpl.InitializeFormClinicSchedule(this.DocManager, string.Join("|", resourceIENs) + "|", dStart, dEnd);
3941 dpl.ShowDialog(this);
3942 }
[1106]3943
[1474]3944 private void mnuViewBrokerLog_Click(object sender, EventArgs e)
3945 {
3946 var view = new RPCLoggerView();
3947 view.Show();
3948 }
[1073]3949
[1474]3950
[614]3951 }//End class
3952}
Note: See TracBrowser for help on using the repository browser.